[CH7. 객체지향프로그래밍2] 다형성

5. 다형성

5.1 다형성이란?

여러가지 형태를 가질 수 있는 능력.
조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Tv{
boolean power;
int channel;

void power(){power = !power;}
void channelUp(){++channel;}
void channelDown(){--channel;}
}

class CaptionTv extends Tv{
String text;
void caption(){};
}

1
2
Tv t = new Tv();
CaptionTv c = new CaptionTv();
1
Tv t = new CaptionTv();
1
2
CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();
1
2
//이렇게는 불가능함
CaptionTv c = new Tv();

조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

5.2 참조변수의 형병환

자손타입->조상타입(up-castion) : 형변환 생략 가능
자손타입<-조상타입(Down-castion) : 형변환 생략 불가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Car{
String color;
int door;
void drive(){
System.out.println("drive, Brrr~");
}
void stop(){
System.out.println("stop!!");
}
}

class FireEngine extends Car{
void water(){
System.out.println("water!!!");
}
}

class Ambulance extends Car {
void siren(){
System.out.println("siren~~!");
}
}

FireEngine타입과 Ambulance타입은 서로 형변환 불가능
Car 타입과 FireEngine 타입 형변환 예시

1
2
3
4
5
6
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;

car = fe; //car = (Car) fe; 형변환이 생략된 형태
fe2 = (FireEngine) car; //형변환 생략 불가.

아래 예제는 컴파일에러는 발생하지 않지만 실행시 에러가 발생함.

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
class CastingTest2{
public static void main(String args[]){
Car car = new Car();
Car car2 = null;
FireEngine fe = null;

car.drive();
fe = (FireEngine) car; //실행시 여기서 에러 발생
fe.drive();
car2 = fe;
car2.drive();
}
}
```

car가 Car타입의 인스턴스여서 FireEngine을 받을 수 없음.
- 캐스트연산자를 사용하면 서로 상속관계에 있는 클래스 타입의 참조변수간의 형변환은 양방향으로 자유롭게 수행될 수 있다.
그러나 참조변수가 참조하고 있는 인스턴스의 자손타입으로 형변환을 하는것은 허용되지 않는다.

### 5.3 instanceof연산자
참조변수가 참조하는 인스턴스 실제타입을 확인하기 위해 instanceof연산자 사용.
주로 조건문에사용.
* 값이 ull인 참조변수에 대해 instanceof연산을 하면 false나옴.

```java
void doWork(Car c){
if(c instanceof FireEngine){
FireEngine fe = (FireEngind) c;
fe.water();
} else if( c instance of Ambulance){
Ambulance a = (Ambulance) c;
a.siren();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class InstanceOfTest{
public static void main (String args[]){
FireEngine fe = new FireEngine();

if(fe instanceof FireEngine){
System.out.println("FireEngine instance");
}
if( fe instanceof Car){
System.out.println("Car instance");
}
if( fe instanceof Object){
System.out.println("Object instance");
}
}
}

위의 코드를 실행할 경우

1
2
3
FireEngine instance
Car instance
Object instance

5.4 참조변수와 인스턴스의 연결

멤버변수가 조상클래스와 자손클래스에 중복으로 정의된 경우, 조상 타입의 참조변수를 사용했을 때는 조상클래스에 선언된 멤버변수가 사용되고, 지손타입의 참조변수를 사용했을 때는 자손틀래스에 선언된 멤버변수가 사용된다.

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
class BindingTest{
public static void main(String[] args){
Parent p = new Child();
Child c = new Child();

System.out.println("p.x =" + p.x);
p.method();

System.out.println("c.x= "+c.x);
c.method();

}
}

class Parent {
int x = 100;
void method(){
System.out.println("Parent Method");
}
}

class Child{
int x = 200;
void method(){
System.out.println("Child Method");
}
}

실행결과

1
2
3
4
p.x=100
Child Method
c.x=200
Child Method

5.5 매개변수의 다형성

5.6 여러 종류의 객체를 하나의 배열로 다루기

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×