Please Enable JavaScript!
Gon[ Enable JavaScript ]

[Java] 자바 다형성, 오버라이딩(Overriding), 오버로딩(Overloading)

자바(JAVA)
반응형

[Java] 자바 다형성, 오버라이딩(Overriding), 오버로딩(Overloading)

 

프로그램에서 다형성(폴리모피즘) 은 하나의 클래스나 함수가 다양한 방식으로 동작이 가능한 것을 말합니다. 다형성은 하나의 메시지를 전달했을 때 수신자가 누구냐에 따라 각각 다른 기능을 수행하게 합니다. 부모클래스에서 상속받은 run() 이라는 함수의 내용을 자식이 함수명은 같지만 자식이 다르게 구현할수 있는 것이죠. 이렇게 자바에서 다형성은 다형적 변수, 오버라이딩(Overriding), 오버로딩(Overloading) 이 있습니다.

 

1. Overloading 오버로딩

 

▼ 오버로딩은 같은 함수라도 인수만 다르면 얼마든지 정의하고 사용할수 있습니다. 샘플에서 처럼 cal() 함수는 3가지 종류가 있습니다. 인수로 어떤값을 받아들이냐에 따라 기존에 같은 것이 없다면 계속해서 정의한후 사용이 가능한 것이죠. 

public class Overriding {
	
	public static void main(String[] args) {
		Over ob = new Over();
		ob.cal();
		ob.cal(1,2);
		ob.cal(3);
	}
}

class Over{
    public void cal(){
        System.out.println("인수 없음");
    }
    public void cal(int a, int b){
        System.out.println("인수 "+ a + "와 " + b);
    }
    public void cal(double d){
        System.out.println("인수 " + d);
    }
}

 

2. Overriding 오버라이딩

 

▼ 오버라이딩은 주로 클래스나 인터페이스를 상속받아서 부모 클래스에 있던 함수를 재정의 해서 사용하는 것입니다. 아래 3가지 예에서 2번째 A a2 = new B() B 클래스를 A 클래스 데이터 타입으로 인스턴스화 했습니다. 두 클래스에 함수는 동일한데 A 를 상속받아서 구현한 B 에서 재정의한 것이죠. 그래서 A cal() 함수를 실행하면 B cal() 이 실행되는 것입니다.

 

class A{
    public void cal(){
        System.out.println("부모 A 의 cal() 함수실행");
    }
}

class B extends A{
    public void cal(){
        System.out.println("자식 B 의 cal() 함수 실행");
    }
}

public class Overriding {
	
	public static void main(String[] args) {
		
		A a1 = new A();
		a1.cal();
		
		A a2 = new B();
		a2.cal();
		
		B b = new B();
		b.cal();
	}
}
// 결과
부모 A 의 cal() 함수실행
자식 B 의 cal() 함수 실행
자식 B 의 cal() 함수 실행

 

▼ 주로 이렇게 하는 이유는 하나의 코드로 여러 객체를 처리할수 있기 때문입니다. 아래 샘플처럼 A 를 상속받은 클래스가 B, C 가 있고 cal() 함수를 재정의 했습니다. 객체를 List 에 담아 두었다가 for 문을 돌면서 한번에 cal() 기능을 수행하고 싶은데 객체마다 기능이 조금씩 다릅니다. 그럴때 상속받아서 재정의 한후 부모 클래스의 함수를 호출하면 객체별로 재정의한 함수를 수행할수 있는 것이죠.


import java.util.ArrayList;
import java.util.List;

class A{
    public void cal(){
        System.out.println("부모 A 의 cal() 함수실행");
    }
}

class B extends A{
    public void cal(){
        System.out.println("자식 B 의 cal() 함수 실행");
    }
}

class C extends A{
    public void cal(){
        System.out.println("자식 C 의 cal() 함수 실행");
    }
}

public class Overriding {
	
	public static void main(String[] args) {
	
		List<A> list = new ArrayList<A>();
		list.add(new A());
		list.add(new B());
		list.add(new C());
		
		for (A a : list) {
			a.cal();
		}
	}
}
// 결과
부모 A 의 cal() 함수실행
자식 B 의 cal() 함수 실행
자식 C 의 cal() 함수 실행


반응형
Posted by 녹두장군1
,