[JAVA] 3주차 : 상속

INHEES·2023년 8월 15일

Java

목록 보기
5/13

JAVA 문법 3주차 : 상속

상속

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 방식
  • 코드의 중복이 제거되고, 재사용성이 크게 증가하여 생산성과 유지보수성에 매우 유리하다.
  • 클래스간의 관계는 상속관계 IS -A 로 표현된다.
  • JAVA는 다중상속을 허용하지 않는다.
  • 클래스에 final 키워드를 지정하면 상속이 불하능하 클래스가 된다.
  • 메서드 도한 final 키워드를 지정하면 오버라이딩이 불가능하다.
  public class 자식클래스 extends 부모클래스 {...}

Ojbect 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스이다.

  • Object clone() : 해당 객체의 복제본을 생성하여 반환함.
  • boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
  • Class getClass() : 해당 객체의 클래스 타입을 반환함.
  • int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함.
  • String toString() : 해당 객체의 정보를 문자열
    로 반환함. & Object 클래스에서는 클래스이름 @해쉬코드값 리턴함.

오버라이딩

부모 클래스로부터 상속받은 메서드의 내용을 자식 클래스가 재정의 하는 것을 오버라이딩이라고 한다.
오버라이딩을 하기위해서는 아래 조건들을 만족한다.
1. 예외는 부모 클래스의 메서드보다 많이 선언할 수 없다.
2. 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

   @Override // 오버라이딩한 함수 Annotaion 으로 표현
      public void horn() {
          booster();
      }

super

super 는 부모 클래스의 멤버를 참조가능한 키워드이다.
주로 자식 클래스 내부에서 선언한 멤버와 상속받은 멤버의 이름이 같을 경우 구분하기 위해 사용된다.

  public void setCarInfo(String model, String color, double price) {
      super.model = model; // model은 부모 필드에 set
      super.color = color; // color는 부모 필드에 set
      this.price = price; // price는 자식 필드에 set
  }

super()

super(...) 는 부모 클래스의 생성자를 호출하는 키워드이다.

  • 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져 하나의 인스턴스가 생성된다.
  • 위의 과정에서 부모 클래스의 멤버들의 초기화 작업이 먼저 수행되어야 한다.
  • 오버로딩된 부모 클래스의 생성자가 없더라도 기본 생성자를 컴파일러가 자동으로 추가해준다. super();
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
     // this.engine = engine; // 오류 발생
    super(model, color, price); // 부모 생성자 호출
    this.engine = engine;
}

다형성

다형성(polymorphism) 이란 여러 가지 형태를 가질 수 있는 능력을 의미한다. 클래스, 참조변수의 타입변환을 활용해서 다형성을 구현 한다.

  • 자동 타입변환 : 부모타입 변수 = 자식타입객체;
  • 강제 타입변환 : 자식타입 변수 = (자식타입) 부모타입객체;

=> 강제 타입변환은 자동 타입변환을 거친 자식타입객체가 다시 돌아가려고 할때만 가능하며, 부모타입 변수로는 자식타입객체의 고유 멤버를 사용할 수 없기 때문이다.

Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
========================================
public Car(Tire tire) {
    this.tire = tire;
}

...

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));

Tire getHankookTire() {
    return new HankookTire("HANKOOK");
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

...
// Tire : 부모, KiaTire : 자식
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();

instanceof

다형성의 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 명령어 이다.
{대상 객체} instance of {클래스 이름} 와 같은 형태로 사용하면 응답값은 boolean 입니다.


정리

이번시간에는 클래스의 상속에 대해 알아갈 수 있었다. 자식과 부모 클래스의 자유로운 변환과 쓰임에 대해 많은 연습이 필요할 듯하다. 다음 시간에는 인터페이스에 다룬다.

profile
이유를 찾아보자

0개의 댓글