분류 전체보기 (67) 썸네일형 리스트형 [Effective-Java] Item 78. 공유 중인 가변 데이터는 동기화해 사용하라 synchronized: 해당 메소드나 블록을 한번에 한 스레드씩 수행하도록 보장하는 키워드 synchronized 키워드를 선언한 메소드는 메소드가 선언된 객체에 락을 걸고 메소드가 종료되면 락을 해제한다. synchronized 키워드를 선언한 블록은, 파라미터로 넘어간 객체에 락을 걸고 블록이 끝나면 락을 해제한다. 배타적 수행 기능 제공 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다. 즉, 한 스레드가 객체의 상태를 변경하는 중, 상태가 일관되지 않은 순간의 객체를 다른 스레드가 보지 못하게 락을 걸기 때문에 어떤 메소드도 객체의 일관되지 않은 상태를 볼 수 없다. 스레드 간 통신 기능 제공 동기화된 메소드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 .. [Effective-Java] Item 75~77. 예외의 상세 메시지에 실패 관련 정보를 담으라, 가능한 실패 원자적으로 만들라, 예외를 무시하지 말라 Item 75.예외의 상세 메시지에 실패 관련 정보를 담으라 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야한다 IndexOutOfBoundsException을 예로들면 상세 메시지로 범위의 최소와 최대값, 그리고 범위를 벗어난 인덱스를 모두 담으면 실패에 관한 정보를 얻기 쉽다. 최소와 최대가 예측이 되더라도 셋중 어떤 것이 잘못된지에 따라 현상이 다를 수 있다. 예를들어 내부 불변식이 깨져 최솟값이 최댓값보다 클수도 있다. 인덱스를 파라미터로 넘기는 게 있는데 이는 자바 9에와서 추가된 것이고 아쉽게 최솟값과 최댓값까지 받진 않는다. 생성자에서 필요한 정보를 받아 상세 메시지까지 작성하게하여 아래와 같이 작성할 수도 있을 것이다. public class.. [Effective-Java] Item 72~74. 표준 예외를 사용하라, 추상화 수준에 맞는 예외를 던지라, 메소드가 던지는 모든 예외를 문서화하라 Item 72. 표준 예외를 사용하라 표준 예외를 재사용하면 익숙해진 규약을 그대로 따라 다른 사람이 익히고 사용하기 쉬워진다. 그리고 예외 클래스 수가 적어지니 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. 자주 사용되는 예외를 보자. 예외 주요 쓰임 예시 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때 반복 횟수 지정하는 매개변수에 음수 파라미터 IllegalStateException 객체가 메소드 수행에 적절치 않은 상태일 때 제대로 초기화되지 않은 객체를 사용 NullPointerException null 허용하지 않는 메소드에 null을 건넷을 때 null이 올 수 없는 파라미터에 null 삽입 IndexOutOfBoundsException 인덱.. [Effective-Java] Item 69~71. 예외는 진짜 예외 상황에만 사용하라, 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라, 필요 없는 검사 예외 사용은 피하라 Item 69.예외는 진짜 예외 상황에만 사용하라 // 배열의 원소를 순회하는데, 무한루프를 돌다가 배열의 끝에 도달시 Exception으로 종료 try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexoutOfBoundsException e) { } // 표준적인 관용구 for (Mountain m : range) { m.climb(); } JVM은 배열에 접근 시 경계를 넘는지 검사하는데, 일반 반복문도 배열 경계에 도달 시 종료한다. 이 검사를 반복문에도 명시한다면 검증 로직이 중복되므로 하나를 생략한다고 생각할 수 있으나, 이는 잘못된 추론이다. 예외는 예외 상황에 쓸 용도로 설계되었기에, 구현자 입장에선 최적화에 별 신경쓰지 않.. 이전 1 2 3 4 5 6 ··· 17 다음