본문 바로가기

개발/[스터디] 이펙티브 자바

(13)
[이펙티브자바]77-81 아이템 77. 예외를 무시하지 말라. 1. API 설계자가 메서드 선언에 예외를 명시하는 까닭 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. // catch 후 아무것도 하지 않는 코드 try { ... } catch (SomeException e) { } catch 블록을 비워두면 예외가 존재할 이유가 없다. 2. 예외를 무시하기로했다면? catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고, 예외 변수의 이름도 ignored로 바꿔놓자. 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라. synchronized 키워드 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장 동기화 - (1)배타적 실행 (2)스레드 사이의 안정적인 통신 보장 - 쓰기와 읽기 모두를 동기화하여..
[이펙티브자바]ch67-ch71 67. 최적화는 신중히 하라 성능을 제한하는 설계를 피하라. 외부 시스템과의 소통방식 (API, 네트워크 프롵토콜, 데이터 포맷등)을 신중히 설계하라. API를 설계할 때 성능에 주는 영향을 고려하라 - public 타입은 가변으로 만들지 말자. (방어적 복사를 매번 하도록 유발) - 가능한 상속 대신 컴포지션을 사용하자. (나쁜 성능의 부모객체를 물려받는 것 방지) - 구현 대신 이넡페이스를 사용하자. (더 빠른 구현체로 대체할 경우 대비) 최적화 전후로 성능을 측정하자. 도구 예시 : jmh, 프로파일링 도구 68. 일반적으로 통용되는 명명 규칙을 따르라. 기본 문법 패키지와 모듈 : 각 요소를 점으로 구분. 풀네임을 사용하자 Camel case 권장 상수는 대문자와 _의 조합으로 사용하기. 복수형 ..
[이펙티브 자바] 아이템 57~61 아이템 57. 지역변수의 범위를 최소화하라 - 가장 처음에 쓰일 때 선언한다 - 선언과 동시에 초기화한다. - for 문을 사용시, 인덱스가 반드시 필요한 경우가 아니라면 for-each로 대체하여, 잠재적인 버그를 수정하자. (코드 57-2 관련) 아이템 58. 전통적인 for문보다는 for-each문을 사용하라. - 반복자(iterator())나 인덱스(i)가 필요하지 않다면 for-each로 대체하자. - for-each로 대체할 수 없는 경우 1) 컬렉션을 순회하면서 선택된 원소를 지워야하는 경우: 반복자의 remove 메서드 호출 필요 -> JAVA 8부터 removeIF 사용하여 간소화 가능 (예시: https://kdhyo98.tistory.com/38) 2) 컬렉션 순회하면서 원소의 값 일..
[이펙티브자바]아이템 52-56 아이템 52 . 다중 정의는 신중히 사용하라 다중정의(overloading) - 메서드 호출을 컴파일 타임에 정한다. - 코드 52-1에서 Collections의 다형화를 사용하여 출력값을 다르게 지정했지만, 동작하지 않는 이유다. cf. 재정의(overriding): 메서드를 동적으로 선택한다. 다중정의로 인해, 메서드의 다형성이 존재한다고 프로그래머가 착각하기 쉽다. 따라서 안전하게 가기 위해 - 매개 변수 수가 같은 다중정의는 하지 말자. - 메서드명을 다르게 하자 (예. writeBoolean(boolean), writeInt(int) ...) - 형변환을 통해 정확한 다중정의 메서드가 선택되도록 유도하자. (코드 52-3) 아이템 53. 가변인수는 신중히 사용하라 최소한 필요한 가변 인수 갯수가..
[이펙티브 자바 스터디] 아이템 41-46 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용해라. 마커인터페이스(marker interface) - 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스. 아무 메서드도 없다. - 예. Seria 마커 인터페이스가 마커 애너테이션 보다 나은점. - 컴파일 타임에 타입 불일치 체크 가능 : 마커 인터페이스는 구현 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있다 cf. 마커 에너테이션은 불가능. - 마커 인터페이스는 적용 가능 대상을 세밀하게 제한 가능하다 : 마킹하고 싶은 클래스에만 인터페이스 구현하면 됨. cf. 애너테이션은 모든 타입에 달 수 있다. (클래스, 인터페이스, 열거타입 등) TODO: 마커 인터페이스, 마커 애너테이션 구현 후 비교하는 코드 추가 마커 애..
[이펙티브 자바 스터디] 아이템 31~35 아이템 31. 한정적 와일드 카드를 사용해 API 유연성을 높여라 매개변수화 타입의 문제점 불공변이라 유연하지 않다. 복습 매개변수화 타입은 불공변(invariant)이다. 즉, "Type2가 Type1의 하위타입"은 List가 List의 하위 타입임을 보장하진 않는다. 왜 하위 타입임을 보장할 수 없을까 예를 들어, List와 List을 살펴보자. List에는 어떤 객체든지 넣을 수 있으나, List에는 String만 넣을 수 있다, 즉, 리스코프 치환 원칙에 어긋나므로, List은 List의 하위타입이 될 수 없다. 불공변의 예시 // 예시 public class Stack { public Stack(); public void push(E e); public E pop(); public boolean..
[이펙티브자바]아이템28. 배열보다는 리스트를 사용하여라. 배열 VS 제네릭 비교 1. 배열은 공변, 제네릭은 불공변이다. 배열은 공변(covariant)이다. 즉, A가 B의 하위 타입이면 A[]는 B[]의 하위 타입이다. 반면 제네릭은 불공변(invariant)이다. 즉, A가 B의 하위 타입이라도, List 와 List는 하위 관계가 성립되지 않는다. Object[] arr = new Long[1]; arr[0] = "문자열"; // 런타임 에러 발생 List ol = new ArrayList(); ol.add("문자열"); // 컴파일 에러 발생 리스트를 사용할 경우 컴파일 타임 에러를 사용하여 버그를 방지할 수 있다. 2 배열은 실체화(relify)되는 반면, 리스트는 그렇지 않다. 배열은 런타임에 타입을 체크한다. 하지만 제네릭은 원소타입을 컴파일 타..
[이펙티브자바]아이템27. 비검사 경고를 제거하라 최대한 많은 비검사 경고를 지우자. - 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성이 있다. 따라서 최선을 다해 제거하자. - 비검사 경고 예시) 아래 코드에서 HashSet의 타입을 명시해주라는 경고가 뜬다. // Set로 형변환이 필요하다는 경고 발생 Set exaltation = new HashSet(); // 다이아몬드 연산자를 사용한 수정 (자바 7부터 지원) Set exaltation = new HashSet(); 경고를 제거할 수 없지만, 타입 안전하다고 확신한다면 @SupressWarnings("unchecked") 애너테이션을 달아 경고를 숨기자. - 예외가 일어나지 않을 것이라 확신한다면 불필요한 경고는 지우는것이 좋다. 잠재적인 버그에..