자바의 정석 chapter 7

inho ha·2022년 3월 1일
0

자바의 정석

목록 보기
7/18

상속

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
적은 양의 코드로 새로운 클래스를 작성할 수 있다
코드를 공통적으로 관리할 수 있어 유지보수가 용이하다.

생성자와 초기화 블럭은 상속되지 않는다.
멤버만 상속된다.
자손 클래스의 멤버 개수는 항상 조상 클래스보다 같거나 많다.

포함 (composite)

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것

class Circle {
	Point p = new Point();
    int r;
}

'~은 ~이다' 라는 문장이 성립하면 상속
'~은 ~을 가지고 있다' 라는 문장이 성립하면 포함관계를 사용하는 것이 자연스럽다.

단일 상속

c++은 여러 조상 클래스로부터 상속받는 것이 가능한 다중상속을 허용하지만
java에서는 단일 상속만 허용한다

다중상속시 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있지만
클래스간의 관계가 매우 복잡해지고 다른 클래스에 같은 이름의 멤버를 구별할 수 없다.

Object 클래스

모든 클래스의 조상 클래스이다.
상속받지 않는 클래스는 컴파일시 자동으로 Object 클래스를 상속받는다.

오버라이딩

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

오버라이딩 하기위해 변경하는 메서드는
1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.

접근 제어자와 예외는 제한된 조건에서만 오버라이딩 가능하다.
1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
조상의 메서드가 protected 라면 오버라이딩 하는 메서드는 protected이거나 public 이어야한다.
2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
3. 인스턴스는 인스턴스로, static은 static으로 유지해야한다.

super

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

super()

조상 클래스의 생성자를 호출하는데 사용된다.
자손 클래스는 조상 클래스의 멤버의 초기화 작업이 수행되어야 하기 때문에 Object클래스를 제외한 모든 클래스는 첫 줄에 자신의 다른 생성자 혹은 조상의 생성자를 호출해야한다.
그렇지 않으면 컴파일러가 자동적으로 super();를 첫줄에 삽입한다.

package

클래스의 묶음
패키지는 물리적으로 하나의 디렉토리이다.
java.lang.String은 java/lang/ 에 속한 String.class파일이다.
모든 클래스는 반드시 하나의 패키지에 속해야한다.
패키지를 지정하지 않으면 이름없는 패키지(unnamed package)에 속하게 된다.
패키지의 루트 디렉토리를 classpath에 포함시키면 jvm이 패키지를 찾을 수 있다.

import

소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스이름을 사용해야하는데 import를 하면 패키지명을 자동으로 붙여준다.

import시 *을 사용하면 컴파일 단계에서 사용하는 클래스를 찾기 때문에 실행 시 성능상의 차이는 전혀 없다.
하지만 패키지의 수가 많을 경우 클래스가 어떤 패키지에 속하는지 구별하기 어려울 수 있다.

static import

import 시 static을 붙여주면 클래스이름을 생략하고 static 멤버를 호출할 수 있다.

제어자

접근 제어자 : public, protected, default, private
그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp

abstract

클래스에 사용하면 해당 클래스에 추상 메서드가 선언되어 있다는 의미
메서드에 사용하면 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 의미
추상 클래스는 인스턴스를 생성할 수 없다.

접근 제어자

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

생성자를 private으로 하는 경우 다른 메서드를 통해 인스턴스를 리턴하게 한다.
이때 인스턴스의 개수를 제한하는 식으로도 활용가능
생성자가 private 인 클래스는 생성자를 다른 클래스에서 호출 못하므로 다른 클래스에서 상속받지 못한다.
fianl로 상속할 수 없는 클래스라고 명시하는 것이 좋다.

제어자의 조합

  1. static과 abstract를 함께 사용할 수 없다.
  2. 클래스에 abstract과 final을 함께 사용할 수 없다.
  3. abstract 메서드에 private으로 설정할 수 없다.
  4. 메서드에 private과 final을 같이 사용할 필요는 없다.
profile
iha / ian / inho ha

0개의 댓글