Java/Effective Java
-
[Effective Java] Item 76. 가능한 실패 원자적으로 만들라Java/Effective Java 2020. 11. 1. 12:41
이번 주제에서 이야기하는 바는 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다는 내용입니다. 이러한 특성을 실패 원자적(failure-atomic)이라고 합니다. 실패 원자적으로 만드는 방법 불변 객체로 설계하는 방법 불변 객체는 태생적으로 실패 원자적입니다. 메서드가 실패하면 새로운 객체가 만들어지지는 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 일이 없습니다. 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문입니다. 작업 수행에 앞서 매개변수의 유효성을 검사하는 방법 가변 객체의 메서드를 실패 원자적으로 만드는 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것입니다. 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성을 대부분 걸러낼 수 ..
-
[Effective Java] Item 69. 예외는 진짜 예외 상황에만 사용하라Java/Effective Java 2020. 10. 27. 00:25
예외의 사용 예외는 (그 이름이 말해주듯) 오직 예외 상황에서만 써야 합니다. 절대로 일상적인 제어 흐름용으로 쓰여선 안됩니다. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 합니다. 특정 상태에서만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사' 메서드도 함께 제공해야 합니다. Iterator 인터페이스의 next와 hasNext가 각각 상태 의존적 메서드와 상태 검사 메서드에 해당합니다. 상태 검사 메서드를 이용한 for 관용구 코드 for (Iterator i = collection.iterator(); i.hasNext(); ) { Foo foo = i.next(); //Something job... } (for-each도 내부적으..
-
[Effective Java] Item 65. 리플렉션보다는 인터페이스를 사용하라Java/Effective Java 2020. 10. 24. 13:10
리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있습니다. Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있고, 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있습니다. 나아가 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된 실제 생성자, 메서드, 필드를 조작할 수도 있습니다. 이 인스턴스들을 통해 해당 클래스의 인스턴스를 생성하거나, 메서드를 호출하거나, 필드에 접근할 수 있다는 뜻입니다. 리플렉션의 단점 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없습니다. 예외 검사도 마찬가..
-
[Effective Java] Item 64. 객체는 인터페이스를 사용해 참조하라Java/Effective Java 2020. 10. 24. 00:30
아이템 51에서 매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라고 했습니다. 이 조언을 "객체는 클래스가 아닌 인터페이스로 참조하라"고 까지 확장할 수 있습니다. 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라 //좋은 예. 인터페이스를 타입으로 사용했습니다. Set sonSet = new LinkedHashSet(); //나쁜 예. 클래스를 타입으로 사용했습니다. LinkedHashSet sonSet = new LinkedHashSet(); 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 수 있습니다. 나중에 구현 클래스를 교체하고자 한다면 그저 새 클래스의 생성자(혹은 다른 정적 팩토리)를 호출해주기만 하면 됩니다. ..