일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링 빈
- jdbc
- springboot
- Effective Java
- SQL
- 스프링 컨테이너
- 스프링 부트 입문
- 필드 주입
- @Configuration
- db
- mybatis
- sqld
- 스프링 부트
- 스프링
- 스프링 부트 기본
- spring
- java
- thymeleaf
- kafka
- assertThrows
- assertThat
- DIP
- 생성자 주입
- Javascript
- JPA
- 스프링부트
- 스프링 프레임워크
- resultMap
- DI
- 싱글톤
- Today
- Total
목록Language/Effective Java (13)
선 조치 후 분석
자바에서는 인터페이스는 유연하지만 구현이 없고, 추상 클래스는 구현은 가능하지만 다중 상속이 불가능하다는 특성이 있다. 이런 단점을 보완하기 위해 에서는 다음과 같이 조언한다. 가능하면 인터페이스를 사용하되, 공통 구현이 필요하다면 추상 클래스와 함께 사용하라 이 방식이 바로 골격 구현(Skeletal Implementation) 패턴이다. 골격 구현이란?인터페이스 + 추상 클래스 조합공통 로직은 추상 클래스에, 핵심 구현만 서브 클래스에서 직접 작성하는 구조장점인터페이스의 유연성 유지공통 구현 코드 재사용새로운 구현 클래스 추가 시 편리함 예제1. 인터페이스 정의public interface GameCharacter { void move(); void attack(); void defe..
clone() 메서드는 객체의 모든 필드를 복사하여 새로운 객체에 넣어 반환하는 동작을 수행한다. 즉, 필드의 값이 같은 객체를 새로 만드는 것이다. Clonable의 역할 - 복제해도 되는 클래스임을 나타내는 믹스인 인터페이스 - Object 클래스에 protected clone()이라는 메서드가 있다. - Clonable 인터페이스는 clone() 메서드의 동작방식을 결정한다. - Clonable을 구현하지 않은 인스턴스에서 clone()을 호출하면 CloneNotSupportedException을 던진다. 믹스인( Mixed in ) 인터페이스 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스 - '포함(has-a)'으로 설명된다. '상속(is-a)'과 비교되는 개념. Compos..
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 메서드는 이러한 클래스에 딱 맞게 구현되..
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘 하는 자원이 있다. 예를 들어, InputStream, OutputStream, java.sql.Connection 등 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제를 야기할 수 있다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally 가 사용되었다. 아래 코드처럼 close를 호출하게 되면 문제가 발생하지 않는다. BufferedReader는 사용 중 IOException이 발생할 수 있는데, 만약 br.readLine() 메서드에서 Exception이 발생하게 되면 메서드는 종료되고 close는 호출되지 않고 스트림이 메모리에 남아있게 된다. public String inputString() throw..