Book/자바의 정석

[자바의 정석] Chapter 7. 객체지향 프로그래밍 II - 오버라이딩, 접근 제어자, 다형성

yo0oni 2023. 7. 14. 11:54

오버라이딩

: 상위 클래스에게 상속받은 메서드를 그대로 사용하기도 하지만, 하위 클래스 자신에 맞게 변경하는 것이다.

 

오버라이딩 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

  1. 이름이 같아야 한다.
  2. 매개변수가 같아야 한다.
  3. 반환타입이 같아야 한다.

한마디로 요약하자면 선언부가 완전히 일치해야 한다.

  • 다만 접근 제어와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.
  • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 있다.
  • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 있다.

 

super

super는 자손 클래스에서 상위클래스로부터 상속받은 멤버를 참조하는 데 사용하는 참조 변수이다.

 

super()

super()는 상위클래스의 생성자를 호출하는데 사용된다.

 

static import문

static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.

import static java.lang.Math.random;

System.out.println(Math.random());        // 이 코드를
System.out.println(random());        // 이렇게 작성 가능

 

접근 제어자

접근 제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.

  • private : 같은 클래스 내에서만 접근이 가능하다
  • default : 같은 패키지 내에서만 접근이 가능하다.
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.
  • public : 접근 제한이 전혀 없다.

 

접근 제어자를 사용하는 이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한(내부적으로만 사용되는) 부분을 감추기 위해서

 

생성자의 접근 제어자

생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.

++ 생성자가 private인 클래스는 다른 클래스의 상위클래스가 될 수 없다. 왜냐하면 하위클래스의 인스턴스를 생성할 때 상위클래스의 생성자를 호출해야만 하는데, 생성자의 접근 제어자가 private이므로 하위클래스에서 호출하는 것이 불가능하기 때문이다.

 

제어자의 조합

  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
  3. abstract 메서드의 접근 제어자가 private일 수 없다.
  4. 메서드에 private과 final을 같이 사용할 필요는 없다.

 

다형성

다형성은 객체지향개념의 중요한 특징 중 하나이다. 이를 좀 더 구체적으로 말하자면, 상위클래스 타입의 참조변수로 하위클래스의 인스턴스를 참조할 수 있도록 한다.

  • 상위타입의 참조변수로 하위타입의 인스턴스를 참조할 수 있다.
  • 반대로 하위타입의 참조변수로 상위타입의 인스턴스를 참조할 수 없다.

참조변수의 형변환

  • 자손타입 → 조상타입 (Up-casting) : 형변환 생략 가능
  • 자손타입 ← 조상타입 (Down-casting) : 형변환 생략 불가능