다형성

김예인·2023년 5월 1일

백엔드 공부일지

목록 보기
12/43
post-thumbnail

📚 다형성 (polymorphism)

poly (여러개) + morphism (형태) : 하나의 객체가 여러 가지 형태를 가질 수 있는 성질

다형성 : 상위 클래스 타입의 참조 변수를 통해 하위 클래스의 객체를 참조

예시)

class TV {
	void power() {}
    void volume() {}
    void channel() {}
}

class SmartTV extends TV {
	void AI() {}
    void shopping() {}
}

일반적으로는 아래와 같이 동일한 클래스 타입의 참조 변수 생성 및 초기화!

TV tv_remotecontrol = new TV();
SmartTV smart_remotecontrol = new SmartTV();

BUT, 상속 관계라면 부모 타입 참조 변수로 자식 클래스 타입의 참조 변수를 받아 초기화!

TV tv_remoteControl = new SmartTV();

** 반대로, 부모클래스 참조변수는 자식클래스 참조변수를 받을 수 없다

이때,
참조 변수가 사용할 수 있는 멤버의 수 = 부모 클래스의 멤버의 수
(기본 티비 기능으로 스마트 티비가 완벽 호환되지 않아 사용 가능 기능이 줄어든다.)


📚 참조 변수의 타입 변환 (= 캐스팅)

참조 변수(객체, 주소값) 의 타입 변환으로, 사용할 수 있는 멤버의 개수를 조절한다!

📌 세 가지 조건

  1. 클래스끼리 상속 관계
  2. 업캐스팅 (하위 클래스 타입 ▶ 상위 클래스 타입) : 형 변환 연산자(괄호) 생략 가능
  3. 다운캐스팅 (상위 클래스 타입 ▶ 하위 클래스 타입) : 형 변환 연산자(괄호) 반드시 명시
  4. 다운 캐스팅을 할 때는 반드시 업 캐스팅이 되어있는 상태에서만 가능
예시)

class Vehicle { // 부모 클래스
	void startEngine() {}
    void accelerate() {}
    void brake() {}
}

class Car extends Vehicle { // 자식 Car 클래스
	void giveRide() {}
}

class MotorBike extends Vehicle { // 자식 MotorBike 클래스
	void performance() {}
}
// 1. Car 클래스 타입의 참조변수 car 생성
Car car = new Car();

// 2. 참조변수 car 의 타입을 상위클래스 Vehicle 으로 변환 (업캐스팅)
Vehicle vehicle = (Vehicle) car;

// 3. 참조변수 vehicle 의 타입을 하위클래스 Car 으로 변환 (다운캐스팅)
Car car2 = (Car) vehicle;

// 4. 참조변수 car 의 타입을 MotorBike 클래스 타입으로 변환 (오류 : 상속관계 아님)
MotorBike motorBike = (MotorBike) car;

📚 instanceof 연산자

참조 변수의 타입 변환 (캐스팅)이 가능한지 여부를 boolean 타입으로 확인

📌 기본 양식

참조변수 instanceof 타입
  1. returntrue 면 가능, false 면 불가능
  2. 참조 변수가 null 이면 false 를 반환

예시 )

class Hardware {}
class Mouse extends Hardware {}
class Keyboard extends Hardware {}
1. '하드웨어' 클래스 타입의 참조변수 '하드웨어' (일반적)

Hardware hardware = new Hardware();

hardware instanceof Object // true
hardware instanceof Hardware // true
hardware instanceof Mouse // false
2. '하드웨어' 클래스 타입의 참조변수 '키보드' (업캐스팅)

Hardware keyboard = new Keyboard();

keyboard instanceof Object // true
keyboard instanceof Hardware // true
keyboard instanceof Keyboard // true
keyboard instanceof Mouse // false : 상속관계X
profile
백엔드 개발자 김예인입니다.

0개의 댓글