# 다형성
나는 게임을 못한다.
가끔씩 LOL을 하는데
너무나 쉽게 내 행동을 간파당해서
라인전이 망하고 한타에서도 진다.
그렇다고 오버워치를 하면
딜러가 힐러보다 딜을 못하는 상황을 만들어낸다.
네 그렇습니다.
LOL, 오버워치 모두 실버유저입니다.
ㅠㅠ
그래서 가끔 게임이 하기 싫어질 때가 있는데
그럴때마다 하는 게임이 있다.
바로!!!!
추억의 게임인 포켓몬스터 골드버전!!!!
이 게임의 두가지 특징이 얘기해보려 한다.
첫번째
포켓몬은 몬스터볼로 잡을 수 있어서
컴퓨터와 싸움을 하면
포켓몬들은 모두 몬스터볼에서 나온다.
두번째
골드버전은 이전버전과 다르게
포켓몬에게 아이템을 소지할 수 있다.
아이템에 따라 포켓몬에게 적용되는 효과가 달라진다.
이 두가지 특징이 다형성과 연결된다.
다형성은 다양한 형태를 가질 수 있는 특징을 말한다.
어디서 많이 들어봤던
오버라이딩과 오버로딩이 바로 다형성의 예이다.
<오버라이딩>
먼저, 오버라이딩은 상위 클래스가 가지고 있는 메소드를
하위 클래스가 재정의 해서 사용한다는 것이다.
몬스터볼이라는 상위 클래스를 상속받아
모든 포켓몬스터를 몬스터볼로 꺼내고 돌아오게 할 수 있다.
예를 들어 다음의 코드와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | public class PocketMonster { public static void main(String[] args){ //포켓몬 만들기?! MonsterBall pikachu = new Pikachu(); MonsterBall yadon = new Yadon(); //피카츄 꺼내기 pikachu.getout(); //피카츄 불러들이기 pikachu.comeback(); //야돈 꺼내기 yadon.getout(); //야돈 불러들이기 yadon.comeback(); } static class MonsterBall{ public void getout(){ System.out.println("포켓몬 꺼내기"); } public void comeback(){ System.out.println("포켓몬 불러들이기"); } } static class Pikachu extends MonsterBall { @Override public void getout() { System.out.println("피카츄 꺼내기"); } @Override public void comeback() { System.out.println("피카츄 불러들이기"); } } static class Yadon extends MonsterBall{ @Override public void getout() { System.out.println("야돈 꺼내기"); } @Override public void comeback() { System.out.println("야돈 불러들이기"); } } } | cs |
피카츄와 야돈은 모두 몬스터볼(부모 클래스)를 상속받는다.
둘 모두 몬스터볼의 메소드를 사용할 수 있고
각자에 맞게 바꿀 수도 있다.
몬스터볼을 가지고
피카츄를 내보낼 수 있고
야돈을 내보낼 수 있다.
겉모습은 몬스터볼인데
피카츄, 야돈을 모두 생성(?!)할 수 있는
다형성의 예이다.
<오버로딩>
오버로딩은 하나의 클래스에서 같은 이름의 메소드가 있지만
파라미터에 따라 다르게 동작한다.
포켓몬에게 아이템을 소지할 수 있는데
아이템에 따라 다른 효과를 적용할 수 있다.
예를 들어 다음의 코드와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class PocketMonster { public static void main(String[] args) { //꼬부기 생성?! Kkobugi kkobugi = new Kkobugi(); kkobugi.item(new HappyEgg()); kkobugi.item(new LearningDevice()); } public static class Kkobugi{ public void item(HappyEgg happyEgg){ System.out.println("지닌 포켓몬이 받는 경험치의 양을 1.5배로 상승시킵니다."); } public void item(LearningDevice learningDevice){ System.out.println("배틀에 나간 포켓몬과 경험치를 나눠 받을 수 있습니다."); } } //행복의알 public static class HappyEgg{ } //학습장치 public static class LearningDevice{ } } | cs |
아이템이라는 메소드 이름은 동일하지만
꼬부기에게 어떤 아이템을 주느냐에 따라
효과가 달라지는 것을 볼 수 있다.
같은 이름의 메소드에서
어떤 파라미터를 주느냐에 따라
다른 결과를 나타낼 수 있는 다형성의 예이다.
다형성이 있다면 코드를 편하게 짤 수 있다.
새로운 포켓몬을 등록할 때
몬스터볼의 기능인 넣었다 뺐다하는 기능을
포켓몬에게 일일히 다 써줄 필요가 없고
그냥 몬스터볼을 상속만 시켜주면
몬스터볼의 기능을 사용할 수 있다.
이처럼 다형성을 이용한다면 개발의 효율성을 높일 수 있다.
To be continued.........
Made by 꿩
'IT > Java' 카테고리의 다른 글
Spring Boot와 JSP (0) | 2019.08.02 |
---|---|
추상클래스와 인터페이스 (0) | 2018.11.11 |
object vs instance vs class (3) | 2018.10.24 |