본문 바로가기
Programming/Java

자바 다형성(Polymorphism)

by hyunipad 2021. 1. 9.
반응형

다형성이란 "다양한 형태를 가진 성질"입니다. 자바에서 다형성을 이용한 기법들은 오버 로딩, 오버 라이딩, 형 변환 등이 있습니다. 자바에서 다형성을 사용하는 이유는 코드의 절감 때문입니다. 똑같은 형태를 가진 요소들을 재사용하거나 기능을 조금 수정해서 사용하는 것이죠.

 

이번 포스팅에선 형변환중 하나인 업 캐스팅, 다운 캐스팅에 대해 알아보겠습니다.

오버 로딩과 오버 라이딩이 궁금하신 분들은 아래의 게시글을 참고해주세요.

2021/01/06 - [Java] - 자바 상속과 오버 라이딩

 

자바 상속과 오버라이딩

상속이란 무엇일까요? 부모님에게 상속을 받으면 부모님이 가지고 있는 것의 모든 것들을 물려받을 수 있습니다. 자바에서의 상속은 기존 클래스의 변수나 메서드를 다른 클래스에서 재사용하

hyunipad.tistory.com

2021/01/06 - [Java] - 자바 클래스, 인스턴스, 메서드, 생성자, 오버 로딩

 

자바 클래스, 인스턴스, 메서드, 생성자, 오버로딩

클래스와 인스턴스 자바는 흔히 객체지향적인 언어라고 말합니다. 그렇다면 객체지향적 프로그래밍이라는 것은 무엇을 뜻하는 걸까요? ​ Object Oriented Programming(객체지향적 프로그래밍) is A.P.I.E

hyunipad.tistory.com

 

현실 세계에서의 형변환

 

현실 세계에서 먼저 형 변환을 이해해 보도록 하면

상위 개념인 동물 안에 호랑이, 사람, 토끼라는 하위 개념이 포함되어 있습니다. 

따라서 사람은 자기 자신의 특성인 사람의 특성과 동물의 특성을 가지고 있습니다. 

그렇기 때문에 모든 사람은 동물이라고 할 수 있죠. 

하지만 그렇다고 해서 모든 동물이 사람인 것은 아닙니다. 이러한 개념을 자바로 들고 가보도록 하겠습니다.

 

자바에서의 형변환

 

자바에서 자식 클래스가 객체는 부모 클래스의 객체가 될 수 있지만

부모 클래스의 객체는 자식 클래스의 객체가 될 수 없습니다.

모든 사람은 동물이지만, 모든 동물이 사람이라고 볼 수 없는 것과 같은 개념이죠.

여기서 자식 클래스가 부모 클래스의 객체로 형 변환하는 것을 업캐스팅이라고 합니다.

 

그렇다면 자바에서 업 캐스팅이 필요한 이유는 무엇일까요?

바로 코드의 절감 때문입니다.

코드를 예시로 들어보겠습니다.

 

//객체를 배열에 담아보기
Dog[] dogs = new Dog[10];
dogs[0] = new Dog();
Cat[] cats = new Cat[10];
cats[0] = new Cat();
Tiger[] tigers = new Tiger[10]
tigers[0] = new Tiger();

객체를 생성하여 배열로 관리한다고 가정을 한다면

다형성을 이용하지 않을 때는 이처럼 각각 배열을 선언해 주고 객체를 담아야 합니다.

하지만 다형성을 이용한다면 Animal이라는 배열 안에 모두 담을 수 있습니다.

Animal[] animals = new Animal[10]
animals[0] = new Dog(); // 강아지 => 동물로 업캐스팅
animals[1] = new Cat(); // 고앙이 => 동물로 업캐스팅
animals[2] = new Tiger(); // 호랑이 => 동물로 업캐스팅

코드의 절감이 보이시나요? 객체의 수가 많으면 많아질수록 길이에 차이가 나겠죠?

이렇게 코드를 절감할 수 있지만, 업 캐스팅이 된 객체는 자신의 고유한 성질을 잃어버리게 됩니다.

역시 코드를 통해 확인해보도록 하죠

package hyuni;

public class AnimalEx {

	public static void main(String[] args) {
		Animal[] animals = new Animal[10];
		
		animals[0] = new Dog(); // Dog => Animal 업캐스팅
		animals[1] = new Cat();
		
}

class Animal{
	public void 울음소리() {
		System.out.println("동물은 울음소리를 낸다.");
	}
}

class Dog extends Animal {

	@Override
	public void 울음소리() {  // animal클래스의 울음소리를 상속받아 오버라이딩한 메소드
		System.out.println("멍멍");
	}
	
	public void 개사료먹기() { // Dog의 고유한 메소드
		
	
	
}

class Cat extends Animal {

	@Override
	public void 울음소리() {
		System.out.println("야옹");
	}
	
	public void 고양이사료먹기() {
		
	}
}

위의 코드는 Animal 클래스를 상속받은 Dog 클래스를 Animal(animals [0])으로 업 캐스팅한 코드입니다.

그렇다면 animal [0]의 성질 즉 메서드를 확인해볼까요?

 

업 캐스팅 후

오버 라이딩된 울음소리 메서드 외의 자신의 고유한 메서드인 개 사료 먹기() 메서드가 보이지 않습니다.

이처럼 업 캐스팅된 객체는 공통적으로 가지고 있는 메서드 외의 자신의 고유한 메서드는 사라지게 됩니다.

하지만 걱정하지 마세요. 업 캐스팅된 객체는 다운 캐스팅을 다시 해주면 됩니다.

 

다운 캐스팅 후

 

 

이처럼 다형성의 성질을 잘 이용한다면 깔끔한 코드를 작성할 수 있습니다.

반응형

댓글