만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/JAVA

[JAVA] 다형성 (상속, 오버라이딩, 업캐스팅)

D36choi 2020. 9. 19. 20:31
728x90
다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
-www.opentutorials.org-

 

다형성의 대표적인 예로는 Override 가 있다. 클래스의 부모메소드에 정의되어있는 메소드를 자식클래스의 입맛에 맞게 다양한 형태로 바꿀 수 있음을 의미한다. 자바 다형성의 예시를 확인해보자.

Car 는 모든 자동차 종류의 부모 클래스다. 하위에는 자동차의 한 분류인 SUV 가 있다.

 

Main.java

class Main {
  public static void main(String[] args) {
    Car car = new Car();
    Car suv = new Suv();
    car.run();
    suv.run();
  }
}

 

Car.java

public class Car {
  int max_speed;

  public Car() {
    max_speed = 100;
  }
  public void run() {
    System.out.println("car is running..."+this.max_speed);
  }
}

 

Suv.java

public class Suv extends Car {
  
  int max_speed;
  public Suv() {
    max_speed = 150;
  }
  @Override
  public void run() {
    System.out.println("SUV is running..."+this.max_speed);
  }
}

 

Override annotation (@Override) 은 오버라이딩을 지시하는 어노테이션이 아니라, IDE의 문법체크 등의 가이드라인을 제시해주는 역할임을 유념하자. 실제 오버라이딩은 내부에서 일어난다.

실행 결과

같은 run() 메소드여도 인스턴스에 따라 알맞은 메소드를 찾아 실행한다

C++ 에서는 오버라이딩할 메소드에 'virtual' 키워드를 붙여 구분하지만 자바는 기본적으로 모든 method 를 virtual 로 취급한다. 그래서 만약 자식 클래스의 오버라이딩을 막고 싶다면 해당 메소드에 'final' 키워드를 추가해 다른 클래스에서 함수 변경을 할 수 없게 만든다. 이것이 오버라이딩이다.

 

업캐스팅

Car car = new Car();
Car suv = new Suv();

 

 

하나는 new 생성 연산자와 동일한 클래스타입. 하나는 부모타입 인스턴스를 자식 타입(Suv) 생성자에 의해 참조하고 생성한다.

Suv suv = new Car(); 는 에러가 뜨게된다. 형변환을 할 수 없다.

error: incompatible types: Car cannot be converted to Suv
    Suv suv1 = new Car();

자바는 상위클래스의 형변환. 즉 "upcasting" 을 지원한다. 다른 예로, 자바 클래스의 최상위 객체는 "Object" 이므로 내가 만드는 어떤 클래스든 Object 객체로 형변환 할 수도 있다.

ex) Object obj = new Integer(0);