전체 글

전체 글

    이펙티브 자바, 쉽게 정리하기 - item 28. 배열보다는 리스트를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 28. 배열보다는 리스트를 사용하라 공변(covariant)과 불공변(invariant) 개념 공변: 함께 변한다. 배열은 공변이 적용된다. 불공변: 함께 변하지 않는다. (공변이 아니다.) 리스트는 불공변이 적용된다. 공변(covariant) 불공변(invariant) 예제 테스트 코드 @Test public void covariantTest() { Object[] objects = new Long[1]; objects[0] = "String"; // ArrayStoreException } Object[]의 공변 특성을 이용하여 objects를 선언 후에 Long[] 저장소를 만들어 할당했다. 해당 저장소 타입이 Object[]로 정의되어 있어 클라이언트는 아..

    이펙티브 자바, 쉽게 정리하기 - item 27. 비검사 경고를 제거하라

    이펙티브 자바, 쉽게 정리하기 - item 27. 비검사 경고를 제거하라 비검사 경고가 나타나는 경우 Set exaltation = new HashSet(); 위는 비검사 경고가 발생하는 코드의 예이다. 위의 경우엔 앞에서 나왔던 로 타입을 사용해서 발생했다. Venery.java:4: warning: [unchecked] unchecked conversion Set exaltation = new HashSet(); required: Set found: HashSet 자바 7부터는 다이아몬드 연산자를 뒤에 적어주면 자동으로 타입 추론을 해준다. 할 수 있는 한 위와 같은 비검사 경고를 모두 제거해주어야 한다. 그래야 타입 안정성이 보장되고, 런타임에 ClassCastException이 뜰 확률이 줄어든다..

    이펙티브 자바, 쉽게 정리하기 - item 26. 로 타입은 사용하지 말라

    이펙티브 자바, 쉽게 정리하기 - item 26. 로 타입은 사용하지 말라 용어 정리 클래스 혹은 인터페이스 선언에 타입 매개변수가 쓰이면 이를 제네릭 클래스(generic class) 혹은 제네릭 인터페이스(generic interface)라 한다. 이를 통틀어 제네릭 타입(generic type)이라고 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입(parameterized type)을 정의한다. 제네릭 타입을 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. ex) List, Set 로 타입은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작한다. 제네릭이 도래하기 전 코드와 호환되도록 하기 위..

    이펙티브 자바, 쉽게 정리하기 - item 25. 톱 레벨 클래스는 한 파일에 하나만 담으라

    이펙티브 자바, 쉽게 정리하기 - item 25. 톱 레벨 클래스는 한 파일에 하나만 담으라 두 클래스가 한 파일에 정의되어 있을 때 Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } Dessert.java class Utensil { static final String NAME = "pot"; } class Dessert { static final String NAME = "pie"; } Main.java public class Main { public static void main(String[] args) { System.out.printl..

    이펙티브 자바, 쉽게 정리하기 - item 24. 멤버 클래스는 되도록 static으로 만들라

    이펙티브 자바, 쉽게 정리하기 - item 24. 멤버 클래스는 되도록 static으로 만들라 중첩 클래스란? 중첩 클래스(nested class)란, 다른 클래스 안에 정의된 클래스를 말한다. 오직 자신을 감싼 바깥 클래스에서만 쓰일 용도로 만들어진 클래스이다. 그 외의 용도로 쓰일 클래스는 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류? 정적 멤버 클래스 비정적 멤버 클래스 익명 클래스 지역 클래스 정적 멤버 클래스를 제외한 나머지는 내부 클래스(inner class)에 해당한다. 정적 멤버 클래스는 다른 클래스 안에 선언되어 바깥 클래스의 private 멤버에도 접근 가능한 특성이 있다. 흔히 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다. 정적 멤버 클래스와 다른 ..

    이펙티브 자바, 쉽게 정리하기 - item 23. 태그 달린 클래스보다는 계층구조를 활용하라

    이펙티브 자바, 쉽게 정리하기 - item 23. 태그 달린 클래스보다는 계층구조를 활용하라 태그달린 클래스의 예 public class Item23Test { static class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 F..

    이펙티브 자바, 쉽게 정리하기 - item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 안티패턴: 상수 인터페이스 public interface PhysicalConstants { // 인터페이스 내부의 필드는 `static final`이 자동으로 붙는다. // 아보가드로 수 (1/몰) double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) double ELECTRON_MASS = 9.109_383_56e-31; } @Test public void test() { System.out.println(PhysicalConstants.AVOGA..

    이펙티브 자바, 쉽게 정리하기 - item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라

    이펙티브 자바, 쉽게 정리하기 - item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 인터페이스의 수정과 디폴트 메서드 자바8 이전에는 인터페이스는 한번 정의되면 절대 새로운 메서드가 추가되거나 기존 메서드가 사라지지 않는다는 전제 하에 코드를 작성했다. 자바8 에서 디폴트 메서드가 등장하며 새로운 메서드를 추가할 수 있게 되었다. 주로 람다를 활용하기 위해서이다. 하지만 위험이 사라진 것은 아니다. 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하는 것은 쉽지 않다. 디폴트 메서드를 선언하면, 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. removeIf 메서드로 보는 인터페이스 디폴트 메서드의 예 default boolean removeI..

    이펙티브 자바, 쉽게 정리하기 - item 20. 추상 클래스보다는 인터페이스를 우선하라

    이펙티브 자바, 쉽게 정리하기 - item 20. 추상 클래스보다는 인터페이스를 우선하라 추상 클래스와 인터페이스 살펴보기 공통점 메서드의 시그니쳐만 만들고 구현을 구현 클래스에게 맡긴다. 차이 추상클래스: 단일 상속만 가능하다. 구현체는 추상클래스의 하위 클래스가 된다. 인터페이스: 다중 상속이 가능하다. 인터페이스를 구현했다면, 같은 타입으로 취급된다. 인터페이스의 장점 활용하기 1: 믹스인(mixin) 믹스인: 구현 클래스에 '선택적 행위'를 제공한다고 선언하는 효과를 준다. ex) Comparable, Iterable, AutoCloseable, Serializable 추상 클래스는 이미 다른 클래스를 상속하는 클래스의 경우, 해당 클래스가 두 부모 클래스를 가질 수는 없으므로 믹스..

    이펙티브 자바, 쉽게 정리하기 - item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.

    이펙티브 자바, 쉽게 정리하기 - item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. 상속용 클래스가 지켜야 할 것들 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 어떤 순서로 호출하는지, 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다. 재정의 가능 메서드란 public, protected 중 final이 아닌 모든 메서드를 말한다. 재정의 가능한 메서드를 호출할 수 있는 모든 상황을 문서로 남기는 것이 좋다. 백그라운드 스레드나 정적 초기화 과정에서 호출될 수도 있으므로 유의하자. Implentation Requirements와 @implSpec 태그 - remove() 의 예 API 문서 메서드 설명 끝에서 발견할 수 ..

    이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라 상속의 단점 여기서 이야기하는 상속은 '클래스 상속'이며, 인터페이스 상속과는 무관하다. 상속은 캡슐화를 깨뜨린다. 모듈을 만들 때는 객체지향 설계 원칙(SOLID)에 의해 응집도는 높고 결합도는 낮은 모듈을 만들고 변경사항이 있을 때는 클라이언트의 코드만 변경하는 것이 이상적이다. 그런데, 다른 객체를 상속 받는 하위 클래스는 상위 클래스의 구현 내용 변경에 따라 하위 클래스의 구현 내용도 바뀔 수 있다. 그 말은 즉, 코드 한줄 건드리지 않은 하위 클래스가 오동작할 수 있다는 것이다. 이러한 방식으로 상속은 캡슐화를 깨뜨릴 수 있다. 상속에서 일어나기 쉬운 실수 1: 자기사용 static class Inst..

    이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라

    이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라 불변 클래스 불변클래스란, 인스턴스 내부 값을 수정할 수 없는 클래스이다. 불변 클래스 내부 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바에는 String, 기본 타입 박싱 클래스, BigInteger, BigDecimal이 있다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉽다. 오류가 생길 여지도 적고 훨씬 안전하다. 클래스를 불변으로 만드는 방법 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. (상속이 불가능하게 만든다.) 모든 생성자를 private 혹은 package-private으로 만들고 정적 팩터리를 제공한다. 모든 필드를 final로 선언한다..

반응형