티스토리 뷰
다형성이란? 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미
한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있다.
Java에서 다형성은 상속과 인터페이스를 통해 이루어지며,
인터페이스가 상속보다 다형성에 더욱 유연함을 제공합니다.
참조변수의 형변환
- 기본형 변수와 같이 참조변수도 형변환이 가능하다.
서로 상속관계에 있는 클래스 사이에서만 가능하다.
형변환 | 생략 여부 |
자손타입 -> 조상타입 (Up-casting) |
형 변환 생략 가능 |
자손타입 <- 부모타입 (Down-casting) |
형 변환 생략 불가능 |
다형성의 upcasting과 downcasting을 실습으로 공부하겠습니다.
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
'프로그래밍 > Java' 카테고리의 다른 글
| 자바 ! 사용자 정의 예외처리 ( Exception, RuntimeException, try ~ catch ~ finally ) (0) | 2017.05.09 |
|---|---|
| 자바 ! 예외처리 ( Exception , try ~ catch ~ finally) (0) | 2017.05.08 |
| 자바 ! Object 클래스 ( toString(), equals() 메소드 등..) (0) | 2017.05.01 |
| 자바 ! 인터페이스 (interface) (0) | 2017.04.30 |
| 자바 ! 오버라이딩, 추상클래스 (overriding, abstract) (1) | 2017.04.26 |
댓글
