다형성

허진혁·2022년 10월 10일
0

다형성

  • 하나의 객체가 다양한 형태를 가질 수 있는 것이다.
  • 보통 자식 클래스 타입이 부모 클래스 타입을 참조한다.
  • 상속, 추상화와 같이 OOP의 특징 중 하나이다.
class Shape {

	public Shape() {
		System.out.println("도형입니다.");
	}

	public void draw() {
		System.out.println("도형을 그립니다.");
	}
}

class Rectangle extends Shape {

	public Rectangle() {
		System.out.println("사각형 생성자");
	}

	@Override
	public void draw() {
		System.out.println("사각형 도형을 그립니다.");
	}

	public void draw2() {
		System.out.println("사각형도형 그리기2");
	}

}
public class SuperTest {

	public static void main(String[] args) {

		Shape shape = new Shape();
		shape.draw();

		Rectangle rec = new Rectangle();
		rec.draw();

		Shape shape2 = new Rectangle();
		shape2.draw();
		shape2.draw2();    //오류발생!!

	}

}
  • Shape 타입의 객체 shape2 에 자식 클래스인 Rectangle을 대입했다.
  • Shape클래스에는 draw2 메서드를 포함하고 있지 않기 때문에 shape2.draw2()는 에러가 발생한다.

메모리 구조

다형성의 장점

  1. 개발자가 여러 객체를 하나의 타입으로 관리가 가능하기 때문에 코드 관리가 편리해 유지보수가 용이하다.
  2. 다형성을 활용하면 객체를 재사용하기 쉬워지기 때문에 개발자의 코드 재사용성이 높아진다.

다형성 사용시 필수 조건

  1. 부모-자식 간 클래스 상속이 이루어져야 한다.
  2. 하위 클래스 메소드가 재정의(오버라이딩)되어 있어야 한다.
  3. 부모타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 한다.

업캐스팅과 다운캐스팅

업캐스팅

자식클래스의 객체가 부모클래스의 타입으로 형 변환이 되는 것

class TV {
	String name;
	int price;

	public void printTV() {
		System.out.println("TV가 보여요");
	}
}

class ColorTv extends TV{
	int color;

	@Override
	public void printTV() {
			System.out.println("Color TV가 보여요");
		}	
}

public class TvTest {
	public static void main(String[] args) {
			TV tv = new ColorTV();	 // upcatsing
			ColorTV tv = new TV();   // 컴파일 오류
	}
}

업캐스팅을 하는 이유

  1. 업캐스팅을 통해 부모클래스에서 반복된 메서드를 가져와서 하위클래스의 오버라이딩된 메서드를 사용하기 위해
  2. 상속을 받은 자식클래스들을 하나의 인스턴스로 묶어 관리하기 위해

다운캐스팅

업캐스팅 된 객체를 다시 부모클래스 타입의 객체로 형 변환하는 것

class TV {
	String name;
	int price;
}

class ColorTV extends TV{
	int color;	
}

public class TvTest {
	public static void main(String[] args) {
			TV tv = new ColorTV();	 // upcatsing
			ColorTV colorTV = (ColorTV) tv;			// downcasting
	}
}
profile
Don't ever say it's over if I'm breathing

0개의 댓글