(1) 중복되는 코드를 줄일 수 있다.
(2) 이미 존재하는 클래스의 필드와 메소드를 재사용할 수 있다.
-> 가장 부모인 클래스의 결과값이 먼저 나온다
(1) 오버로딩& 오버라이딩
(2) 참조 변수의 형변환
(3) 함수형 인터페이스
(1) 업캐스팅: 자바에서는 부모 클래스가 자식 클래스의 인스턴스를 참조할 수 있도록 구현함 -> 형변환 없이 들어감. 즉, 부모 = 자식으로 들어가는 것
Shape shape = new Rectangle(); // 부모 클래스: Shape, 자식 클래스 Rectangle
Aninal animal = new Lion();
Predator predator = new Lion();
// 이 때 animal과 predator가 사용할 수 있는 메소드는 다르다
// animal과 predator이 원래 가지고 있는 메소드를 사용할 수 있다
// 만약 animal과 predator이 가지고 있는 메소드를 모두 사용하고 싶으면 새로운 인터페이스를 사용하여 만들 수 있다.
//컴파일 에러
Rectangle rectangle = new Shape();
Lion lion = new Animal();
Lion lion = new Predator();
(2) 다운캐스팅: 자식 클래스가 부모 클래스를 참조하여 형변환
class A{
private int a;
public getA(){
...
}
}
class B extends A{
private int b;
public getB(){
...
}
}
A a = new B(); // 1번
B b = new A(); // 2번, 에러
(1) A a = new B()
: a가 B를 참조하였으므로 부모 클래스인 A와 B 모두 존재함 -> 따라서 주소값 2000을 통해서 들어가면 b를 확인할 수 있으므로 컴파일 에러가 발생하지 않음
(2) B b = new A()
: b를 A를 참조하였으므로 B 부분은 제거됨 -> 주소값 2000을 통해서 들어가면 b를 확인할 수 없으므로 컴파일 에러가 발생함
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("사각형 도형을 그립니다.");
}
}
class Triangle extends Shape {
public Triangle() {
System.out.println("삼각형 생성자");
}
@Override
public void draw() {
System.out.println("삼각형 도형을 그립니다.");
}
public void draw2() {
System.out.println("삼각형 도형을 그립니다.");
}
}
public class Poly {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.draw();
rectangle.draw2();
Shape shape2 = new Rectangle();
shape2.draw();
shape2.draw2(); // Shape 클래스에서 draw2라는 메소드를 포함하고 있지 않으므로 에러가 발생
shape2 = new Triangle();
shape2.draw();
}
다음 시간에
참고 링크
https://sso-feeling.tistory.com/88
http://www.tcpschool.com/java/java_polymorphism_concept
https://wikidocs.net/269