[JAVA] 다형성

김채원·2025년 2월 25일
0
post-thumbnail

1. 다형성이란

  • 다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 4번째 특징
  • 인터페이스 상속, 클래스 상속을 활용해서 추상계층을 표현
  • 따라서 추상 계층이라는 특징을 활용해 다형성을 구현할 수 있음

고양이,강아지에서 생명체로 올라갈수록 추상적

2. 형변환

  • 부모타입으로 자식타입을 다룰 수 있는 이유는 자동으로 형변환(Casting)이 발생했기 때문
  • 자식타입 → 부모타입: 업캐스팅(UpCasting)
  • 부모타입 → 자식타입: 다운캐스팅(DownCasting)

업캐스팅

public class Main {

    public static void main(String[] args) {

        Animal animal = new Cat(); // 자동 형변환
        animal.exist(); 
        animal.makeSound(); 
    }
}

주의사항

업캐스팅은 부모의 타입으로 데이터를 다룰 수 있지만 자식 클래스의 고유기능을 활용할 수 없음

다운캐스팅

public class Main {

    public static void main(String[] args) {

        // 다형성 활용
        Animal animal = new Cat();
        animal.exist();
        animal.makeSound();        
        Cat cat = (Cat) animal; // 다운캐스팅(부모Animal -> 자식Cat)
        cat.scratch(); // 자식 클래스의 기능 활용 가능
    }
}

주의사항
잘못된 다운캐스팅은 컴파일단계에서 감지할 수 없음
-> instanceof를 사용해 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인해야함

3. 개인적인 궁금증

원칙적으로 자식 클래스는 부모 클래스가 누구인지 알지만
부모 클래스는 자식이 누구인지 알 길이 없음

근데 이처럼 형변환을 통해

Animal animal = new Cat();
Cat cat = (Cat) animal;

이런식으로 다운캐스팅을 했다고 가정해보자
그렇다면 원래 부모 클래스의 객체였던 animal은
이제 자식클래스가 누구인지 알 수 있는것 아닌가 ???
궁금해서 바로 지피티에게 물어보았다

결론부터 말하자면 아니다 !
왜냐하면 animal 객체가 본질적으로 변하는게 아닌 참조할 수 있게 되었기 때문이라는데

여기서 또 궁금증
메서드는 클래스영역 메모리에 저장이 된다
이런식으로 다운캐스팅을 하게돼서 자식의 메서드를 참조할 수 있게 되었다면
클래스영역 메모리에 접근을 한 것이므로 자식의 클래스영역에 적힌 것들을 알 수 있는것 아닌가 ?

결론은 또 아니다 ㅋㅋㅋㅋㅋㅋ
왜 안되는지는 이 답변 때문에 알았는데
다운캐스팅을 했을때 animal을 cat이라고 간주할 수 있음을 아는건
컴파일러이기 때문 ,,

animal 클래스 자체는 cat 클래스에 대한 정보를 아무것도 모르지만
컴파일러는 다운캐스팅이 된걸 알고있으므로 컴파일러가 cat의 정보를 읽어오는것
궁금증 해결

profile
김채원 판교간다

0개의 댓글