Day14-3. 230517
타입변환과 다형성
다형성이란?
같은 타입이지만 실행 결과가 다양한 객체 대입(이용) 가능한 성질
- 부모 타입에는 모든 자식 객체가 대입 가능
-> 효과 : 객체 부품화 가능
자동 타입 변환(Promotion)
- 상속관계에 있는 클래스 간에 프로그램 실행 도중에 자동적으로 타입변환이 일어나는 것
클래스 참조변수 = new 클래스();
부모타입 참조변수 = 자식타입
부모클래스 참조변수 = new 자식 클래스();
- 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생.
- 자식은 부모타입으로 자동 타입 변환 가능
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능
- 그러나 메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출됨.
예제1)
Parent 클래스>
1
2
3
4
5
6
7
8
9
10
|
package Ex;
public class Parent {
public void method1() {
System.out.println("Parent-method1()");
}
public void method2() {
System.out.println("Parent-method2()");
}
}
|
cs |
Parent의 자식 클래스 Child>
1
2
3
4
5
6
7
8
9
10
11
12
|
package Ex;
public class Child extends Parent {
@Override
public void method1() {
System.out.println("Child-method2()");
}
public void method3() {
System.out.println("Child-method3()");
}
}
|
cs |
실행 클래스>
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package Ex;
public class ChildExample {
public static void main(String[] args) {
Child child = new Child();
Parent parent = child; //자동 타입 변환
parent.method1();
parent.method2(); //재정의된 메소드가 호출됨.
//parent.method3(); //호출 불가능
}
}
|
cs |
Child 객체는 method3() 메소드를 가지고 있지만, parent 타입으로 변환되 이후에는 method3() 메소드를 호출할 수 없음.
method2() 메소드는 부모와 자식 모두에게 있기 때문에 재정의되 메소드는 타입 변환 이후에도 자식 메소드가 호출됨.
예제2)
메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package chap0607;
class GrandFather02{
int height = 160;
String name = "홍할";
void sing() {System.out.println("할아버지의 sing()");}
}
class Father02 extends GrandFather02{
int height = 170;
String addr = "서울";
void dance() {System.out.println("아빠의 dance()");}
@Override
void sing() {System.out.println("아빠의 sing()");}
}
class Son02 extends Father02{
int height = 180;
String gender = "남자";
void run() {System.out.println("아들의 run()");}
@Override
void sing() {System.out.println("아들의 sing()");}
}
public class promotion {
public static void main(String[] args) {
GrandFather02 gf1 = new GrandFather02();
System.out.println("할아버지타입참조변수gf1.height="+gf1.height); //160
System.out.println("할아버지타입참조변수gf1.name="+gf1.name);
gf1.sing();
System.out.println(); GrandFather02 gf2 = new Father02();
System.out.println("할아버지타입참조변수gf1.height="+gf2.height); //160
System.out.println("할아버지타입참조변수gf1.name="+gf2.name);
//System.out.println("할아버지타입참조변수gf1.addr="+gf2.addr); //에러
gf2.sing();
//gf2.dance(); //에러
System.out.println(); GrandFather02 gf3 = new Son02();
System.out.println("할아버지타입참조변수gf3.height="+gf3.height); //160
System.out.println("할아버지타입참조변수gf3.name="+gf3.name);
gf3.sing();
}
}
|
cs |
* 실행 결과
할아버지타입참조변수gf1.height=160
할아버지타입참조변수gf1.name=홍할
할아버지의 sing()
할아버지타입참조변수gf1.height=160
할아버지타입참조변수gf1.name=홍할
아빠의 sing()
할아버지타입참조변수gf3.height=160
할아버지타입참조변수gf3.name=홍할
아들의 sing()
'개발 수업 > JAVA' 카테고리의 다른 글
[Java] 다형성/필드의 다형성,매개 변수의 다형성 (0) | 2023.05.18 |
---|---|
[Java] 상속/타입변환(강제 타입 변환(casting),객체 타입 확인(instanceof)) (0) | 2023.05.18 |
[Java] 상속/부모 생성자 호출 super() (0) | 2023.05.17 |
[Java] 클래스/this() (0) | 2023.05.17 |
[Java] 클래스/생성자 (0) | 2023.05.16 |