반응형
안녕하세요, 스코리아입니다.
오늘은 자바의 객체지향의 핵심이라고 할 수 있는 다형성에 대해서 알아보도록 하겠습니다.
다형성 (polymorphism) 이란?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 즉, 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질
- 같은 코드에서 여러 실행 결과가 나옴
- 객체지향의 중요한 부분 중 하나임 (상속, 정보은닉 등)
- 다형성을 잘 활용해서 프로그래밍을 하면 유연하고 확정석 있는 유지보수가 편한 프로그램 코드를 짤 수 있음
자동타입변환
- 부모 타입에는 모든 객체 대입 가능 (자식 타입은 부모 타입으로 자동 변환)
- 효과: 객체를 부품화 시킬 수 있음 (다형성으로 연결됨)
- 자동타입변환의 자세한 내용 참고하기: https://skorea6.tistory.com/22
매개변수의 다형성
- 매개변수가 부모 클래스 타입일 경우 : 해당 클래스의 객체를 대입하는 것이 원칙이나 자식 객체를 대입하는 것도 허용됨
- 즉, 자동타입변환과 다형성이 활용
다형성 직접 사용하기 (예시)
- Animal class를 만들고, 안에 move 메소드를 만들어주겠습니다.
- 그리고 Human, Tiger, Eagle 3개의 클래스는 Animal 클래스를 extends (상속) 하도록 하며, Animal(부모) 클래스의 move 메소드를 오버라이딩하여 모두 작성해 주었습니다.
class Animal{
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
@Override
public void move() {
System.out.println("사람이 두발로 걷습니다.");
}
}
class Tiger extends Animal{
@Override
public void move() {
System.out.println("호랑이가 네 발로 뜁니다.");
}
}
class Eagle extends Animal{
@Override
public void move() {
System.out.println("독수리가 하늘을 날아갑니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
moveAnimal(hAnimal); // [1] 다형성이 지켜짐.
moveAnimal(tAnimal);
moveAnimal(eAnimal);
System.out.println();
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for(Animal animal : animalList) {
animal.move(); // [2] 다형성이 지켜짐.
}
}
public static void moveAnimal(Animal animal) { // 매개변수의 다형성
animal.move();
}
}
AnimalTest class를 만들고 main 함수 안에 테스트 코드를 짜보겠습니다.
먼저 매개변수의 다형성을 사용해 보겠습니다.
- moveAnimal 메소드를 생성하고 매개변수에는 Animal(부모 클래스)를 넣었습니다. 그리고 메소드 안에 move 메소드를 호출하였습니다.
- 이렇게 되면 매개변수의 다형성이 지켜진 것으로 볼 수 있습니다. moveAnimal 메소드의 매개변수에 부모 클래스인 Animal이 오게 되면 상속된 자식 클래스들(Human, Tiger, Eagle)중 아무거나 올 수 있습니다.
- move 메소드는 Animal(부모 클래스)에 정의되어 있고 자식 클래스들이 모두 재정의(오버라이딩) 한 상태이므로, 다형성을 지키며 호출할 수 있습니다.
그리고 ArrayList에서 다형성을 사용해보았습니다.
- animalList 이름을 가지는 ArrayList에 Animal(부모 클래스)를 타입으로 하여 만들어 봅시다.
- ArrayList인 animalList을 이용해 향상된 for문을 돌리고 안에 move 메소드를 호출합니다.
- 이렇게 되면 다형성이 지켜진 것으로, 같은 코드에서 여러 다른 실행 결과가 나옵니다. 즉, 하나의 코드가 여러 자료형으로 구현되어 실행됩니다.
자식 클래스에 부모 클래스를 오버라이딩한 메소드 외에도 다른 메소드(자식 클래스만의 메소드)를 적을 수도 있습니다.
이럴 경우 moveAnimal 메소드에서 해당 메소드를 그대로 호출할 수는 없습니다. 꼭 자식 타입이 맞는지 확인 후 해당 메소드를 호출하여합니다. 이에 관한 자세한 내용은 다음시간에 instanceof를 이용해 알아보겠습니다. (https://skorea6.tistory.com/27)
다형성을 사용하는 이유
- 위의 예제에서 자식 클래스인 Cat을 추가해야 한다고 할 때, 손쉽게 추가할 수 있음
- 상속과 메소드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
- 그렇지 않고 if-else if문을 이용해서 구현해 버리면 코드의 유지보수가 어려워짐 (아래와 같이)
if(animal.equals("human")){
}else if(animal.equals("tiger")){
}else if(animal.equals("eagle")){
}
- 상위 클래스에서는 공통적인 부분을 작성하고, 하위 클래스에서는 각 클래스에 맞는 기능 구현
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링할 수 있음 => 다형성
지금까지 자바(Java)의 다형성에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
반응형
'JAVA > 객체지향' 카테고리의 다른 글
자바 추상클래스 의미, 구현 방법 (abstract class) (2) | 2023.09.08 |
---|---|
자바 강제타입변환(다운케스팅 형변환) 의미, 사용방법 (2) | 2023.09.06 |
자바 메소드 재정의 의미, 사용방법 (@Override) (3) | 2023.08.31 |
자바 자동타입변환(업케스팅 형변환) 의미, 사용 방법 (2) | 2023.08.29 |
자바 객체 간의 상속(extend) 의미, 구현방법 (3) | 2023.08.25 |