언어
-
이펙티브 자바 Item 11 - equals를 재정의하려거든 hashCode도 재정의하라언어/Effective Java 2024. 5. 28. 16:12
equals를 재정의한 클래스는 hashCode도 재정의 해야한다. 그렇지 않으면 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생한다. 동등성: 객체가 주소값이 다르더라도 내용이 같다면 같은 거로 보는 것 (equals())동일성: 객체의 주소값이 다르면 아무리 같은 내용이더라도 같지 않다고 보는 것 (ex == ) 값만 같은지 아예 같은 객체인지 비교하기 위해선 동등성과 동일성이 보장되어야함!!1.hashCode 일반 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode도 변하면 안 된다.애플리케이션을 다시 실행한다면, 이 값이 달라져도 상관없음equals가 두 객체가 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환한다.논..
-
이펙티브 자바 Item 9 - try-finally 대신 try-with-resources를 사용하라언어/Effective Java 2024. 5. 28. 12:04
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다.ex)InputStream, OutputStream, java.sql.Connection 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다.전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. try-finally는 자원을 회수하는 최선의 방책이 아니다! static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] bu..
-
이펙티브 자바 Item7 - 다 쓴 객체의 참조를 해제하라언어/Effective Java 2024. 5. 28. 11:29
자바에서 사용하지 않는 객체의 경우 GC에서 알아서 회수를 해주며, 메모리 관리를 해준다. 하지만 GC가 메모리 관리를 해준다고 완전 신경을 꺼야하는 건 아니다! GC에서는 특정 상황에서 메모리 누구가 발생하고, 우리는 그러한 상황을 인지하고 대응해야한다. 메모리 누수는 겉으로 잘 드러나지 않아 수년간 잠복하는 사례도 존재한다. 철저한 코드리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도한다. 따라서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다.메모리 누수가 발생하는 경우 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_CAP..
-
이펙티브 자바 Item6 - 불필요한 객체 생성을 피하라언어/Effective Java 2024. 5. 27. 16:35
불필요한 객체 생성을 피하면서 자원을 절약해야한다.같은 기능의 객체를 새로 생성하는 대신, 객체 하나를 재사용하는 편이 나을 때가 많다.특히, 불변 객체는 언제든지 재사용할 수 있다. 같은 기능 수행하는 객체에 대한 재사용 강조싱글톤 사용 (내가 구현할 때)static factory 메서드 사용 (구현된 것을 사용할 때)객체 캐싱 (무거운 객체일 때 미리 초기화 혹은 flyweight 패턴 고려) 같은 인스턴스 대변하는 여러 타입을 굳이 만들지 말 것 박싱 클래스는 꼭 필요한 경우만 사용 1. 문자열 객체 생성 같은 값임에도 다른 래퍼런스인 경우 - 기존 인스턴스를 재사용하자 문자열의 경우 항상 new 로 새로운 문자열을 생성하기 보다 같은 문자열이라면, "java"처럼 리터럴로 생성한다. 2. s..
-
이펙티브 자바 Item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라언어/Effective Java 2024. 5. 27. 15:54
사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 1. 자원 직접 주입 대부분의 클래스는 여러 리소스에 의존한다. 책에서는 SpellChecker와 Dictionary를 예로 든다.두 객체 사이에는 의존관계가 있다. 아래는 static 유틸리티를 잘못 사용한 예이다. - 이는 유연하지 않고 테스트가 어렵다.public class SpellChecker { private static final Lexicon dictionary = ...; // 의존하는 리소스 (의존성) private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static..
-
이펙티브 자바 Item3 - private 생성자나 열거타입으로 싱글톤임을 보장하라언어/Effective Java 2024. 5. 27. 15:18
싱글톤이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 의미한다.싱글톤을 사용하는 클라이언트는 테스트가 어렵다. 하나의 자원을 공유하기 때문에 테스트로 써도 되는 클래스인가를 판별해야하기 때문이다. (ex DB 접근하는 싱글톤을 테스트에 적용하면 안된다) 서버 환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.서버에서 클래스 로더를 어떻게 구성하고 있느냐에 따라 JVM이 분산되어 여러개 있을 경우 싱글톤 클래스임에도 불구하고 하나 이상의 오브젝트가 만들어질 수 있다.싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는 것은 객체지향 프로그래밍싱글톤을 만드는 방식 1.public static 멤버가 fin..
-
이펙트브 자바 Item4 - 인스턴스화를 막으려거든 private 생성자를 사용하라언어/Effective Java 2024. 5. 27. 12:24
자바는 생성자를 선언하지 않으면, 기본으로 default 생성자를 만든다. (매개변수 x 생성자)따라서, 생성자를 안만든다고 객체를 못만드는 것은 아니다. 객체를 생성하기 싫다면, private 생성자를 통해 이를 반드시 막아라 * * This class contains various methods for manipulating arrays (such as * sorting and searching). This class also contains a static factory * that allows arrays to be viewed as lists. */// Suppresses default constructor, ensuring non-instantiability.private Arrays() ..
-
이펙티브 자바 Item2 - 생성자에 매개변수가 많다면 빌더를 고려하라언어/Effective Java 2024. 5. 27. 11:44
정적 팩토리와 생성자는 "선택적 매개변수"가 많을 때 적절하게 대응하기 어렵다는 단점이 있다. 만약 있을 수도 없을 수도 있는 필드가 많은 객체가 있다고 한다면.. 1. 점층적 생성자 패턴 필수 매개변수를 받는 생성자 1개, 그리고 선택 매개변수를 하나씩 늘려가며 생성자를 만드는 패턴이다. public class Javabom { private Long id; private List members; private String email; private LocalDateTime createDateTime; private boolean isOpen; public Javabom(Long id, List members, String email, LocalDateTime crea..