4차산업혁명의 일꾼/Java&Spring웹개발과 서버 컴퓨터

Effective Java 이펙티브 자바 정리[조슈아 블로치]

르무엘 2023. 3. 20. 23:01

https://mangkyu.tistory.com/133

 

[개발서적] 이펙티브 자바(Effective Java) 핵심 요약 및 정리

이펙티브 자바를 읽으면서 제가 제대로 적용하지 못했던 부분 혹은 개념적으로 부족했던 부분을 정리하고, 앞으로의 개발에 적용해보고자 합니다. 1. 객체의 생성과 파괴 [ 1. 생성자 대신 정적

mangkyu.tistory.com

Effective Java 이펙티브 자바 정리[조슈아 블로치]

 

1장 객체 생성과 파괴

item 1. 생성자 대신 정적 팩터리 메서드를 고려하라

입력 매개 변수의 필요한 변환을 처리하는 것을 고려하십시오.

item 2. 생성자의 매개변수가 많다면 빌더를 고려하라

 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만드십시오.

item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

 클래스의 인스턴스가 하나만 생성되도록 하려면 개인 생성자 또는 열거 유형을 사용하여 싱글톤 패턴을 적용할 수 있습니다.

item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

클래스의 인스턴스화를 방지하려면 개인 생성자를 사용하십시오.

item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

  1. 코드에서 리소스를 직접 지정하지 말고 종속성 주입을 사용하여 필요에 따라 해당 리소스를 제공하십시오.

item 6. 불필요한 객체 생성을 피하라

  1. 특히 성능이 중요한 코드에서 기존 객체를 재사용하거나 기본 유형을 대신 사용하여 불필요한 객체 생성을 피하십시오.

item 7. 다 쓴 객체 참조를 해제하라

  1. 가비지 수집기에서 메모리를 확보할 수 있도록 이전 개체가 더 이상 필요하지 않은 즉시 역참조합니다.

item 8 . finalizer와 cleaner사용을 피하라

  1. 파이널라이저와 클리너는 신뢰할 수 없고 성능 문제를 일으킬 수 있으므로 사용하지 마십시오.

item 9. try-finally 보다는 try-with-resources를 사용하라

  1. 예외가 발생하더라도 리소스가 제대로 닫히도록 try-finally보다 try-with-resources를 선호합니다.

 

 

2장 모든 객체의 공통 메서드

item 10. equals 일반 규약을 지켜 재정의하라

  1. 객체가 참조 동등성이 아니라 논리적 동등성을 기준으로 비교되도록 equals 메서드를 재정의합니다.

item11. eqluals를 재정의하려거든 hashCode도 재정의하라

  1. equals를 재정의하는 경우 hashCode도 재정의하여 동일한 객체가 동일한 해시 코드를 갖도록 해야 합니다.

item12. toString을 항상 재정의하라

  1. 항상 toString을 재정의하여 디버깅 및 로깅 목적으로 개체의 의미 있는 문자열 표현을 제공하십시오.

item13. clone 재정의는 주의해서 진행하라

  1. 올바르게 구현하기 어려울 수 있고 특정 상황에서 예상대로 작동하지 않을 수 있으므로 복제본을 재정의할 때 주의하십시오.

item14. Comparable을 구현할지 고려하라

  1. 정렬 및 검색에 유용한 객체에 대한 자연스러운 순서를 제공하기 위해 Comparable 인터페이스 구현을 고려하십시오.

 

3장 클래스와 인터페이스

item15. 클래스와 멤버의 접근 권한을 최소화하라

  1. 잠재적인 오류를 제한하고 유지 관리성을 향상시키기 위해 클래스 및 해당 구성원의 가시성을 최소화합니다.

item16. public클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

  1. 퍼블릭 클래스의 퍼블릭 필드 대신 액세서 메서드를 사용하여 향후 변경 시 유연성과 유지 관리 가능성을 허용합니다.

item17. 변경 가능성을 최소화하라.

  1. 예기치 않은 동작을 방지하고 유지 보수성을 향상시키기 위해 클래스 및 해당 구성원의 변경 가능성을 최소화하십시오.

item18. 상속보다는 컴포지션을 사용하라

  1. 더 많은 유연성을 허용하고 상속의 제한과 취약성을 피하기 위해 상속보다 구성을 사용하십시오.

item19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

  1. 상속을 염두에 두고 클래스와 인터페이스를 설계하고 그렇지 않은 경우 예기치 않은 동작과 취약성을 방지하기 위해 상속을 금지합니다.

item20. 추상클래스보다는 인터페이스를 우선하라

  1. 더 많은 유연성을 허용하고 단일 상속의 제한을 피하기 위해 추상 클래스보다 인터페이스를 선호하십시오.

item21. 인터페이스는 구현하는 쪽을 생각해 설계하라

  1. 구현을 염두에 두고 인터페이스를 설계하여 실제 사용 및 유지 관리가 용이하도록 합니다.

item22. 인터페이스는 타입을 정의하는 용도로만 사용하라

  1. 기본 구현이나 상수를 제공하기보다는 유형을 정의하는 데에만 인터페이스를 사용하십시오.

item23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라

  1. 유형 안전성을 개선하고 태깅의 한계와 취약성을 방지하려면 태그가 지정된 클래스보다 클래스 계층 구조를 사용하십시오.

item24. 멤버 클래스는 되도록 static으로 만들라

  1. 멤버 클래스를 정적으로 만들어 캡슐화를 개선하고 둘러싸는 인스턴스에 대한 참조를 유지하지 않도록 합니다.

item25. 톱레벨 클래스는 한 파일에 하나만 담으라

  1. 구성을 개선하고 이름 충돌을 피하기 위해 각 파일에 최상위 클래스를 하나만 넣습니다.

 

4장 제네릭

item26. 로 타입은 사용하지 말라

  1. 유형 안전성을 높이고 컴파일 시 오류를 포착하기 위해 원시 유형을 사용하지 마십시오.

item27. 비검사 경고를 제거하라

제네릭을 적절하게 사용하고 필요한 경우 @SuppressWarnings 주석을 사용하여 확인되지 않은 경고를 제거합니다

item28. 배열보다는 리스트 사용하라

  1. 배열보다는 목록을 사용하여 오류를 피하고 유형 안전성과 유연성을 향상시키십시오.

item29. 이왕이면 제네릭 타입으로 만들라

  1. 가능한 경우 클래스 또는 인터페이스를 제네릭 형식으로 만들어 형식의 안전성과 재사용성을 향상시키십시오.

item30. 이왕이면 제네릭메서드로 만들라.

  1. 가능한 경우 메서드를 일반 메서드로 만들어 형식 안전성과 재사용성을 개선합니다.

item31 한정적 와일드 카드를 사용해 API유연성을 높이라

인증된 와일드카드를 사용하여 API 유연성을 높이고 보다 구체적인 유형을 사용할 수 있습니다

item32 제네릭과 가변인수를 함께 쓸 때는 신중하라

  1. 가변 인수와 함께 제네릭을 사용할 때는 예기치 않은 동작과 오류가 발생할 수 있으므로 주의하십시오.

item33. 타입안전 이종 컨테이너를 고려하라

  1. 유형 안전성과 유연성을 개선하기 위해 클래스 객체를 키로 사용하고 해당 값을 값으로 사용하는 것과 같이 유형이 안전한 이기종 컨테이너를 사용하는 것을 고려하십시오.

 

5장 열거타입과 애너테이션

item34. int 상수 대신 열거 타입을 사용하라

  1. int 상수 대신 열거형을 사용하여 유형 안전성과 가독성을 향상시키십시오.

item35. ordinal 메서드 대신 인스턴스필드를 사용하라

  1. 서수 메서드 대신 인스턴스 필드를 사용하여 유지 관리성을 개선하고 상수 재정렬로 인한 오류를 방지합니다.

item36. 비트필드 대신 EnumSet을 사용하라

  1. 비트 필드 대신 EnumSet를 사용하여 가독성, 유형 안전성 및 성능을 개선하십시오.

item37. ordinal 인덱싱 대신 EnumMap을 사용하라

  1. 순서 인덱싱 대신 EnumMap을 사용하여 유지 관리성을 개선하고 상수 재정렬로 인한 오류를 방지합니다.

item38. 확장 할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

  1. 확장 가능한 열거형이 필요한 경우 클래스 사용의 제한을 피하기 위해 인터페이스를 사용하십시오.

item39. 명명패턴보다 애너테이션을 사용하라

  1. 가독성, 유지 관리성 및 유연성을 개선하려면 이름 지정 패턴보다 주석을 선호하십시오.

item40. @Override 애너테이션을 일관되게 사용하라

  1. @Override 주석을 일관되게 사용하여 철자 오류나 메서드 서명 변경으로 인한 오류를 방지합니다.

item41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

  1. 정의하려는 것이 유형인 경우 마커 인터페이스를 사용하여 가독성과 유지 관리성을 향상시킵니다.

 

6장 람다와 스트림

item42. 익명클래스보다는 람다를 사용하라

  1. 익명 클래스 대신 람다를 사용하여 가독성과 유지 관리성을 향상시키십시오.

item43. 람다보다는 메서드 참조를 사용하라

  1. 가독성과 유지보수성을 개선하려면 람다 대신 메소드 참조를 사용하십시오.

item44. 표준 함수형 인터페이스를 사용하라

  1. 표준 기능 인터페이스를 사용하여 상호 운용성을 개선하고 혼동을 피하십시오.

item45. 스트림은 주의해서 사용하라

  1. 스트림은 특정 상황에서 기존 루프보다 덜 효율적일 수 있으므로 주의하여 사용하십시오.

item46. 스트림에서는 부작용없는 함수를 사용하라

  1. ​​스트림에 부작용이 없는 함수를 사용하여 가독성, 유지 관리 및 테스트 가능성을 향상시키십시오.

item47. 반환 타입으로는 스트림보다 컬렉션이 낫다.

  1. 리턴 타입으로서 콜렉션은 더 큰 유연성을 허용하고 스트림의 한계를 피하기 위해 스트림보다 낫습니다.

item48. 스트림 병렬화는 주의해서 적용하라

  1. 스트림 병렬화는 특정 상황에서 순차적 실행보다 덜 효율적일 수 있고 추가적인 복잡성과 오버헤드를 유발할 수 있으므로 신중하게 적용하십시오.

 

7장 메서드

item49. 매개변수가 유효한지 검사하라

  1. 유용한 오류 메시지를 제공하고 오류를 조기에 포착하기 위해 매개변수가 유효한지 확인하십시오.

item50. 적시에 방어적 복사본을 만들라

  1. 적시에 방어적인 복사본을 만들어 개체에 대한 예기치 않은 변경을 방지하고 유지 관리성을 향상시킵니다.

item51. 메서드 시그니처를 신중히 설계하라

  1. 가독성, 유지 관리성 및 유연성을 개선하기 위해 메서드 시그니처를 신중하게 디자인하십시오.

item52. 다중정의는 신중히 사용하라

  1. 혼동을 피하고 유지보수성을 향상시키기 위해 여러 정의를 신중하게 사용하십시오.

item53. 가변인수는 신중히 사용하라

  1. 변수 인수를 신중하게 사용하여 가독성을 높이고 모호성으로 인한 오류를 피하십시오.

item54. null이 아닌, 빈 컬렉션이나 배열을 반환하라

  1. 일관성을 개선하고 널 포인터 예외를 피하기 위해 비어 있는 널이 아닌 콜렉션 또는 배열을 리턴하십시오.

item55. 옵셔널 반환은 신중히 하라

  1. 혼동을 피하고 유지보수성을 향상시키기 위해 선택적 반품에 주의하십시오.

item56. 공개된 API요소에는 항상 문서화 주석을 작성하라

  1. 사용성을 개선하고 사용자에게 유용한 정보를 제공하기 위해 노출된 API 요소에 대한 문서 주석을 항상 작성하십시오.

 

8장 일반적인 프로그래밍 원칙

item57. 지역변수의 범위를 최소화하라

  1. 가독성, 유지 관리성 및 성능을 향상시키기 위해 지역 변수의 범위를 최소화하십시오.

item58. 전통적인 for문보다는 for-each문을 사용하라

  1. 가독성을 높이고 오프 바이 원(off-by-one) 오류로 인한 오류를 방지하려면 전통적인 for 문 대신 for-each 문을 사용하십시오.

item59. 라이브러리를 익히고 사용하라

  1. 라이브러리를 배우고 사용하여 생산성을 높이고 바퀴를 재발명하지 마십시오.

item60. 정확한 답이 필요하다면 float와 double은 피하라

  1. 부동 소수점 부정확성으로 인한 오류를 방지하기 위해 정확한 답이 필요한 경우 float 및 double을 피하십시오.

item61. 박싱된 기본 타입보다는 기본 타입을 사용하라

  1. 성능을 개선하고 오토박싱으로 인한 오류를 방지하려면 boxed 기본 유형보다 기본 유형을 사용하십시오.

item62. 다른 타입이 적절하다면 문자열 사용을 피하라

  1. 유형 안전성과 유지 관리성을 향상시키기 위해 다른 유형이 적절한 경우 문자열을 사용하지 마십시오.

item63. 문자열 연결은 느리니 주의하라

  1. 문자열 연결은 느리고 다른 방법을 사용하여 개선할 수 있습니다.

item64. 객체는 인터페이스를 사용해 참조하라

  1. 유연성을 높이고 결합을 피하기 위해 구체적인 클래스 대신 인터페이스를 사용하여 개체를 참조하십시오.

item65. 리플렉션보다는 인터페이스를 사용하라

  1. 리플렉션보다는 인터페이스를 사용하여 성능, 유지 관리성 및 유연성을 향상시키십시오.

item66. 네이티브 메서드는 신중히 사용하라

  1. 잠재적인 보안 및 이식성 문제를 피하기 위해 기본 방법을 신중하게 사용하십시오.

item67. 최적화는 신중히 하라

  1. 너무 이른 최적화는 오류, 복잡성 및 유지 관리 가능성 감소로 이어질 수 있으므로 신중하게 최적화하십시오.

item68. 일반적으로 통용되는 명명 규칙을 따르라

  1. 가독성과 유지 관리성을 개선하고 일관성을 높이기 위해 일반적으로 인정되는 명명 규칙을 따르십시오.

 

9장 예외

item69. 예외는 진짜 예외 상황에만 사용하라

  1. 정말 예외적인 상황에서만 예외를 사용하여 코드 혼동을 피하고 유지 관리성을 향상시키십시오.

item70. 복구할 수 있는 상황에서는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라

  1. 유용한 오류 메시지를 제공하고 오류를 조기에 발견하기 위해 복구 가능한 상황에 대해 확인된 예외를 사용하고 프로그래밍 오류에 대한 런타임 예외를 사용합니다.

item71. 필요 없는 검사 예외 사용은 피하라

  1. 가독성과 유지 관리성을 향상시키기 위해 불필요한 검사 예외 사용을 피하십시오.

item72. 표준예외를 사용하라

  1. 표준 예외를 사용하여 일관성을 개선하고 유용한 오류 메시지를 제공하십시오.

item73. 추상화 수준에 맞는 예외를 던지고

  1. 유지 관리를 개선하고 결합을 피하기 위해 추상화 수준과 일치하는 예외를 throw합니다.

item74. 표준 예외를 사용하라

  1. 표준 예외를 사용하여 일관성을 개선하고 유용한 오류 메시지를 제공하십시오.

item75. 예외의 상세 메시지에 실패 관련 정보를 담으라

  1. 예외의 세부 메시지에 오류 관련 정보를 포함하여 디버깅 및 로깅에 유용한 오류 메시지를 제공합니다.

item76. 가능한 한 실패 원자적으로 만들라

  1. 유지보수성을 개선하고 부분적인 실패를 피하기 위해 실패를 가능한 한 원자 단위로 만드십시오.

item77. 예외를 무시하지 말라

  1. 오류 처리를 개선하고 자동 실패로 인한 잠재적인 문제를 피하기 위해 예외를 무시하지 마십시오.

 

10장 동시성

item78. 공유 중인 가변 데이터는 동기화해 사용하라

  1. 경합 상태를 방지하고 스레드 안전성을 향상시키기 위해 공유 변수 데이터를 동기화하십시오.

item79. 과도한 동기화는 피하라

  1. 과도한 동기화를 피하여 성능을 개선하고 교착 상태로 인한 잠재적인 문제를 피하십시오.

item80. 스레드보다는 실행자, 태스크, 스트림을 애용하라

  1. 실행기, 작업 및 스트림을 스레드보다 선호하여 성능, 유지 관리성 및 유연성을 개선합니다.

item81. wait와 notify보다는 동시성 유틸리티를 애용하라

  1. 대기 및 알림보다 동시성 유틸리티를 선호하여 가독성, 유지 관리성 및 유연성을 개선하십시오.

item82. 스레드 안전성 수준을 문서화하라

  1. 스레드 안전성 수준을 문서화하여 사용자에게 알리고 스레드 안전성으로 인한 잠재적인 문제를 방지하십시오.

item83. 지연 초기화는 신중히 사용하라

  1. 지연 초기화를 신중하게 사용하여 성능을 개선하고 경쟁 조건으로 인한 잠재적인 문제를 피하십시오.

item84. 프로그램의 동작을 스레드 스케줄러에 기대지 마라

  1. 스케줄링의 가변성으로 인한 잠재적인 문제를 피하기 위해 스레드 스케줄러에 프로그램 동작을 의존하지 마십시오.

 

11장 직렬화

item85. 자바 직렬화의 대안을 찾으라

  1. 성능을 개선하고 버전 관리 및 보안으로 인한 잠재적인 문제를 방지하기 위해 Java 직렬화에 대한 대안을 찾으십시오.

item86. Serializable을 구현할지는 신중히 결정하라

  1. 버전 관리 및 보안으로 인한 잠재적인 문제를 피하기 위해 Serializable을 구현할지 여부를 신중하게 결정하십시오.

item87. 커스텀 직렬화 형태를 고려해보라

  1. 성능을 개선하고 버전 관리 및 보안으로 인해 발생할 수 있는 잠재적인 문제를 방지하기 위해 일부 형식의 사용자 정의 직렬화를 고려하십시오.

item88. readObject메서드는 방어적으로 작성하라

  1. 보안을 강화하고 악의적인 입력으로 인한 잠재적인 문제를 피하기 위해 방어적으로 readObject 메서드를 작성하십시오.

item89. 인스턴스 수를 통제해야 한다면, readResolve 보다는 열거 타입을 사용하라

  1. 인스턴스 수를 제어해야 하는 경우 readResolve 대신 열거 유형을 사용하여 유지 관리성을 개선하고 직렬화로 인한 잠재적인 문제를 방지하십시오.

item90. 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검하라

  1. 성능을 개선하고 버전 관리 및 보안으로 인한 잠재적인 문제를 방지하려면 직렬화된 인스턴스 대신 직렬화된 프록시를 사용하는 것을 고려하십시오.

 

https://www.yes24.com/product/goods/65551284

 

이펙티브 자바 Effective Java 3/E - YES24

자바 플랫폼 모범 사례 완벽 가이드 - Java 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브

www.yes24.com

 

 

 

LIST