Language/Java

Java - 상속 복습

둉이 2021. 6. 23. 12:17

 

상속

// 상속 예시
class 자식클래스 extends 부모클래스 {
   super();  // 부모 생성자(자동 생성), 반드시 첫 줄에 위치
   ...
}

- 특징

  1. private 접근 제한을 갖는 필드와 메소드는 상속 제외

  2. 클래스 다중상속 불가(인터페이스는 다중상속 가능)

  3. 부모가 먼저 생성 → 자식이 그 다음에 생성

- 장점: 코드 중복 제거

- super(): 부모 클래스의 생성자를 호출할 때 사용, 매개변수 지정 가능

 

 

메소드 재정의(=메소드 오버라이딩)

: 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우 자식 클래스에서 동일한 메소드를 재정의

  @Override 어노테이션을 앞에 붙임

class Parent {
   void method1() { ... }
   void method2() { ... }
}

class Child extends Parent {
   void method2() { ... }  // 메소드 오버라이딩
   ...
}

- 특징

  1. 부모 메소드와 동일한 리턴 타입과 메소드 이름, 매개변수 리스트여야 함

  2. 접근 제한을 더 강하게 오버라이딩할 수 없음

     ex) 부모 메소드가 private이면 자식 public, default 불가

  3. 예외처리 throws 불가

  4. 오버라이딩된 부모 클래스의 메소드 호출은 super.메소드명() 이용

  5. final 클래스는 상속 불가(final 클래스는 부모 클래스 불가)

     final 메소드는 오버라이딩 불가

 

 

protected

: 부모가 같은 필드/메소드 접근 가능

=> new 연산자를 사용하여 부모 생성자 직접 호출 불가 but 자식 생성자에서 super()를 사용하여 호출 가능

 

 

자동 타입 변환(Promotion)

: 자바의 다형성과 관련

// 타입 변환 예시
// Animal: 부모(상위 객체), Cat: 자식(하위 객체)
Cat cat = new Cat();
Animal animal = cat;

- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드/메소드만 접근 가능

  → 예외) 자식 클래스에서 오버라이딩된 메소드는 자식 클래스의 메소드가 호출

- 장점: 일부 자식 클래스 교체 가능

// 타입 변환 장점 예시
class Car {
   Tire frontLeftTire = new Tire();
   Tire frontRightTire = new Tire();
   Tire backLeftTire = new Tire();
   Tire backRightTire = new Tire();
   void run() { ... }
   ...
}
// -----------------------------------
...
main() {
   Car myCar = new Car();
   myCar.frontLeftTire = new HankookTire();
   myCar.backLeftTire  = enw KumhoTire();
   myCar.run();
}

- 배열로 객체를 관리하는 경우에도 자동 타입 변환이 가능

- 부모 객체를 매개변수로 받는 메소드에 자식 객체를 대입하면 자동 타입 변환이 일어남

 

 

강제 타입 변환(Casting)

- 자식 타입이 부모 타입으로 자동 변환된 후, 다시 자식 타입으로 변환할 때 강제 타입 변환 사용 가능

- 객체 타입 확인은 instanceof 메소드 사용

  ex) parent instanceof Child

 

 

추상 클래스

// 추상 클래스 예시
public abstract class 클래스 {
   ...
}

- 실체 클래스들의 공통적인 특성(필드, 메소드)을 추출하여 선언한 클래스
- new 연산자를 사용하여 인스턴스 생성 불가능

  (상속을 위한 부모 클래스로만 사용 가능)

- abstract를 앞에 붙여 선언

- 추상 메소드

  : 메소드의 선언부만 있고 중괄호는 없는 메소드 → 메소드 오버라이드용

   추상 클래스 내에서만 선언 가능