Java/혼자 공부하는 자바

[혼공자] 4주차_chapter 7

예린lynn 2024. 1. 31. 00:44
728x90

√ 미션

1. 기본 미션 : 클래스의 타입 변환에는 어떤 것이 있는지 정리하고 공유하기

 

  - 자동 타입 변환

 자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것이다. 이때 자식은 부모 타입으로 자동 타입 변환이 가능하다. 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.

 

  - 강제 타입 변환

강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것이다. 이때 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

 

cf) 더 자세한 내용은 밑의 정리 참고

 

2. 선택 미션 : p.367 07-3 확인 문제 3번을 풀고 풀이 과정 설명하기

 

답: 

public class LoginServlet extends HttpServlet{

  @Override
  public void service(){
    System.out.println("로그인 합니다.");
  }
}

public class FileDownloadServlet extends HttpServlet{

  @Override
  public void service(){
    System.out.println("파일 다운로드 합니다.");
  }
}

 

 

Chapter 07 : 상속

1. 상속

  1) 클래스 상속

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스는 extends 뒤에 기술한다.

  • 자바는 다중 상속을 허용하지 않기 때문에 단 하나의 부모 클래스만 상속 가능하다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 
class 자식클래스 extends 부모클래스 {
  //필드
  //생성자
  //메소드
}

 

  2) 부모 상속자 호출

모든 객체는 클래스의 생성자를 호출해야만 생성되며, 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다. 만약 생성자가 명시적으로 선언되지 않으면, super()를 이용해서 부모의 기본 생성자를 호출한다.

//직접 자식 생성자를 선언하고 명시적으로 부모 생성자 호출

자식클래스( 매개변수선언, ... ){
  super( 매개값, ... );
  ...
 }

 

  3) 메소드 재정의

메소드 재정의는 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것이고, 다음과 같은 규칙을 따른다.

  • 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  • 접근 제한을 더 강하게 재정의할 수 없다.
  • 새로운 예외(Exception)를 throws할 수 없다.

 

만약 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생하면 명시적으로 super 키워드를 붙여서 부모 메소드를 호출한다.

 

  4) final 클래스와 final 메소드

final 키워드는 클래스, 필드, 메소드를 선언할 때 사용할 수 있는데, 해당 선언이 최종 상태이고 결코 수정될 수 없음을 의미한다. 필드 선언시 final은 초기값 설정 수 더 이상 값을 변경할 수 없음을 의미하고, 클래스와 메소드를 선언할 때 사용되면 상속과 관련이 있다는 의미이다.

 

클래스를 선언할 때 다음과 같이 final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스가 되어 자식 클래스를 만들 수 없다.

public final class 클래스 {...}

 

메소드 선언할 때 final 키워드를 붙이면 최종적인 메소드가 되어 재정의할 수 없다.

public final 리턴타입 메소드([매개변수, ...]){...}

 

2 . 타입 변환과 다형성

다형셩은 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질이다. 다형성을 구현하기 위해서는 메소드 재정의와 타입 변환이 필요하다.

 

  1) 자동 타입 변환

타입 변환이란 타입을 다른 타입으로 변환하는 행위이다. 자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것이다. 이때 자식은 부모 타입으로 자동 타입 변환이 가능하다. 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.

// 부모타입 변수 = 자식타입;

//Animal이 부모, Cat이 자식 클래스일 경우
Cat cat = new Cat();
Animal animal = cat;

 

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능하다. 단, 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출된다.

 

매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지 매개값으로 사용할 수 있다. 즉, 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행결과가 다양해질 수 있다.

//drive() 메소드에서 Vehicle 타입의 매개값을 받아서 run() 메소드 호출

public class Driver {
  public void drive(Vehicle vehicle){
    vehicle.run();
    }
}

 

  2) 강제 타입 변환

강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것이다. 이때 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

//자식타입 변수 = (자식타입) 부모타입;
//Child 객체가 Parent 타입으로 자동 변환된 상태에서 원래 Chile로 강제 변환

Parent parent = new Child(); //자동 타입 변환
Child child = (Child) parent; //강제 타입 변환

 

자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능하다는 제약이 따른다.

 

  3) instanceof 연산자

어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다. instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용된다. 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 한다,

//boolean result = 좌항(객체) isntanceof 우항(타입)

//parent 매개 변수가 참조하는 객체가 Child인지 조사
public void method(Parent parent){
  if(parent instanceof Child){
    Child child = (Child) parent;
  }
}

 

 3 . 추상 클래스 

객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하고, 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 가질 수 있다.

 

추상 클래스를 사용하는 용도는 다음과 같다.

  • 공통된 필드와 메소드의 이름 통일
  • 실체 클래스를 작성하는 시간 절약

추상 클래스를 선언할 때는 클래스 선언에 abstract 키워드를 붙인다. abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다. 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.

public abstract class 클래스 {
  //필드
  //생성자
  //메소드
}

 

메소드의 선언만 통일하고, 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 이런 경우를 위해 추상 클래스는 다음과 같이 추상 메소드를 선언할 수 있다. 자식 클래스는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.

//[public|protected] abstract 리턴타입 메소드이름(매개변수, ... );

//sound() 메소드 재정의
public abstract class Animal{
  public abstract void sound();
}
728x90