본문 바로가기
728x90

JAVA/Effective Java65

item 29. 이왕이면 제네릭 타입으로 만들어라 예제를 통한 이해... item 7에서 다뤘던 Object기반 스택 클래스를 제네릭 타입으로 바꿔서 만들어보자... 1. 기본 // Can you spot the "memory leak"? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { this.ensureCapacity(); this.elements[size++] = e; } /* ---------.. 2022. 5. 13.
item 28. 배열보다는 리스트를 사용해라 위 아이템에서는 배열과 제네릭 타입의 차이점을 다루고 있으며 결과적으로 배열보다 제네릭 사용을 권유하고 있다. 1. 배열은 공변, 제네릭은 불공변 공변과 불공변? 공변 : 함께 변한다. 즉, 관계(ex 상속..)를 맺는 클래스/타입들이 관계가 유지된 채로 함께 변한다. Object[] objectArray = new Long[1]; objectArray[0] = "스트링"; System.out.println(objectArray[0]); //in Runtime : Exception in thread "main" java.lang.ArrayStoreException "Long은 Object를 상속하고 있다. 배열로 사용되고 있기 때문에, Long에 String type을 넣어도 컴파일이 가능하다." 불공변.. 2022. 5. 13.
item 27. 비검사 경고를 제거하라 비검사 경고를 제거한 코드는 타입 안정성이 보장된다. 비검사 경고? 제네릭을 사용하기 시작했을 때 볼 수 있는 수많은 컴파일러 경고이다. warning : [unchecked]로 시작하며, casting 할 때 검사를 하지 않았다고 뜨는 경고라고 할 수 있다. 비검사 경고를 모두 제거하면 타입 안정성이 보장되기 때문에, 런타임에 ClassCastException이 발생하는 것을 막아줄 수 있다. 비검사 경고를 확인하기 위해서는 컴파일러에 -Xlint:unchecked 옵션을 주면 된다. [ 비검사 경고 제거 시 유의 사항 ] 1. 경고를 제거할 수는 없으나 타입 안전하다고 확신할 수 있다면, @SuppressWarnings("unchecked") 애너테이션을 추가한다. - 경고를 숨겨주는 역할을 한다. .. 2022. 5. 10.
item 26. 로 타입은 사용하지 말라  Generic이란? - 자바에서 제네릭이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미. - 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법. Generic Class/Interface란? - 클래스나 인터페이스 선언에 타입 매개변수가 쓰인 클래스나 인터페이스. - 한마디로 Generic Type이라 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 기본형 : class/Interface_name ex) List Interface - List - 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입. - String : 정규화 타입 매개변수 에 해당하는 실제 매개변수 Row Type? 각각의 제네릭 타입을.. 2022. 5. 10.
item 25. 톱레벨 클래스는 한 파일에 하나만 담아라 톱레벨 클래스란? /* in Oracle */ A top level class is a class that is not a nested class. - 중첩되지 않은 클래스 - 즉, 다른 클래스나 인터페이스 내부에 선언되지 않은 클래스를 의미 톱 레벨 클래스를 여러 개 선언한다면, 심각한 위험을 감수해야 한다. - 한 클래스를 여러 가지로 정의할 수 있기 때문에, 어느 소스파일을 먼저 컴파일하냐에 따라 뭘 사용할지가 달라진다. ex) Utensil과 Dessert가 모두 Utensil.java에 저장되어 있는 경우 public class item25 { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NA.. 2022. 5. 9.
item 24. 멤버 클래스는 되도록 static 으로 만든다. 중첩 클래스? - 다른 클래스 안에 정의된 클래스 - 자신을 감싼 바깥 클래스에서만 사용되어야 한다. (그렇지 않을 경우 톱레벨로 만들어라) 중첩 클래스의 종류 정적 멤버 클래스 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에 접근 가능하다. 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰임 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 정적 멤버 클래스로 만들어야 한다. 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자. static을 생략하면 바깥 인스턴스로부터 숨은 외부 참조를 갖게된다. 해당 참조를 저장하려면 시간/공간이 소비되기도 하고, 가비지 컬렉션이 바깥 클래스 인스턴.. 2022. 5. 7.
728x90