일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- kafka
- 스프링 부트
- Javascript
- 스프링 부트 기본
- spring
- JPA
- DIP
- 스프링 컨테이너
- thymeleaf
- sqld
- assertThrows
- 생성자 주입
- jdbc
- SQL
- java
- 스프링
- Effective Java
- 스프링 빈
- @Configuration
- 필드 주입
- assertThat
- db
- DI
- 스프링 프레임워크
- 싱글톤
- 스프링부트
- mybatis
- resultMap
- springboot
- 스프링 부트 입문
- Today
- Total
목록Effective Java (6)
선 조치 후 분석
toString()은 Object 클래스의 public 메서드이다. 기본적으로 toString()은 "클래스의 이름@hashCode(16진수 변환)" 값을 반환한다. 기본적으로 이 값은 사람이 읽기 어려울 뿐 아니라 쓸모없는 메시지로 남게 된다. 가급적이면 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. 객체가 크거나 문자열로 표현하기에 적합하지 않다면 요약정보로 표현해도 된다. toString을 구현할 때 반환값의 포맷 문서화에 따른 장단점 장점 - 포맷을 명시하면, 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 된다. 단점 - 포맷을 명시하면, 평생 그 포맷에 얽매이게 된다. 프로그래머들이 그 포맷에 맞춰 파싱이 필요하다. 반대로 포맷을 명시하지 않는다면, 향후 릴리스에서 정보를 더 넣..
자바의 최고 조상 Object는 equals 메서드뿐만 아니라 hashCode 메서드도 기본적으로 정의되어 있다. HashMap, HashSet과 같은 Collection에서 Object의 hashCode 메서드를 활용하기 때문이다. 그래서 Item10에서 Object를 재정의했다면, hashCode도 함께 재정의해야 한다. Object 명세서에서 정의되어 있는 hashCode가 지켜야 하는 규약이다. equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. equals가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 동일한 값을 반환해야 한다. equals가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCod..
결론부터 말하면 이렇다. 꼭 필요한 경우가 아니라면, equals를 재정의하지 말자. 재정의해야 하는 경우라면 클래스의 핵심 필드 모두가 5가지 규약을 지켜가며 비교하자. equals 메서드는 재정의하기 쉬워 보이지만, 곳곳에 함정이 도사리고 있어서 자칫하면 끔찍한 결과를 초래할 수 있다. 문제를 회피하기 가장 좋은 방법은 재정의를 하지 않는 것이다. 그냥 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같게 된다. 그러니 다음에서 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선이다. 1. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스가 여기에 해당한다. Thread가 좋은 예로 Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현되..
자바에서 객체소멸은 GC (Gabage Collector)가 담당하고, 비 메모리 자원회수는 try-with-resources, try-finally로 해결한다. 자바에서 제공하는 2가지 객체 소멸자, finalizer와 cleaner는 기본적으로 사용하지 말아야 한다. 사용하면 안 되는 이유 finalizer : 예측할 수 없고, 위험하며, 느리고, 일반적으로 불필요하다. cleaner : finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리며, 보통은 불필요하다. 단점 1 - 즉시 수행된다는 보장이 없다 finalizer와 cleaner는 호출된 후 언제 실행될지 알 수 없다. 즉, 제때 실행되어야 하는 작업을 절대 할 수 없다. finalizer와 cleaner의 수행 속도는 가비지 ..
객체들을 사용하다 보면 불필요하게 여러 번 생성하는 경우가 있다. 같은 기능의 객체를 새로 생성하는 대신, 객체 하나를 재사용하는 편이 좋을 때가 많다. 특히, 불변 객체는 언제든 재사용할 수 있다. 예를 들어 세 가지를 살펴보자. 1. 문자열 객체 생성 String을 new로 생성하면 항상 새로운 객체를 만들게 된다. String s = new String("Java"); 아래 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 Stirng 인스턴스를 재사용한다. String a = "Java"; 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. ※ String Constant Pool에 존재하면 기존 객체를 참조하게 된다. (내용 참조 https..
클래스가 객체를 생성하는 방법에는 2가지가 있다. Public 생성자 → public 생성자를 통한 객체 생성은 일반적으로 알고 있는 'new' 키워드를 사용하는 방법 정적 팩토리 메서드 → 'new'를 직접적으로 사용하지 않고 클래스 내에 선언된 메서드 내부에서 'new'를 사용해 객체를 리턴하는 방법 정적 팩토리 메서드 예시 String 클래스에서 구현되어 있는 정적 팩토리 메서드이다. 넘겨받은 파라미터로 new를 통해 String 객체를 생성한다. /** * Returns the string representation of the {@code char} array * argument. The contents of the character array are copied; subsequent * mod..