equals는 일반 규약을 지켜 재정의하라 Equals 메소드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어 자칫하면 끔찍한 결과를 초래할 수 있다. 이런 이유로 인해 아예 재정의 안하는 것이 옳은 선택일 수 있다. 다음 상황에 맞닥드릴 시에는 재정의를 하지 않는 것이 좋다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스를 말한다. 인스턴스의 논리적 동일성을 검사할 일이 없다. 인스턴스의 논리적 동일성을 검사할 일이 없다면 Object의 기본 equals만으로 해결이 된다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. Set구현체는 AbstractSet이 구현한 equals를 상속받아 사용하고, List 구현체들은 Abst..
명명 패턴보다 어노테이션을 사용하라 테스트 프레임워크인 JUnit은 버전 3까지 테스트 메서드 이름을 test로 시작하게끔 했다. 하지만 이런 명명패턴은 단점이 존재했다. 명명패턴의 단점 오타가 나면 안된다. 실수로 tsetSafetyOverride로 지으면 JUnit 3은 이 메소드를 무시하고 지나치기 때문에 해당 테스트가 통과했다고 오해할 수 있다. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. 메서드가 아닌 클래스의 이름을 TestSafetyMechanisms으로 지어 JUnit에 던져줄 시 JUnit은 클래스의 이름에는 관심이 없어 무시해버린다. 그로 인해, 테스트를 하지 않고 지나치기 때문에 개발자는 이번에도 테스트가 통과했다고 오해할 수 있다. 프로그램 요소를 매개변수로 전달할 마..
@Override 어노테이션을 일관되게 사용하라 해당 어노테이션을 일관되게 사용하면 여러가지 악명 높은 버그들을 예방해준다. 다음 Bigram 프로그램을 살펴보자. Bigram은 영어 알파벳 2개로 구성된 문자열을 표현하는 소스다. pubcli class Bigram { private final char first; private final char second; public Bigram(char firtst, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second = second; } public int hashCode() { r..
검사 예외와 런타임 예외 자바는 문제 상황을 알리는 타입(Throwable)으로 검사 예외, 런타임 예외, 에러 이렇게 세 가지를 제공한다. 하지만, 해당 타입을 언제 무엇을 사용해야하는 지 헷갈리는 경우가 있다. 그럼 이것들은 언제 무엇을 사용해야 하는가? 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용해라 검사 예외를 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게 된다. 따라서, 메소드 선언에 포함된 검사 예외 각각은 그 메소드를 호출했을 때 발생할 수 있는 유력한 결과임을 API 사용자에게 알려주는 것이다. Ex. API 메소드 호출 시 강제적으로 try-catch 혹은 throw 를 해야하는 경우 비검사 throwable은 두 가지로, 런타..
예외는 진짜 예외 상황에만 사용하라 예외는 오직 예외 상황에서만 써야한다. 절대 일상적인 제어 흐름용으로 사용해선 안 된다. try { int i = 0; while(true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } 위 코드는 무한루프를 돌다가 배열의 끝에 도달하게 되면 ArrayIndexOutOfBoundsException 이 발생하면 끝을 내버리는 코드다. 왜 예외를 써서 루프를 종료한 거지? 세 가지 잘못된 추론을 살펴볼 수 있다. 예외를 통한 명확한 검사가 빠를 것이다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. JVM은 배열에 접근할 때마다 경계를 넘지않는지 매번 ..
Exception Exception, Exception은 원하지 않거나 예기치 않은 이벤트로, 프로그램 런타임에 발생하여 프로그램 명령의 정상적인 흐름을 방해한다. Exception and Error Error : 오류 심각한 문제를 나타내므로, 응용 프로그램에서 try / catch 문을 사용하며 안 된다. Exception : Exception은 상태를 나타내므로, 응용 프로그램에서 try / catch 문을 사용해야 한다. 예외계층 모든 Exception과 Error의 계층은 기본 클래스인 Throwable 클래스의 하위 클래스이다. Exception은 프로그래머가 직접 예외 조건을 잡아야 한다. Ex. NullPointerException Error는 Java 런타임 시스템 ( JVM )에서 런타..
Java에서 어노테이션이란, Java에서 어노테이션은 JEE5부터 새롭게 추가된 요소이다. 어노테이션을 사용하는 이유는, 유효성 검사를 쉽게 할 수 있고 코드가 깔끔해진다. 하지만, 가장 큰 특징은 메타 데이터로 볼 수 있다. 메타 데이터 : 데이터를 위한 데이터로서, 데이터 대해서 설명을 한 데이터이다. Java에서 제공하는 어노테이션 종류 @Override 선언한 메소드가 오버라이드(재정의) 되었다는 것을 나타낸다. @Deprecated 해당 메소드 혹은 객체가 더 이상 사용되지 않음을 표시한 것이다. 만약 해당 메소드 혹은 객체를 사용할 경우 컴파일 경고를 발생시킨다. @SuppressWarnings 선언한 곳의 컴파일 경고를 무시하도록 한다. @SafeVerargs Java7 부터 지원하며, 제네..
오토박싱과 언박싱 Java에서는 int, double, long 등의 기본 자료형(primitive type)의 포장 클래스(wrapper class)가 있어서 기본형을 객체로 다루어야 할 경우 사용할 수 있다. 그림에서 살펴보듯이 생성자는 해당하는 기본형의 값을 줄수도 있고, 문자열 형태로도 줄 수 있다. 단, 문자열 형태로 줄 시 데이터 타입 형식에 맞춰야한다. 박싱과 언박싱 박싱과 언박싱 개념은 JDK 1.5버전 부터 추가되었고, JDK 1.5버전 밑에서는 컴파일러가 기본형과 참조형(int와 Integer)의 관게를 알지 못했다. 박싱(Boxing) : 기본형을 참조형으로 변환하는 것이다. int -> Integer 언박싱(Unboxing) : 참조형을 기본형으로 변환하는 것이다. Integer -..
- Total
- Today
- Yesterday
- jdk버전
- 팩토리 메소드 패턴
- 생성자
- @Lazy
- package-private
- java
- java8
- ifPresent
- Spring
- JPA
- 빈 순환 참조
- 이펙티브 자바
- 점층적 생성 패턴
- 빌더 패턴
- 복사 팩토리
- 정적팩터리메서드
- 김영한
- 이펙티브자바
- junit
- springboot
- mustache
- 스프링부트
- Effective Java
- 인프런
- effectivejava
- try with resources
- 자바8
- flatMap
- try catch finally
- 연관관계
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |