관리 메뉴

나만을 위한 블로그

[JAVA] 다형성이란? 본문

JAVA

[JAVA] 다형성이란?

참깨빵위에참깨빵_ 2020. 12. 12. 22:18
728x90
반응형
다형성 : 같은 () 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상. 예를 들면 암수에 따라 크기, 형태, 색깔 따위가 차이 나는 것이다

다형성은 객체지향언어인 자바에서 상속과 함께 중요한 개념 중 하나다.

사전적 의미로는 같은 종이면서도 형태, 성질이 다양하게 나타나는 현상을 말하는데, 자바에서는 한 타입(자료형)의 참조변수로 여러 타입의 객체를 참조할 수 있도록 구현한 기능이다.

말로는 잘 모르겠다. 예시 코드를 보면서 확인해보자.

 

public interface Lol
{
    void sayMyName();
    void q_skill();
    void w_skill();
    void e_skill();
    void r_skill();
}

 

롤이라는 5:5 온라인 전투 게임을 모티브로 인터페이스를 만들어봤다.

게임에선 각 유닛들은 기본적으로 4개의 고유 스킬을 가져서 이를 사용해 상대방을 공격할 수 있다. 이 스킬들은 각각 q, w, e, r 4개 키로 사용할 수 있어서 이렇게 인터페이스를 만들었다.

그리고 각 챔피언의 이름을 출력하기 위해 name()이라는 추상 메서드도 만들었다.

 

다음은 이 인터페이스를 상속받는 클래스를 만들고, 그 클래스에 이 메서드들을 오버라이딩해서 각 챔피언 별 고유 스킬을 만들 것이다.

 

public class Velkoz implements Lol
{
    @Override
    public void sayMyName()
    {
        System.out.println("챔피언명 : 벨코즈");
    }

    @Override
    public void q_skill()
    {
        System.out.println("Q : 플라즈마 분열");
    }

    @Override
    public void w_skill()
    {
        System.out.println("W : 공허 균열");
    }

    @Override
    public void e_skill()
    {
        System.out.println("E : 지각 붕괴");
    }

    @Override
    public void r_skill()
    {
        System.out.println("R : 생물 분해 광선");
    }
}
public class Garen implements Lol
{
    @Override
    public void sayMyName()
    {
        System.out.println("챔피언명 : 가렌");
    }

    @Override
    public void q_skill()
    {
        System.out.println("Q : 결정타");
    }

    @Override
    public void w_skill()
    {
        System.out.println("W : 용기");
    }

    @Override
    public void e_skill()
    {
        System.out.println("E : 심판");
    }

    @Override
    public void r_skill()
    {
        System.out.println("R : 데마시아의 정의");
    }
}

 

두 명의 실제 유닛들을 모티브로 클래스를 만들었다. Lol 인터페이스를 implements한 다음, 인터페이스 안의 추상메서드들을 재정의했다. 이제 이 메서드들을 각각 호출하면 챔피언 별 고유 스킬명들을 출력할 것이다.

 

public class Main
{
    public static void main(String[] args)
    {
        Lol lol;
        System.out.println("정의의 전장에서 같이 싸울 챔피언을 선택해 주세요!\n\n1. 벨코즈 2. 가렌");
        // 사용자에게 입력받기 위한 스캐너 객체 선언
        Scanner scanner = new Scanner(System.in);
        // 입력된 숫자는 selectedNum에 저장된다
        int selectedNum = scanner.nextInt();
        // selectedNum에 저장된 숫자에 따라 다른 결과를 출력한다
        switch (selectedNum)
        {
            case 1 :
                lol = new Velkoz();
                lol.sayMyName();
                lol.q_skill();
                lol.w_skill();
                lol.e_skill();
                lol.r_skill();
                break;

            case 2 :
                lol = new Garen();
                lol.sayMyName();
                lol.q_skill();
                lol.w_skill();
                lol.e_skill();
                lol.r_skill();
                break;

            default:
                break;
        }
    }
}

 

이제 위 코드를 실행해보자. 1을 입력할 경우, 2를 입력할 경우를 각각 나눠서 보면 아래와 같다.

 

 

이렇게 1 또는 2를 입력한 것만으로 Lol 인터페이스에 있던 메서드들이 유닛에게 재정의되어, 그 유닛의 고유 스킬명들을 출력하는 걸 볼 수 있다. 중요한 개념이지만 그렇게 이해하기 어렵지 않은 내용이다.

반응형
Comments