자바의 정석 7장. 객체지향 프로그래밍 II

자바의 정석(남궁성) 독후감 형식의 글입니다

7장. 객체지향 프로그래밍 II

1.1상속의 정의와 장점

  1. 재사용성을 높히고
  2. 코드의 중복을 제거하여
  3. 생산성과 유지보수성을 높힌다.
왜 상속에 해당하는 키워드가 inherit이 아니고 extends인가

상속을 거듭할수록 상속받는 클래스의 멤버 개수가 점점 늘어나기 때문

JPA의 최상위 모델객체 예제
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
    @Id
    @GeneratedValue
    private Long id;
		@CreatedBy
    private String regUserId;
		@LastModifiedBy
    private String modUserId;
		@CreatedDate
    private Date regDate;
		@LastModifiedDate
    private Date modDate;
    @Version
    private Integer version;
}

@Entity
public class File extends BaseEntity {
    private String name;
    private String content;
}

1.2 클래스간의 관계 - 포함관계

언제 포함관계를 사용하는가?

https://stackoverflow.com/a/37624298/4766882

언제나 상속 대신 포함관계 사용이 가능하다.

언제 상속관계를 사용하는가
  1. 자식이 부모에 대해 ‘is a’ 관계인 동시에 자식이 부모의 모든 기능을 다 가지고 있을 때
  2. 다중상속을 할 수 없으므로(?) : “VCR클래스는 TVCR클래스에 포함” p.325
ex) 사각형과 정사각형 문제
  1. 사각형 클래스에 가로길이_늘리기()가 정의되어 있다고 하자.
  2. 정사각형 클래스는 사각형 클래스를 상속했다.
  3. 정사각형 객체에서 사각형 클래스의 가로길이_늘리기()를 호출하는 순간 정사각형은 더 이상 정사각형이 아니게 된다.

2.3 오버로딩 vs 오버라이딩

2.4 super

  • 메소드 체이닝 샘플 p.331

3.3 import문

한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 패키지명.*과 같이 하는것이 편리하다 ☛ IDE의 import정리기능을 써서 사용할 클래스들을 명시적으로 import 것이 좋다. import만 보면 어떤 클래스들을 쓰는지(dependency)를 쉽게 파악할 수 있기 때문.

4.2 static - 클래스의, 공통적인 p.344

static의 사전적 의미 : 정적인, 변하지 않는

Nothing is static. Everything is evolving.(Chuck Palahniuk, Fight Club)

4.3 final - 마지막의, 변경될 수 없는

모든 private 메소드는 final이다 하지만 모든 final 메소드가 private인 것은 아니다. p.353

4.4 abstract - 추상의, 미완성의

추상 클래스를 상속extend하는 구상 클래스는 모두 abstract 메소드를 override해야 한다

VS

인터페이스를 구현implement하는 클래스는 모두 메소드를 override해야 한다

언제 abstract를 써야 하는가?
언제 interface를 써야 하는가?

composition over inheritance vs inheritance over composition

4.6 제어자(modifier)의 조합

메서드에 private와 final을 같이 사용할 필요는 없다. (중략) 이 둘 중 하나만 사용해도 의미가 충분하다 ☛ private 메소드에 final 제어자를 쓸 필요는 없다. 하지만 final 메소드에 접근 제어자를 지정하지 않는다면 접근 제어자는 default가 된다. 즉 private가 아니다.

5. 다형성

5.1 다형성이란?

5.2 참조변수의 형변환

5.3 instanceof 연산자

5.4 참조변수와 인스턴스의 연결

메서드의 경우 조상 클래스의 메소드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에 관계없이 항상 실제 인스턴스의 메서드(오버라이딩된 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.

https://github.com/bluedskim/java_standard_study/blob/master/src/test/java/chap7/AnimalShopperTest.java

다운캐스팅은 지양해야 한다 https://stackoverflow.com/a/30659861/4766882

6. 추상 클래스

6.1 추상 클래스란?

  1. 클래스 = 설계도
  2. 추상 클래스 = 미완성 설계도
  3. 인터페이스 = 기본 설계도

추상 클래스로 인스턴스 생성 불가

7. 인터페이스

7.1 인터페이스란?

  • 인터페이스는 일종의 추상 ‘클래스’이다. ☛ 자식이 인스턴스를 만들 수 있으므로 추상클래스는 클래스다. 하지만 인터페이스는 자식이 인스턴스를 만들 수 없으므로 클래스가 아니다.
  • 인터페이스는 명세서(specfication)다. “인터페이스의 이름에는 주로 Fightable과 같이 ‘~을 할 수 있는’의 의미인 able로 끝나는 것들이 많은데, 그 이유는 어떠한 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해서이다."
  • 인터페이스는 구현체에 대한 관점이다.

7.3 인터페이스의 상속

다중 상속이 가능하다

7.4 인터페이스의 구현

‘implements’ 구문이 상속을 의미하지 않는다. extends구문은 생략 가능

7.5 인터페이스를 이용한 다중상속

7.6 인터페이스를 이용한 다형성

https://github.com/bluedskim/java_standard_study/blob/master/src/test/java/chap7/PolymorphismTest.java

7.7 인터페이스의 장점

  • 표준화가 가능하다
  • 독립적인 프로그래밍이 가능하다
  • 개발시간을 단축시킬 수 있다
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
Liskov Substitution Principle 해결 p.395

Untitled

7.8 인터페이스의 이해

  • 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.
  • 메소드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다(Open-Close Principal)

7.9 디폴트 메서드와 static메서드

Java8부터 인터페이스에 구상 메소드 사용가능

8. 내부 클래스(inner class)

8.5 익명 클래스(anonymous class)

임시 클래스. 주로 인수 생성용