다형성 polymorphism
다형성은 객체지향에서 중요한 개념으로, 하나의 객체나 메소드가 여러 형태를 가질 수 있는 것을 뜻한다.
인터페이스 정리에서 사용했던 GamingConsole 예시로 알아보는 다형성
public interface GamingConsole { // GamingConsole 인터페이스 선언
public void up();
public void down();
public void right();
public void left();
}
우선 이렇게 GamingConsole 인터페이스를 선언해준다. up, dow, right, left라는 메소드가 정의만 되어있을 뿐 구현은 되어있지 않다. 이제 이 메소드들을 구현하는 클래스인 MarioGame과 ChessGame을 각각 만들어준다.
public class MarioGame implements GamingConsole { // MarioGame으로 구현
@Override
public void up() {
System.out.println("Jump");
}
@Override
public void down() {
System.out.println("Goes into a hole");
}
@Override
public void right() {
System.out.println("Go Forward");
}
@Override
public void left() {
System.out.println("Go Back");
}
}
인터페이스의 메서드 up, down, right, left을 받아서 MarioGame 클래스에서 구현한 메서드의 동작은 위와 같다.
public class ChessGame implements GamingConsole { // ChessGame으로 구현
@Override
public void up() {
System.out.println("Move piece up");
}
@Override
public void down() {
System.out.println("Move piece down");
}
@Override
public void right() {
System.out.println("Move piece right");
}
@Override
public void left() {
System.out.println("Move piece left");
}
}
인터페이스의 메서드 up, down, right, left을 받아서 ChessGame 클래스에서 구현한 메서드의 동작은 위와 같다.
이제 main 메서드를 만들어서 MarioGame과 ChessGame 각각의 메서드( up, down, right, left )를 호출call해본다.
public class GameRunner {
public static void main(String[] args) {
GamingConsole[] games = {new MarioGame(), new ChessGame()};
// MarioGame과 ChessGame의 배열을 만들어서 games 배열에 저장한다.
for(GamingConsole games:games) { //메서드 콜
game.up();
game.down();
game.left();
game.right();
}
}
}
출력 결과는 아래와 같다.
Jump
Goes into a hole
Go Forward
Go Back
Move piece up
Move piece down
Move piece left
Move piece right
MarioGame부터 호출했기에 MarioGame에서 정의한 메서드의 행동이 실행되었고, 그 다음에 차례로 ChessGame의 메서드들이 실행되었다. 같은 game.up() 이라는 코드를 실행했지만, 결과는 Jump와 Move piece up으로 각각 다르다는 것을 알 수 있다.
이처럼 실행되는 코드는 동일하나 각각 다른 결과를 내는 것이 다형성의 개념이다.