일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- l3 스위치
- 상속
- 백준 2775
- 다형성
- 10866
- modifiers
- 물리구성도
- 개발바닥
- 역캡슐화
- 자바의 정석
- TCP/IP
- 프로토콜
- 백준 1712
- 논리구성도
- 인터페이스
- AWS CLF
- 자바
- java
- 테슬라폰
- 남궁성
- aws 자격증
- 계층화
- 네트워크
- 1764
- network
- 파이썬
- 파이썬 1712
- 인프콘
- 유선LAN
- 데이터 송수신
- Today
- Total
병훈's Blog
[Java] 다형성2 (Polymorphism) 본문
다형성 part2
다형성을
"하나의 인스턴스를 다루는 참조변수가 여러 개다"
"하나의 참조변수로 여러 인스턴스를 다룰 수 있다"
라고 했었죠.
자세히 말해야 할 것 같아요.
"여러 조상클래스의 참조변수로 자손클래스의 인스턴스를 다룰 수 있다"
"조상클래스의 참조변수로 여러 자손클래스의 인스턴스를 다룰 수 있다"
말이 비슷해서 헷갈리네요.
위에는 '자손클래스 인스턴스'를 기준으로 여러 조상클래스의 참조변수가 하나의 인스턴스를 다룰 수 있다는 말이고,
아래는 '조상클래스 참조변수'를 기준으로 여러 자손클래스의 인스턴스를 다룰 수 있다는 말이에요.
이 그림을 보면, SmartTv 인스턴스 하나를
SmartTv 본인클래스의 참조변수 s 로 다룰 수 있고,
SmartTv의 부모클래스인 Tv의 참조변수 t 로도 다룰 수 있고,
SmartTv의 부모의 부모클래스인 Product의 참조변수 p 로도 다룰 수 있어요.
여러 조상클래스의 참조변수로 하나의 자손클래스 인스턴스를 다루고 있죠.
그리고 각 참조변수마다 인스턴스에서 다룰 수 있는 멤버의 개수가 달라요.
위 그림을 보면 Product 타입의 참조변수로
Product, Tv, SmartTv의 인스턴스를 다루고 있어요.
조상클래스의 참조변수로 여러 자손클래스의 인스턴스를 다루고 있죠.
이 Product p를 어떤 메소드의 매개변수 자리에 위치시키고new Product()
, new Tv()
, new SmartTv()
를 인자로 전해준다면
아래 그림이 되겠죠.
그리고 Product 타입의 참조변수로는
Product까지 상속받은 멤버만 다룰 수 있다는 걸 표시했어요.
instanceof
부모자식 클래스 간에 참조변수의 형변환이 가능해요.
근데 코드를 작성하다 보면, 부모자식 관계가 아닌데도
엉뚱한 클래스로 형변환하는 실수를 할 수도 있잖아요?
이것을 방지해주기 위한 연산자가 instanceof 입니다.
class InstanceofTest {
public static void main(String args[]) {
FireEngine fe = new FireEngine();
if(fe instanceof FireEngine) {
System.out.println("This is a FireEngine instance.");
}
if(fe instanceof Car) {
System.out.println("This is a Car instance.");
// Car c = (Car)fe; 형변환
}
if(fe instanceof Object) {
System.out.println("This is an Object instance.");
// Object o = (Object)fe; 형변환
}
System.out.println(fe.getClass().getName()); // 클래스의 이름을 출력
}
} // class
class Car {} // 부모클래스
class FireEngine extends Car {} // 자식클래스
FireEngine fe = new FireEngine();
에서 생성된 참조변수 fe
는 자기자신은 물론이고,
FireEngine의 부모클래스인 Car와,
최고 조상 클래스인 Object로 형변환이 가능합니다.
그래서 아래 모두 true가 됩니다.
if(fe instanceof FireEngine) // fe가 FireEngine으로 형변환이 가능한가? -> true
if(fe instanceof Car) // fe가 Car로 형변환이 가능한가? -> true
if(fe instanceof Object) // fe가 Object로 형변환이 가능한가? -> true
이렇게 instanceof 연산자를 통해서
형변환이 가능하다는 것을 확인한 후에
형변환 코드를 작성하면 실수할 일이 없습니다.
그럼 언제 false가 반환되는 것일까요?Car
의 자손클래스에 Police
를 추가해보죠.
FireEngine
, Police
각각 Car
의 자손클래스에요.
이 둘은 부모-자식 관계가 아니기 때문에
서로 형변환 할 수 없습니다.
그래서 fe instanceof Police
는 false죠.
서로 다른 객체를 배열로 다루기
위에서 봤던 Car 클래스의 자손으로 FireEngine, Police, Ambulance 가 있다고 해봐요.
조상타입인 Car 의 참조변수에 자손클래스 각각의 인스턴스 주소를 저장 해볼게요.
class Car {}
class FireEngine extends Car {}
class Police extends Car {}
class Ambulance extends Car {}
...
//main method 안
Car c1 = new FireEngine();
Car c2 = new Police();
Car c3 = new Ambulance();
여기서 참조변수 c1, c2, c3가 같은 타입이에요.
이걸 배열로 표현하면 더 깔끔할 것 같아요.
이렇게요.
Car[] c = new Car[3];
c[0] = new FireEngine();
c[1] = new Police();
c[2] = new Ambulance();
배열의 index 안에 서로 다른 인스턴스의 주소가 저장되는 거죠.
이렇게 조상클래스 타입의 배열에 자손의 객체를 담아
서로 다른 객체를 배열로 다룰 수 있습니다
휴 다향성은 내용이 많네요...
고생하셨어요!!
'Java' 카테고리의 다른 글
[Java] 인터페이스 (interface) (1) | 2022.10.04 |
---|---|
[Java] 추상클래스 (abstract class) (0) | 2022.09.29 |
[Java] 다형성1 (Polymorphism) (0) | 2022.09.28 |
[Java] 제어자 (Modifiers) (0) | 2022.09.28 |
[Java] package와 import (0) | 2022.09.28 |