이펙티브자바

· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 81. wait와 notify보다는 동시성 유틸리티를 애용하라 wait와 notify 지금은 wait와 notify를 사용해야 할 이유가 많이 줄었다. 자바 5에서 도입된 고수준의 동시성 유틸리티가 이전이라면 wait와 notify로 하드코딩해야 했던 전형적인 일들을 대신 처리해주기 때문이다. wait와 notify는 올바르게 사용하기 까다로우니 고수준 동시성 유틸리티를 사용하자. java.util.concurrent의 고수준 유틸리티는 세 범주로 나눌 수 있다. 실행자 프레임워크 동시성 컬렉션(concurrent collection) 동기화 장치(synchronizer) 동시성 컬렉션(concurrent..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 80. 스레드보다는 실행자, 태스크, 스트림을 이용하라 java.util.concurrent 동시성 작업 시, 작업 큐를 사용하면 안전 실패나 응답 불가와 같은 경우에 대한 대비를 해야하는데, java.util.concurrent 패키지를 사용하면 좋다. 이 패키지는 실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다. 그래서 아이템 49의 단순한 작업 큐(work queue) 보다 뛰어난 큐를 아래처럼 한 줄로 생성하고 사용할 수 있다. ExecutorService exec = Executors.newSingleThreadExecutor(); // 작업 큐 생성 exec.e..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라 아이템 78에서는 동기화의 필요성을 다뤘다면, 이번에는 동기화의 남용에 대해 다룬다. 동기화 유의점 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠트리며 예측할 수 없는 동작을 야기할 수도 있다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다. 안전실패 : 프로그램이 잘못된 결과를 계산하는 것 예로, 동기화된 영역 안에서는 재정의할 수 있는 메서드는 호출하면 안되며, 클라이언트가 넘겨준 함수 객체를 호출해서는 안된다. 동기화된 영역을 포함한 클래스 관점에서는 이런 메서드는 모두 바깥 세상..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라 synchronized 해당 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장하는 키워드 많은 프로그래머가 동기화를 배타적 실행, 즉 한 스레드가 변경하는 중이라서 상태가 일관되지 않은 순간의 객체를 다른 스레드가 보지 못하게 막는 용도 한 객체가 일관된 상태를 가지고 생성되고, 이 객체에 접근하는 메서드는 그 객체에 lock을 건다. 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정한다. (객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다.) 동기화를 제대로 사용하면 어떤 메서드도 이 객체의 상태가 일관되지 않은 순간을 볼 수 없을 것..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 77. 예외를 무시하지 말라 API 설계자가 메서드 선언에 예외를 명시하는 까닭은 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. 예외를 무시하기는 아주 쉽다. 예로 메서드 호출을 try 문으로 감싼 후 catch 블록에서 아무 일도 하지 않는 경우이다. 예외는 문제 상황에 잘 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 이 내용은 검사와 비검사 예외에 똑같이 적용된다. 만약, 예외를 무시하기로 결정했다면 catch 블록 안에 그렇게 결정안 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔두자. ex 1) 예외를 무시하는 예 Future..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 76. 가능한 한 실패 원자적으로 만들라 실패 원자적(failure-atomic) 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다는 특성 메서드를 실패 원자적으로 만드는 방법 가장 간단한 방법은 불변 객체로 설계하는 것 불변 객체는 태생적으로 실패 원자적이기 때문 메서드가 실패하면 새로운 객체가 만들어지지 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 일은 없다. 가변 객체의 메서드를 실패 원자적으로 만드는 가장 흔한 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것이다. 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성을 대부분 걸러낼 수 있는 방법 ex ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라 예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적(stack trace) 정보를 자동으로 출력한다. 스택 추적은 예외 객체의 toString 메서드를 호출해 얻는 문자열로, 보통은 예외 클래스 이름 뒤에 상세 메시지가 붙는 형태다. 에외의 toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일이 중요하다. 예외 메시지 팁 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다. 예컨데, IndexOutOfBoundsException의 상세 메시지는 범위의 최..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 74. 메서드가 던지는 모든 예외를 문서화하라 검사 예외 문서화 메서드가 던지는 예외는 그 메서드를 올바로 사용하는데 필요한 정보다. 검사 예외는 항상 따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. 공통 상위 클래스 하나로 뭉뜽그려 선언하는 것은 좋지 않다. 메서드 사용자에게 각 예외에 대처 방안을 줄 수 없다. 같은 맥락에서 발생할 여지가 있는 다른 예외들까지 삼켜버릴 수 있어 API 사용성을 크게 떨어뜨린다. 이 규칙에 유일한 예외는 main 메서드다. (main은 오직 JVM만 호출하기 때문) 비검사 예외 문서화 자바 언어가 요구하는 것은 아니지..
멍목
'이펙티브자바' 태그의 글 목록 (2 Page)