1. 다형성
- 부모클래스 타입의 참조변수로 자식클래스의 인스턴스(객체)를 참조할 수 있음
- 상위타입으로 여러 하위타입의 객체를 사용할 수 있음
- 상속을 이용하여 하나의 매개변수(부모클래스객체)로 여러 종류의 클래스 타입을 다룰 수 있음
Parent p1 = new Child1();
Parent p2 = new Child2();
//부모클래스인 Parent에서 say()메서드가 있는 경우만 가능
p1.say();
p2.say();
자식1
자식2
부모클래스형 참조변수(p1, p2)로 실제 인스턴스 객체인 후손 클래스(Child1, Child2)의 메소드로 처리할 수 있다.
위와 반대로 자식클래스타입의 레퍼런스변수는 부모타입의 객체주소를 받을 수 없다.
Child1 c1 = new Parent(); //불가능
일반적으로 부모클래스가 가진 기능보다 자식이 가진 기능이 많기 때문이다.
참조변수(c1)가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야함
2. 클래스 형변환
클래스 간의 형변환은 반드시 상속관계에 있는 클래스끼리만 가능하다
1) 업 캐스팅 (UpCasting)
: 상속관계에 있는 부모, 자식 클래스 간에 부모타입의 레퍼런스변수가 모든 자식클래스의 객체주소를 받을 수 있다.
즉 하위클래스형이 상위클래스형에 대입될 경우 자식 타입 --> 부모타입으로 바뀌면서 대입된다.
다운캐스팅과 달리 형변환 생략이 가능하다.
Child1 c1 = new Child1();
/*(Parent)c1*/ c1.sayParent();
//업캐스팅 -> 형변환 생략
//자식.부모메소드() 사용가능
자식클래스타입의 레퍼런스변수 -> 부모클래스, 자식클래스 메소드 모두 접근 가능하다!
부모클래스에 접근하는 경우에 위와 같이 생략해도 자동으로 형변환이 된다.
1) 다운 캐스팅 (DownCasting)
: 상위 클래스형을 하위 클래스형에 대입하고자 하는 경우 강제적 , 명시적으로 형변환을 해야된다.
부모타입 --> 자식타입으로 형변환이 될때
Parent p = new Child();
p2.printParent(); //printParent -> Parent클래스의 메소드
((Child)p).sayChild(); //sayChild -> Child1클래스의 메소드
//명시적 형변환 --> ((자식)부모).자식메소드()
3. 배열 - 다형성 적용
지금까지 배열은 같은 자료형의 값들을 묶은 형태로 생성했었다.
Child1타입의 객체배열 arr1과 Child2타입의 객체배열 arr2를 따로 생성하는 것 까지는 알고 있다.
String[] sArr = new String[4];
Child1[] arr1 = new Child1[2];
Child2[] arr2 = new Child2[2];
그렇다면 자식클래스인 Child1과 Child2의 객체를 하나의 배열로 생성하려고 하는 경우 어떻게 해야할까?
Parent[] arr = new Parent[2];
arr[0] = new Child1(1,2,4);
arr[1] = new Child2(2,1,5);
위와 같이 다형성을 적용하여 부모클래스타입으로 객체배열을 생성하여 여러 자식클래스타입의 인스턴스를 한 배열안에서 생성할 수 있다.
arr[0]은 Parent타입의 레퍼런스변수를 가지고, Child1타입의 객체를 참조한다.
arr[1]은 Parent타입의 레퍼런스변수를 가지고, Child2타입의 객체를 참조한다.
따라서 arr[0]은 Parent클래스의 메소드는 명시적형변환없이 사용가능하지만, Child1타입의 메소드는 명시적 형변환을 통해 사용이 가능하다.
((Child1)arr[0]).printChild1(); //실제 참조하고있는 타입으로 형변환
((Child2)arr[1]).printChild2();
4. instanceof
현재 레퍼런스가 실제 어떤 클래스형의 주소를 참조하고 있는지 확인할 때 사용한다.
왼쪽에 있는 변수(객체)의 인스턴스 형이 오른쪽 클래스 자료형인지를 확인한다.
클래스타입이 일치하면 instanceof의 반환 값은 true가 되어서 다운 캐스팅할 수 있다.
if(arr[i] instanceof Child1) { //해당 인덱스에 실제 Child1 타입을 참조하고 있으면 true
((Child1)arr[i]).printChild1(); //자식1 형변환
} else {
((Child2)arr[i]).printChild2(); //자식2 형변환
}
arr[i].print();
출처 및 참고:
0. 코드 : kh정보교육원 강의자료
1. 다형성 정의
https://gptjs409.github.io/java/2019/08/23/polymorphism.html
2. 업캐스팅, 다운캐스팅, instance of : https://velog.io/@ednadev/%EC%9E%90%EB%B0%94-%EB%8B%A4%ED%98%95%EC%84%B1Polymorphism-%EB%8B%A4%EC%9A%B4-%EC%BA%90%EC%8A%A4%ED%8C%85%EA%B3%BC-instance-of
'Java > 정리' 카테고리의 다른 글
[Java] IO(입출력)_스트림 (1) | 2021.06.01 |
---|---|
[Java] API_String관련 클래스 (0) | 2021.05.27 |
[Java] 예외처리_try with resource (0) | 2021.05.25 |
[Java] 예외처리_BufferedReader사용 (0) | 2021.05.25 |
[Java] 상속(Inheritance) (0) | 2021.05.19 |