학습 키워드
- 다형성
- 업캐스팅과 다운캐스팅
- instanceof 연산자
다형성
>의미
: 하나의 객체가 여러 가지 형태를 가질 수 있는 성질
: 한 타입의 참조변수를 통해 여러 타입의 객체를 참조하는 것
: 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것.
>특징 및 장점
: 역으로는 참조할 수 없다.
: 상위 클래스의 멤버만 사용할 수 있다.
: 형 변환처럼 타입 변환이 가능하다.
//범위가 큰 쪽으로 형변환은 자동으로, 범위가 좁은 쪽으로 형변환은 명시해야 하는 점에서 자료형 변환과 유사하다.
//범위가 어느 방향이 큰 건지 생각할 것.
>참조변수의 타입 변환
: 사용할 수 있는 멤버의 수를 조절하는 것
>참조변수 타입 변환의 조건
1. 상속관계에 있는 클래스에서만 변환 성립
2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환은 형변환 연산자(괄호)를 생략할 수 있다.
3. 상위 클래스 타입에서 하위 클래스 타입으로의 타입 변환은 형변환 연산자(괄호)를 반드시 명시해야 한다.
//다형성이 성립되는 것이 기본 조건
//참조변수의 형변환의 방향은 상속 관계에서 쌍방향. 즉, 상위에서 하위, 혹은 하위에서 상위로 다 가능하다. 어떤 인스턴
스를 참조하느냐가 중요하다.
>타입 변환 코드 예시
public class Main {
public static void main(String[] args) {
CheeseCake cheese = new CheeseCake();
Cake cream = (Cake) cheese; // 가능(업캐스팅), 명시(생략 가능)
// Cake cream = cheese; // 가능(업캐스팅), 생략
CheeseCake cheese2 = (CheeseCake) cream; // 가능(다운캐스팅), 생략 불가능
// MilkCake milk = (MilkCake) cheese; // 불가능, 상속 관계가 아님
}
}
class Cake { }
class CheeseCake extends Cake { }
class MilkCake extends Cake { }
instanceof 연산자
>의미
: 연산자!이다. 변수도 아니고, 메서드도 아님. (희한하네)
: 캐스팅(타입 변환)이 가능한 지 여부를 boolean 타입으로 확인
: 참조 변수가 검사한 타입으로 변환이 가능하다 or 불가능하다.
>사용
: 에러를 줄이는 데 사용할 수 있음.
코드: (참조_변수) instanceof (타입)
public class Main {
public static void main(String[] args) {
// 참조형이 Cake인 c1이 Cake 인스턴스 참조
Cake c1 = new Cake();
System.out.println(c1 instanceof Object); // true
System.out.println(c1 instanceof Cake); // true
System.out.println(c1 instanceof CheeseCake); // false
System.out.println(c1 instanceof MilkCake); // false
// 참조형이 CheeseCake인 c2가 CheeseCake 인스턴스 참조
CheeseCake c2 = new CheeseCake();
System.out.println(c2 instanceof Object); // true
System.out.println(c2 instanceof Cake); // true
System.out.println(c2 instanceof CheeseCake); // true
System.out.println(c2 instanceof MilkCake); // error;false(참조형과 상속 관계가 아님)
// 참조형이 Cake인 c3가 CheeseCake 인스턴스 참조
Cake c3 = new CheeseCake(); //
System.out.println(c3 instanceof Object); // true
System.out.println(c3 instanceof Cake); // true
System.out.println(c3 instanceof CheeseCake); // true
System.out.println(c3 instanceof MilkCake); // false(참조형과 상속 관계라서 error가 안남)
}
}
class Cake { }
class CheeseCake extends Cake { }
class MilkCake extends Cake { }
//다형성이 실제로 많이 쓰일 것 같다.
//되게 중요해 보이는 만큼 어렵다. 연습 많이 할 것.
'코드스테이츠_국비교육 > [Section1]' 카테고리의 다른 글
15_추석 전 날_22.09.08 (0) | 2022.09.09 |
---|---|
14_객체지향 프로그래밍 심화(추상화)_22.09.07 (0) | 2022.09.07 |
13_객체지향 프로그래밍 심화(캡슐화)_22.09.06 (0) | 2022.09.06 |
13_객체지향 프로그래밍 심화(상속)_22.09.06 (2) | 2022.09.06 |
12_객체지향 프로그래밍 기초2(이너 클래스)_22.09.05 (0) | 2022.09.05 |