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. choe 2015.12.21 15:58  댓글주소  수정/삭제  댓글쓰기

    마지막 예시에서요. for(A a: list)가 뭔가요? for문안에 콜론을 처음봐서요..콜론 연산자 자체가 뭔지 ㅠ 다른 부분들은 정말 도움이 많이 되었는데 이부분을 모른겠네요

    • Favicon of https://mainia.tistory.com 녹두장군 2015.12.22 11:29 신고  댓글주소  수정/삭제

      콜론(:)은 자바 5.0(JDK1.5) 부터 추가된 문법으로 컬렉션에서 반복자를 생성하거나 카운트 변수의 시작과 끝을 계산하지 않고 반복할 수 있습니다. 배열의 일부가 아닌 전체를 참조하고자 할때 아주 유용합니다.

      for(A a: list) 에서 콜론 왼쪽에는 배열의 단일 값이 저장될 변수가 오고 오른쪽에는 배열 객체를 위치시킵니다. 그럼 반복문이 한 번 돌 때마다 a 값에 list 의 값이 반복해서 저장되는 것이죠. 반복은 배열의 인덱스 0 ~ n-1 까지 이루어 집니다.

    • choe 2015.12.24 08:30  댓글주소  수정/삭제

      감사합니다 정말 편한 기능인 것 같네요. 많이 배워 갑니다