MNT_Dev
  • 홈
  • 태그
  • 방명록
  • 메뉴 닫기
  • 글작성
  • 방명록
  • 환경설정
    • Development (140)
      • Languege (36)
        • Java & Spring (24)
        • C# & ASP.NET (5)
        • JavaScript (2)
        • Kotlin (5)
      • DB (0)
        • Oracle (0)
      • Study (72)
        • 네트워크 (3)
        • 이펙티브 자바 (41)
        • 우아한 테크 코스 (7)
        • Next Step (3)
        • Certificate (5)
        • Side Proejct (6)
      • Error (17)
        • 개발환경 (9)
        • 트러블슈팅 (6)
      • Algorithm (12)
      • 개발환경 (1)
      • 회고 (2)
  • 홈
  • 태그
  • 방명록
Study/이펙티브 자바

[Effective Java 3E] 인터페이스는 구현하는 쪽을 생각해 설계하라

💥 개요 자바 8 전에는 기존 구현체를 깨뜨리지 않고 인터페이스에 메서드를 추가하는 방법은 없었습니다. 인터페이스에 메서드를 추가하면 대부분 컴파일 오류가 발생하는데 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문입니다. 자바 8부터 default method가 추가 되어 인터페이스에 메서드를 추가할 수 있게 되었지만 위험이 완전히 사라진 것은 아닙니다. 🔍 default method 디폴트 메서드(default method)를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 됩니다. 이처럼 기존 인터페이스에 메서드를 추가할 수 있게 되었지만, 모든 기존 구현체가 매끄럽게 연동되라는 보장은 없습니다. 디폴트 메서드는 구..

2023. 9. 23. 14:56
Study/이펙티브 자바

[Effective Java 3E] 추상 클래스보다는 인터페이스를 우선하라

💥 개요 자바에서 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두가지 입니다. JAVA 8부터 인터페이스도 default method를 제공할 수 있게 되어, 현재 두 방법 모두 인스턴스 메서드를 구현 형태로 제공할 수 있게 되었습니다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점 입니다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 커다란 제약이 있습니다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급합니다. 🔍 인터페이스를 사용해야 하는 이유 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해..

2023. 9. 21. 22:13
Study/이펙티브 자바

[Effective Java 3E] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

💥 개요 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 합니다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 합니다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있씁니다. 그런데 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 합니다. 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 합니다. 즉 모든 상황을 문서로 남겨야 합니다. 상속이 캡슐화를 해친다. API문서 메서드 설명 끝에 종종 "Implementation Requirements"로 시작하는 절을 볼 수 있는데 내부 동작방식을 설명하는 곳..

2023. 9. 16. 21:32
Study/이펙티브 자바

[Effective Java 3E] 상속보다는 컴포지션을 사용하라

💥 개요 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 패키지 안에서라면 상속도 안전하지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있습니다. 상위 클래스는 내부 구현이 달라지게 되면 하위 클래스에 이상이 생길 수 있습니다. HashSet을 사용하는 프로그램이 있고, 성능을 높이려면 이 HashSet은 처음 생성된 이후 몇개의 원소가 더해졌는지 알 수 있어야 한다고 가정하여 아래 코드와 같이 변수와 접근자 메서드를 추가하고 add와 addAll을 재정의 한 경우를 확인해 보겠습니다. // 코드 18-1 잘못된 예 - 상속을 잘못 사용했다! (..

2023. 9. 16. 20:02
Study/이펙티브 자바

[Effective Java 3E] 변경 가능성을 최소화하라

💥 개요 불변클래스란 인스턴스 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 생성된 순간부터 파괴되는 순간까지 절대 달라지지 않습니다. 자바에서 String, 기본 타입의 박싱된 클래스, BigInteger, BigDecimal이 여기에 속합니다. 📃 불변 클래스를 만드는 5가지 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. (상속한 클래스에서 객체의 상태를 변하게 만드는 상태를 막아줌, 대표적인 방법으로 final Class) 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 👍대표적인 불변 클래스 public final class Comple..

2023. 9. 14. 21:30
Study/이펙티브 자바

[Effective Java 3E] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

💥 개요 이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있습니다. class Point { public double x; public double y; } 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. API를 수정하지 않고 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없습니다. 철저한 객체 지향 프로그래머는 이런 클래스를 싫어해 모두 private으로 필드를 변경하고 public 접근자(getter)를 추가합니다. class Point { private double x; private double y; public Point(double x, dou..

2023. 9. 9. 14:32
  • «
  • 1
  • ···
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • ···
  • 24
  • »

공지사항

  • GitHub & WorkSpace

전체 카테고리

  • Development 140
    • Languege 36
      • Java & Spring 24
      • C# & ASP.NET 5
      • JavaScript 2
      • Kotlin 5
    • DB 0
      • Oracle 0
    • Study 72
      • 네트워크 3
      • 이펙티브 자바 41
      • 우아한 테크 코스 7
      • Next Step 3
      • Certificate 5
      • Side Proejct 6
    • Error 17
      • 개발환경 9
      • 트러블슈팅 6
    • Algorithm 12
    • 개발환경 1
    • 회고 2
애드센스 광고 영역
  • 최근 글
  • 최근 댓글

최근 글

최근댓글

태그

  • #스프링부트
  • #백엔드
  • #파이썬
  • #BOJ
  • #이펙티브 자바
  • #effective java
  • #AWS
  • #우테코
  • #개발자
  • #후기
  • #spring boot
  • #구글 클라우드
  • #객체지향
  • #이펙티브자바
  • #트러블슈팅
  • #코틀린
  • #Java
  • #도메인 주도 개발
  • #GCP
  • #자바
  • #김영한 스프링
  • #스프링
  • #제네릭
  • #백준
  • #kotlin
  • #TDD
  • #saa
  • #클라우드
  • #spring
  • #김영한
MORE

전체 방문자

오늘
어제
전체

블로그 인기글

Powered by Privatenote Copyright © MNT_Dev All rights reserved. TistoryWhaleSkin3.4

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.