티스토리 뷰

다형성이란? 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미

 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있다.



Java에서 다형성은 상속과 인터페이스를 통해 이루어지며, 

인터페이스가 상속보다 다형성에 더욱 유연함을 제공합니다.




참조변수의 형변환

 - 기본형 변수와 같이 참조변수도 형변환이 가능하다.

서로 상속관계에 있는 클래스 사이에서만 가능하다.



형변환 

생략 여부

자손타입 -> 조상타입 (Up-casting)

형 변환 생략 가능

자손타입 <- 부모타입 (Down-casting)

형 변환 생략 불가능




다형성의 upcastingdowncasting을 실습으로 공부하겠습니다.


upcasting,downcasting을 사용하는 main 클래스

public class ExamplePolymorphism {
	public static void main(String[] args) {

		// UpCasting
		// 자식 is a 부모가 성립된다.(문법X, 논리O)

		Shape s = new Circle(10); // 원을 만들고 이걸 도형이라고 부른다.
		s.makeArea(); // 도형의 넓이를 구해라 => 원의 넓이를 구해라.

		System.out.println(s); // 원을 도형으로 부르겠다. 도형을 객체로 불러서
								// 객체의 정보를 출력해라. -> 원에 대한 정보를 출력해라.
								// println(Object x)

		// DownCasting
		// 부모 is a 자식 (문법X, 논리X) -> 컴파일 에러...
		// Cirlce c = new Shape(); // 추상클래스가 아니더라도 논리적으로 알맞지 않기 떄문에 컴파일 에러
		// 도형은 원이다...(X)

		// 하지만 도형이 애초에 어떠한(원 or 사각형)도형으로 만들어져 있었다면 논리적으로 맞다.
		// 이 도형은 원이다.

		Circle c = (Circle) s; // 이 도형은 원이다.
		Shape s1 = new Square(10, 20);
		Square sq = (Square) s1; // 이 도형은 사각형이다. (문법O, 논리O)
									// 애초에 도형이 원으로 만들어져 있기 때문에

		Square sq1 = (Square) s; // 컴파일에서는 에러가 안나지만, 실행 시에 에러가 난다.
									// (잘못된 DownCasting)
									// ClassCastException (형 변환 예외)

	}
}



Shape 추상클래스

public abstract class Shape {

	protected double area;

	public abstract void makeArea();

}



Shape클래스를 상속받은 Square 클래스

public class Square extends Shape {

	private int width;
	private int height;

	public Square(int width, int height) {
		this.height = height;
		this.width = width;
	}

	@Override
	public void makeArea() {
		super.area = this.height * this.width;
	}
	@Override
	public String toString() {
		return "Square [width="+this.width+" height="+this.height+" area="+super.area+"]";
	}
}



Shape클래스를 상속받은 Circle 클래스

public class Circle extends Shape {

	private int r;

	public Circle(int r) {
		this.r = r;
	}

	@Override
	public void makeArea() {
		super.area = Math.pow(this.r, 2) * Math.PI;
	}

	@Override
	public String toString() {
		return "Circle [r=" + this.r + " area=" + super.area + "]";
	}
}


반응형
LIST
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함