지금을 사는 사람

혼자 공부하는 자바 4주차 본문

스터디/혼공학습단

혼자 공부하는 자바 4주차

지금회 2024. 1. 28. 21:36
728x90

기본미션

클래스의 타입 변환에는 어떤 것이 있는지 정리하고 공유하기

  • 자동 타입 변환
    • 실행 도중 자동적으로 타입 변환
    • 부모의 특징, 기능 상속 받음
    • 바로 위 부모가 아니어도 상속 계층에 상위 타입이면 자동 변환
    • 변환 이후 부모 클래스에 선언된 필드, 메소드만 접근 가능
    • 부모타입 변수 = 자식 타입;
  • 강제 타입 변환
    • 자동 타입 변환이 된 클래스에 한하여 자식 타입으로 다시 변환이 가능
    • instanceof 연산자를 사용하여 참조 객체 확인
    • 자식타입 변수 = (자식타입) 부모타입;

Chapter 07 : 상속

상속

  • 부모 클래스의 멤버를 자식 클래스에게 물려주는 것

클래스 상속

  • 프로그램에서는 자식이 부모를 선택
  • class 자식클래스 extends 부모클래스 { // 필드 // 생성자 // 메소드 }
  • 자바에서 상속 특징
    • 여러 개의 부모 클래스를 상속할 수 없음
    • 부모 클래스의 private 접근 제한을 갖는 필드와 메소드는 대상에서 제외
    • 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외

부모 생성자 호출

  • 자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다.
  • 자식 객체 생성자의 첫줄에서 부모 생성자가 호출된다.
  • super();는 부모의 기본 생성자를 호출한다.
  • super( 매개값 ); 과 같이 명시적으로 부모 생성자를 호출 가능하다.

메소드 재정의

  • 상속 받은 메소드를 자식 메소드에서 수정해야 할 필요가 있을 때 재정의하여 사용한다.
  • 부모의 메소드와 동일한 시그니처를 가져야한다.
  • 접근 제한을 더 강하게 재정의할 수 없다.
  • 새로운 예외를 throws할 수 없다.

부모 메소드 호출

super.부모메소드();

final 클래스와 final 메소드

  • final 키워드는 클래스, 필드, 메소드를 선언할 때 사용할 수 있는데, 해당 선언이 최종 상태이고 결코 수정될 수 없음을 뜻한다.

상속할 수 없는 final 클래스

public final class 클래스 {...}
  • final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.

재정의할 수 없는 final 메소드

public final 리턴타입 메소드( 매개변수 ) { ... }
  • final 메소드는 자식 클래스에서 재정의 할 수 없다.

타입 변환과 다형성

  • 다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질

자동 타입 변환

  • 자동 타입 변환 (promotion) : 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것
    Cat cat = new Cat();
    Animal animal = cat;
    또는
    Animal animal = new Cat();

필드의 다형성

  • 자동 타입이 필요한 이유는 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있다.

매개 변수의 다형성

  • 메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.
    class Driver {
      void drive(Vehicle vehicle) {
          vehicle.run();
      }
    }
    

Driver driver = new Driver();

Bus bus = new Bus();

driver.drive(bus); // Vehicle vehicle = bus; 자동 타입 변환 발생


### 강제 타입 변환
- 부모 타입을 자식 타입으로 변환하는 것
- 모든 부모타입을 자식 타입으로 강제 변환 할 수 있는 것은 아님
- 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용 가능
```java
Parent parent = new Child();
Child child = (Child) parent;

객체 타입 확인

  • 강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 있는 상태에서만 가능하기 때문에 다음과 같이 처음부터 부모 타입으로 생성된 객체는 자식 타입으로 변환 불가
    Parent parent = new Parent();
    Child child = (Child) parent; // 강제 타입 변환 불가
  • 참조하는 객체가 부모 객체인지 자식 객체인지 확인하는 방법 : instanceof 연산자 사용
    boolean result = 좌항(객체) instanceof 우항(타입)
    

public void method(Parent parent) {
if (parent instanceof Child) {
Child child = (Child) parent;
}
}


## 추상 클래스
- 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다.

## 추상 클래스의 용도
- 공통된 필드와 메소드의 이름을 통일할 목적
- 실체 클래스를 작성할 때 시간 절약

### 추상 클래스 선언
```java
    public abstract class 클래스 {
        // 필드
        // 생성자
        // 메소드
    }

추상 메소드와 재정의

  • 메소드의 선언만 통일하고, 실행 내용은 실체 클래스마다 달라야 하는 경우 추상 메소드가 필요하다.
    public abstract class Animal {
      public abstract void sound();
    }
728x90