객체의 다형성
객체는 다양한 형태를 지닐 수 있습니다
하나의 객체가 타입을 여러개를 가질 수 있다는 말과 동일합니다.
클래스는 어떻게 보면 객체의 타입이기도 한데,
부모 클래스 타입의 참조 변수로 자식 클래스의 참조타입을 참조할 수 있습니다.
자기 자신의 참조타입 뿐 아니라 다른 타입을 참조 할 수 있다는 것의 의미는
아무래도 중복제거의 느낌이 큽니다.
다형성 이라는 개념은 어떤 객체가 다른 객체를 참조하면서 생기는 문제들을 설명하기 위해 등장한 개념입니다.
객체가 다른 객체를 참조를 하는 것은 캐스팅 이라고 하는데, 캐스팅은 업캐스팅과 다운캐스팅으로 분류합니다.
왜 이 개념이 등장했는지 알기 전에 포켓몬스터를 예시로 들어보면
포켓몬스터라는 애니메이션, 게임을 생각해볼까요?.
피카츄, 라이츄, 파이리, 꼬부기... .
이 것들은 모두 이름, 체력, 공격력, 방어력, 스페셜 공격, 스페셜 방어, 스피드를 가지고 있습니다.
그렇다면 피카츄나 파이리와 같은 객체들이 하나 생성될 때마다 피카츄 클래스, 라이츄 클래스...
모든 포켓몬 클래스들마다 체력, 공격력, 방어력, 특수공격... 모든 내용들을 집어 넣어줘야 하는 것일까요?
지난 시간에 공부한 상속의 개념을 이용하면 그렇지 않다는 것을 바로 눈치챘을 것입니다.
포켓몬들은 모든 타입의 포켓몬들의 부모 클래스가 될 수 있습니다.
피카츄는 포켓몬이고, 라이츄도 포켓몬이고, 파이리, 꼬부기 모두 다 포켓몬인데요,
하지만 모든 포켓몬이 전부 피카츄는 아닙니다.
타입을 설정해줄 때도 이 개념이 들어가게 되는데요,
여기서 캐스팅의 개념이 들어가게 됩니다.
업 캐스팅
- 자식 타입은 부모 타입의 모든 것을 보유하고 있다.
- 자식 타입은 언제든지 별다른 문제 없이 부모 타입이 될 수 있다
ex) 피카츄, 파이리, 꼬부기 -> 포켓몬 (가능, 언제든지 별다른 문제없이 포켓몬임)
다운 캐스팅
- 부모 타입은 타입 캐스팅을 통해 자식 타입이 될 수 있습니다.
- 하지만, 원래 자식 타입이었다가 업캐스팅 된 경우가 아니라면 에러가 발생하게 됩니다.
(그냥 부모타입에서 자식타입으로 접근하는건 안된다는 말이다)
ex) 포켓몬 -> 피카츄, 파이리, 꼬부기 (불가능, 피카츄는 포켓몬이지만 포켓몬을 지칭하는 것이
피카츄를 지칭하지는 않듯이 부모 클래스(포켓몬)에서 각각 자식 클래스들(피카츄,파이리,꼬부기)로
접근하는 것은 불가능하다.)
또 다른 예시를 살펴보면
- 경찰은 경찰이기도 하고 사람이기도 하다 (업 캐스팅)
- 사람은 사람이지만 경찰이 아닐 수도 있다 (다운 캐스팅)
그런데, 업캐스팅과 다운캐스팅을 하면서 유의할 점이 있습니다.
앞으로 설명을 위해 만들 Defender 객체를 위해 Person객체를 다시 보여주고,
Defender는 어떤 기능들이 있는지 보여주자면
Person은 나이별로 인사하는 메서드가 하나 있고,
Defender 은 Person 의 메서드인 sayHi 를 오버라이딩하고,
Defender에만 있는 기능으로 block() 과 bash() 가 있습니다.
업캐스팅과 다운캐스팅을 하면서 유의할 점이 있다고 했는데,
업캐스팅으로 자식이 부모를 참조하면, 그 참조 변수는 부모타입을 가지고 있어서
부모 클래스의 메서드(기능)들만 사용할 수 있고 자식 클래스의 메서드는 사용할 수 없게 됩니다.
그리고 업캐스팅 된 상태에서는 부모 타입의 자원만 그대로 사용할 수 있습니다.
업캐스팅 된 상태에서도 오버라이딩 된 메서드는 자식의 것으로 사용합니다.
다시 한 번 정리하자면, Person으로 업캐스팅 되었으면 Defender에 있는 메서드들 block(), bash()는 사용할 순 없지만
sayHi는 오버라이드 되어 자식의 것으로 사용이 됩니다.
보통은 업캐스팅했다가 다시 다운캐스팅을 하는 이런 코드는 잘 작성하진 않지만
업캐스팅 된 p11을 다시 다운캐스팅 하여, 자식 메서드를 사용하는 것이 가능합니다.
업캐스팅과 다운캐스팅을 잘 사용하면 적은 코드로 정교한 프로그램을 만들 수 있어서 유용합니다.
다형성, 용어가 어려웠지만 사실 크게 어려운 개념은 아니었던 것 같습니다.
어떤 객체가 다른 객체로 참조할 수 있는 성질을 말하는 것이니까,,,
다만 캐스팅이 이렇게 된다는 것을 좀 정리해두면,
이후 코드를 짤 때 어떤 객체를 여러개 많은 갯수를 생성할 때 반복문을 통해서 생성하게 되는데
업캐스팅해서 싸잡아서 객체가 생성이 되는 경우가 종종 있습니다.
특정 조건을 부여하여 다운캐스팅을 하며 특정 조건을 통한 코드를 작성할 수도 있습니다.
이만 내용을 줄이며 다음에 업캐스팅과 다운캐스팅을 이용한 코드를 만날 때
조금은 더 자연스럽게 이해하고 버벅대지 않기를~~
'Java (국비지원 당시 공부했던 글) > OOP (Java)' 카테고리의 다른 글
[자바] OOP - 7. 접근 제어자 (public/protected/default/private) (0) | 2022.06.06 |
---|---|
[자바] OOP - 6. toString() (0) | 2022.06.03 |
[자바] OOP - 4. 상속 (상속 개념과 super, 오버라이드) (0) | 2022.05.27 |
[자바] OOP - 3. static과 변수 선언위치, 생성시기 (0) | 2022.05.16 |
[자바] OOP - 2. 클래스의 생성자와 오버로딩 (0) | 2022.05.16 |