# 다형성


나는 게임을 못한다.

가끔씩 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

+ Recent posts