오늘 다형성에 대한 강의를 듣다가 도저히 이해가 가지 않아서 내 나름대로 코드로 공부를 한 번 해보려고 했다. 직관적으로 알기 쉽게 아래 코드와 같이 부모 클래스는 Parents로 자식 클래스는 Child로 정해서 보기로 했다.
public class Parents {
public void love() {
}
}
public class Child extends Parents{
public void play() {
}
}
※ instaceof 메서드는 해당 레퍼런스 변수가 형변환이 가능한지 여부를 물을 때 사용된다.
Case 1.
- 부모 타입 객체를 부모 클래스 생성자로 인스턴스화한다.
- 인스턴스화 한 객체를 자식 클래스 타입으로 형변환한다.
Parents p1 = new Parents();
// Child c1 = (Child) p1; --> 오류
p1.love(); // 자신의 메서드인 love 가능.
// p1.play(); --> 오류 : 부모는 자식의 메서드를 쓸 수 없다.
System.out.println( "p1은 Child 클래스로 형변환이 가능합니까?" );
System.out.println( p1 instanceof Child ); // false
>>> Case1을 통하여 부모 클래스 타입은 자식 클래스 타입으로 원래는! 형변환 할 수 없다는 사실을 알 수 있다.
Case 2.
- 부모 타입 객체를 자식 클래스 생성자로 인스턴스화한다.
- 인스턴스화 한 객체를 자식 클래스 타입으로 형변환한다.
Parents p2 = new Child();
// 부모클래스 타입은 자식 클래스의 생성자로 생성할 수 있다. 그래도 부모클래스 타입.
Child c2 = (Child) p2;
p2.love();
// p2.play(); -> 오류 : Case 1.과 마찬가지로 부모는 자식의 메서드를 쓸 수 없음.
c2.love();
c2.play();
System.out.println( "p2는 Child 클래스로 형변환이 가능합니까?" );
System.out.println( p2 instanceof Child ); // true
System.out.println( "c2는 Parents 클래스로 형변환이 가능합니까?" );
System.out.println( c2 instanceof Parents ); // true
>>> Case 2를 통하여 부모 클래스 타입은 자식 클래스 타입으로 형변환 할 수 없으나! 인스턴스화할 때 자식 클래스 생성자를 이용하여 생성되면 자식 클래스 타입으로 형변환이 가능함을 알 수 있다.
Case 3.
- 자식 타입 객체를 자식 클래스 생성자로 인스턴스화한다.
- 인스턴스화 한 객체를 부모 클래스 타입으로 형변환한다.
Child c3 = new Child();
Parents p3 = (Parents) c3;
// 자식 클래스 타입은 부모 클래스 타입으로 형변환 활 수 있다.
p3.love();
// p3.play(); // 부모는 자식의 메서드를 쓸 수 없다.
c3.love(); // 자식은 부모클래스 메서드 사용 가능
c3.play(); // 자식클래스 자신의 메서드 당연히 사용 가능
System.out.println( "p3는 Child 클래스로 형변환이 가능합니까?" );
System.out.println( p3 instanceof Child ); // true
System.out.println( "c3는 Parents 클래스로 형변환이 가능합니까?" );
System.out.println( c3 instanceof Parents ); // true
>>> Case 3을 통하여 자식클래스 타입에서 부모클래스 타입으로 한 번 형변환이 된 객체는 다시 자식클래스로 형변환이 가능함을 알 수 있다. 아래처럼 형변환을 시켜도 오류가 나지 않는다.
Child c3_2 = (Child) p3;
c3_2.love();
c3_2.play();
Case 4.
- 자식 타입 객체를 부모 클래스 생성자로 인스턴스화한다. >> 오류가 난다.
Child c4 = new Parents(); // 오류
이렇게까지 직접 예시를 들어가면서 해 보니 객체는 여러가지 다른 형태를 가질 수 있다는 다형성의 의미가 좀 더 쉽게 다가온 것 같다. 여기서 메소드가 여러가지 다른 형태를 띄게 되면 오버라이딩이나 오버로딩으로 보여지는 것이고.
역시 개발은 이렇게 혼자 코드를 직접 해봐야 더 확실히 알 수 있는 것 같다. 오늘도 하나를 배워서 뿌듯!
'STUDY > JAVA' 카테고리의 다른 글
[TIL] 추상클래스와 인터페이스의 차이. (0) | 2023.05.30 |
---|---|
[TIL] 프로그래머스 - 신규 아이디 추천 (0) | 2023.05.28 |
[TIL] 프로그래머스 - 완주하지 못한 선수 (0) | 2023.05.26 |
[TIL] 프로그래머스 - 체육복 (0) | 2023.05.23 |
[TIL] 프로그래머스 - 숫자 짝꿍 (0) | 2023.05.22 |