Polymorphism - 다형(多形)성이란?
하나의 타입으로 여러 타입으로 파생된 타입의 객체들을 참조하는 것.
이를 통해 오버라이딩된 메서드는 생성된 타입의 메서드가 호출되도록 동작하므로
하나의 메서드 호출이 여러 형태를 나타낼 수 있도록 하는 특성인 것이다.
다음 예를 통해 다형성 개념을 이해하도록 한다.
개와 고양이를 클래스로 표현하면 다음과 같이 표현할 수 있다.
개 클래스
고양이 클래스
강아지와 고양이는 모두 동물이다.
이를 통해 공통적인 기능은 새로운 클래스를 만들어 작성한다.
동물 클래스
개와 고양이 클래스는 동물 클래스를 상속한다.
개와 고양이 클래스는 동물이 가지는 메서드에 대해 오버라이딩한 개념이 적용되었다.
동물클래스를 상속받았으므로 개 객체와 고양이 객체는 동물타입으로 참조가능(다형성)
다음 예제 실행
package exam;
class 동물 {
void 소리() {
System.out.println("동물소리를 낸다.");
}
void 움직임() {
System.out.println("동물같이 움직인다.");
}
}
class 개 extends 동물 {
String 이름;
String 특화능력;
void 소리() {
System.out.println(이름 + "가 개 소리를 냄");
}
void 움직임() {
System.out.println(이름 + "가 개 같이 움직임");
}
void 특화능력() {
System.out.println(이름 + "의 " + 특화능력 + "발휘");
}
}
class 고양이 extends 동물 {
String 이름;
void 소리() {
System.out.println(이름 + "가 고양이 소리를 냄");
}
void 움직임() {
System.out.println(이름 + "가 고양이 같이 움직임");
}
void 벽타기() {
System.out.println(이름 + "가 발톱을 세워 벽을 탄다.");
}
}
public class Exam {
public static void main(String[] args) {
개 dog = new 개();
dog.이름 = "누렁이";
dog.특화능력 = "마약탐지";
dog.소리();
dog.움직임();
dog.특화능력();
System.out.println("======================");
고양이 cat = new 고양이();
cat.이름 = "까까";
cat.소리();
cat.움직임();
cat.벽타기();
System.out.println("======================");
동물 animal1 = dog; // up-casting
동물 animal2 = cat; // up-casting
동물[] animals = new 동물[] { animal1, animal2 };
for (int i = 0; i < animals.length; i++) {
animals[i].소리();
animals[i].움직임();
System.out.println("======================");
}
}
}
실행결과
dog와 cat참조변수는 각각 개의 멤버와 고양이의 멤버 모두를 참조할 수 있다.
동물타입으로 배열을 만들어 dog, cat을 참조한다.
이 때 동물 타입으로는 개 클래스의 특화능력()이나 고양이클래스의 벽타기()는 호출할 수 없다.
동물의 타입만 참조할 수 있기 때문이다. 자식의 멤버는 참조불가
하지만 객체자체가 바뀐 것은 아니다. 따라서 다운캐스팅을 해주면 사용이 가능하다.
다음과 같이 코드 수정
실행하면?
위 결과를 보면 동물이 참조하는 객체는 실제로 각 자식클래스로 만들어진 객체이다.
업캐스팅 했다고 변하지 않으며 객체를 마구잡이로 형변환이 가능한 것도 아니다.
따라서 첫 번째 객체는 개로 변환하여 모든 멤버를 정상적으로 확인했지만
두 번째 객체는 고양이인데 개로 명시하도록 하니 문제가 발생된 것이다.
위와 같이 상위 타입으로 하위 객체를 참조하는 경우 오버라이딩 되지 않은 메서드는
정확하게 객체에 맞는 타입으로 참조하여 호출해야 한다.
이 때 사용하는 키워드가 instanceof 연산이다.
instanceof는 참조변수가 참조하는 객체의 타입을 확인하여 boolean 값을 반환
형식 : 참조변수 instanceof 클래스명
instanceof를 적용해본다.
실행결과
instanceof를 이용하면 객체의 타입을 확인하여 적절하게 형 변환할 수 있다.
하지만 instanceof를 남발하는 것은 객체의 일관성이 떨어진다는 것으로
관리가 더 어려워질 수 있으니 주의하도록 한다.
위 개념을 이용하여 상속과 오버라이딩을 통한 다형성 개념을 더 표현해 보도록 한다.
'교육자료 > Java' 카테고리의 다른 글
Java 추상 클래스(abstract class) (0) | 2017.06.25 |
---|---|
Java 객체 비교하기 (0) | 2017.06.25 |
Java 클래스 구성 요소(Overriding) (0) | 2017.06.25 |
Java 클래스 구성 요소 (0) | 2017.06.25 |
Java 클래스 구성 요소 (상속) (0) | 2017.06.23 |