[Java] 다형성 - 형변환, instanceof

CountryGirl·2023년 6월 12일
0

Java

목록 보기
12/18
post-thumbnail

📌 다형성

😎 참조변수의 타입변환 - 자동 타입변환

부모타입 변수 = 자식타입객체; ➡️ 자동으로 부모타입으로 변환된다.

  • 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급될 수 있다.
    🚨 주 의 🚨 부모타입 변수로 자식객체의 멤버에 접근할 때는 부모 클래스에 선언된 상속받은 멤버만 접근할 수 있다.
class Mammal {
    // 포유류는 새끼를 낳고 모유수유를 한다.
    public void feeding() {
        System.out.println("모유수유를 합니다.");
    }
}

---

class Whale extends Mammal {
    // 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
    public void swimming() {
        System.out.println("수영하다.");
    }

    @Override
    public void feeding() {
        System.out.println("고래는 모유수유를 합니다.");
    }
}

---

public class Main {
    public static void main(String[] args) {
    
        Mammal mammal = new Whale();

        mammal.swimming(); // 오류 발생
        Whale whale = new Mammal(); // 오류 발생
        
        mammal.feeding();
    }
}
  • Mammal mammal = new Whale();
    : 고래는 포유류이기 때문에 포유류 타입으로 변환될 수 있다.

  • mammal.swimming();
    : 부모 클래스에 swimming 이 선언되어있지 않아서 사용 불가능하다 ➡️ 모든 포유류가 수영을 할 수 있는 것은 아니기 때문에 실행불가

  • Whale whale = new Mammal();
    : 부모타입의 객체는 자식타입의 변수로 변환될 수 없다 ➡️ 모든 포유류가 전부 고래처럼 수영이 가능한 것은 아니 때문에 타입변환이 불가능하다.


😎 참조변수의 타입변환 - 강제 타입변환

자식타입 변수 = (자식타입) 부모타입객체; ➡️ 부모타입 객체는 자식타입의 변수로 자동으로 타입변환이 되지 않기 때문에 (자식타입), 타입연산자를 사용해 강제로 타입변환이 가능하다.

// 자동형변환
Mammal mammal = new Whale();
mammal.feeding();

// 강제형변환
Whale whale = (Whale) mammal;
whale.swimming();

자식객체 고래의 수영기능을 사용하고 싶다면 자식타입으로 강제 타입변환을 할 수 있다.

🚨 주 의 🚨
무조건 강제 타입변환을 할 수 있는 것은 아니다

  • 자식타입객체가 부모타입으로 자동 타입변환이 된 후 다시 자식타입으로 변환될 때 강제 타입변환이 가능하다.
  • 부모타입 변수로는 자식타입객체의 고유한 멤버를 사용할 수 없기 때문에 사용이 필요한 경우가 생겼을 때 강제 타입변환을 사용한다.
Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal;  	// 오류 발생!!

자동 타입변환이 된 변수가 아닌 부모객체를 자식타입의 변수로 강제 타입변환하려고 하면 오류가 발생한다.


😎 다형성이란?

여러 가지 형태를 가질 수 있는 능력 💪🏻

public Car(Tire tire) {
    this.tire = tire;
}

(...)

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));

---

Tire getHankookTire() {
    return new HankookTire("HANKOOK");
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

(...)

Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();

Car 클래스에는 무조건 Tire 가 들어가야 생성을 해줄 수 있다.
하지만 Tire가 아닌 new KiaTire("KIA")new HankookTire("HANKOOK") 가 들어갔다.

Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");

이렇게 생각하면 쉽다.
new KiaTire("KIA")new HankookTire("HANKOOK")Tire 로 자동타입변환이 되었기 때문이다.

요것이 바로 다형성


😎 instanceof

객체의 원래 클래스명을 체크할 수 있는 명령어 ➡️ Boolean
{대상 객체} instance of {클래스 이름}

class Parent { }
class Child extends Parent { }
class Brother extends Parent { }

---
Parent p = new Parent();

System.out.println(p instanceof Object);	// #1 : True 
System.out.println(p instanceof Parent);	// #2 : True
System.out.println(p instanceof Child);		// #3 : False

Parent c = new Child();

System.out.println(c instanceof Object); 	// #4 : True
System.out.println(c instanceof Parent); 	// #5 : True
System.out.println(c instanceof Child);  	// #6 : True
  • #1 p instanceof Object : Object 는 모든 클래스의 부모클래스인 최상위 클래스이기 때문에 True

  • #2 p instanceof Parent : pParent 로 만들어진 객체이기 때문에 True

  • #3 p instanceof Child : pParent 로 만들어진 객체이기 때문에 Child의 인스턴스가 될 수 없다. False

  • #4 c instanceof Object : Object 는 모든 클래스의 부모클래스인 최상위 클래스이기 때문에 True

  • #5 c instanceof Parent : cChild 로 만들었지만 타입이 Parent 이기 때문에 True

  • #6 c instanceof Child : instanceof 의 기능은 원래 클래스명을 체크하는 기능이라고 했다. 형변환이 되기 했지만 new Child로 만들었기 때문에 True

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글

관련 채용 정보