정리/JAVA

다형성

포테이토누들 2020. 5. 27. 10:57

다형성이란?

다형성(Polymorphism)이란 하나의 클래스 또는 메소드가 필요에 따라 각기 다른 방식으로 동작함을 의미한다.

 

주로 인터페이스, 추상 클래스에서 오버라이딩(Overriding), 오버로딩(Overloading)을 통해 지원된다.

 

장점으로는

  • 코드를 간결하게 해준다.
  • 유연한 설계가 가능하다.

가 있다.

 

유연한 설계는 추상화와 밀접한 관계가 있다고 생각된다.

 

예시를 통해 하나씩 살펴보도록 했다.


간결한 코드 

 

다형성을 적용하지 않고, 피아니스트와 바이올리니스트의 연주를 표현하려면 아래와 같은 코드가 필요할 것이다.

 

public class Pianist {
}

 

public class Violinist {
}

 

public class Cellist {
}

 

public class Tests {
    public static void main(String[] args) {
    
    	Pianist musician = new Pianist();
        
        if(musician instanceof Pianist) {
        	System.out.println("피아노 연주");
        }
        else if(musician instanceof Violinist) {
        	System.out.println("바이올린 연주");
        }
        else if(musician instanceof Cellist) {
        	System.out.println("첼로 연주");
        }
    }
}

경우의 수가 많아지면 많아질수록 if ~ else if 구문이 많아질 것이다.

 

이를 간결하게 표현하기 위해 인터페이스를 통해 구현한다면 아래와 같을 것이다.

 

public interface Musician {
	public void play();
}

 

public class Pianist implements Musician {
    @Override
    public void play() {
    	System.out.println("피아노 연주");
    }
}

 

public class Violinist implements Musician {
    @Override
    public void play() {
    	System.out.println("바이올린 연주");
    }
}

 

public class Cellist implements Musician {
    @Override
    public void play() {
    	System.out.println("첼로 연주");
    }
}

 

public class Tests {
    public static void main(String[] args) {
    
    	Musician musician = new Pianist();
        
        musician.play();
        
    }
}

 

복잡했던 if ~ else if문이 모두 사라졌으며,

Pianist / Violinist / Cellist 클래스 모두 play() 메소드 하나만으로 다룰 수 있게 되었다.

 


유연한 설계 

동일한 메소드가 상황에 따라 다른 방식으로 동작 

 

public interface Musician {
	public void play();
}

 

public class Pianist implements Musician {
    @Override
    public void play() {
    	System.out.println("피아노 연주");
    }
}

 

public class Violinist implements Musician {
    @Override
    public void play() {
    	System.out.println("바이올린 연주");
    }
}

 

public class Cellist implements Musician {
    @Override
    public void play() {
    	System.out.println("첼로 연주");
    }
}

인터페이스 Musician과 Musician을 구현한 구현체 Pianist / Violinist / Cellist를 보면

악기를 연주하는 음악가들이 연주를 하는 행위를 주요 관점으로 삼아 이를 추상화해 Musician이라는 인터페이스로 

추상화 모델을 생성했다고 볼 수 있다.

 

public class Tests {
    public static void main(String[] args) {
    
    	Musician musician = new Pianist();
        // Musician musician = new Vilolist();
        // Musician musician = new Cellist();
        
        musician.play(); // 피아노 연주 문자열 출력
        
    }
}

그렇다보니 추상화를 적용시킨 예시와 유사하게 결합도를 낮춰 유지보수 때 코드의 수정을 최소화할 수 있는 설계라고 이해했다.

 

public class Tests {
    public static void main(String[] args) {
    
    	// Musician musician = new Pianist();
        Musician musician = new Vilolist();
        // Musician musician = new Cellist();
        
        musician.play(); // 바이올린 연주 문자열 출력
        
    }
}

위의 코드에서 바이올리니스트 인스턴스를 생성해 play() 메소드를 호출하면, 동일한 이름의 메소드를 호출하는데도 위의 코드와는 다르게 바이올린 연주라는 문자열이 출력될 것이다.

 

이처럼 동일하게 musician 데이터 타입의 play() 메소드를 호출했는데 어떤 인스턴스를 생성했느냐에 따라 동작이 달라지므로, 상황에 따라 동일한(이름이 같은) 클래스나 메소드가 다른 방식으로 동작한다는 특징을 가지게 되었다.

 


정리

  • 다형성을 적용시킬 경우 코드를 간결하게 해 주며, 유연한 설계가 가능하다는 장점을 얻을 수 있다.
  • 주로 오버라이딩이나 오버로딩을 통해 다형성을 지원한다. 

 


해당 글은 개인이 공부하면서 정리한 글이기 때문에 정확하지 않은 내용이 있을 수 있습니다.

 

참조

https://wikidocs.net/269