자바 (31) 썸네일형 리스트형 (이펙티브 자바) 아이템 28. 배열보다는 리스트를 사용하라 들어가며 배열과 리스트는 비슷한듯 다른 자료구조이다. 특히 자바에서는 어떻게 다른지 알지 못하면 디버깅에 애를 먹게 된다. 책에서는 공변성과 타입정보의 유무에 따라 두 자료구조를 명확하게 구분하며, 문제가 발생할 때 해결할 수 있는 방법에 대해 명확하게 제시해준다. 글을 읽기 전에 나는 배열과 리스트를 어떻게 구분해서 사용하고 있었는지 생각해보자. 배열과 리스트의 차이점 1. 공변과 불공변 배열은 공변이다. 간단히 설명하자면 Object가 Integer의 Super type이면 Object[]도 Integer[]의 Super type이라는 뜻이다. 반대로 리스트는 불공변이다. List가 List의 Super type이 아니라고 해석해도 좋다. 간단한 예제 코드를 보자. // 배열은 공변이기 때문에 컴파일.. (이펙티브 자바) 아이템 30. 이왕이면 제네릭 메서드로 만들라 이번 아이템은 메서드를 만들때 이왕이면 제네릭 메서드로 만들것을 권장한다. 명시적으로 형변환을 해주어야하는 메서드 보다는 제네릭 메서드로 만들면 형변환이 필요없어지며 새로운 사용자가 유입되었을때 훨씬 편리하게 코드를 작성할 수 있도록 도와준다는 점을 강점으로 들고 있다. 아래 코드는 컴파일시에 문제는 없지만 경고문구가 발생한다. (사실 책에는 경고문구가 발생한다고 기술되어있지만 나의 인텔리제이에서는 경고 문구가 뜨질 않는다. 아마 JVM 5, 6 버전에서 발생하는 경고 문구인 것 같다.) public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 발생하는 이유는 Set에 .. (이펙티브 자바) 아이템 29. 이왕이면 제네릭 타입으로 만들라 제네릭을 사용하는 것은 '확장성'을 위함이다. 대체로 라이브러리에 정의된 제네릭 타입과 메서드를 사용하는 입장이어서 쉽게 느껴지지만, 제네릭타입을 새로 만드는 일은 조금 어렵다. 이 이유는 확장성위해 제네릭을 사용하면서, 발생가능한 에러나 경고를 모두 고려하기 어렵기 때문이라고 생각한다. 이번장에서는 제네릭타입을 사용하지 않고 Object로 만들어진 소스를 제네릭 타입을 사용하여 수정할 떄 고려해야하는 에러와 경고들을 소개하면서 올바르게 수정하는 방법을 소개하고 있다. //코드29 Object 기반 스택 public class Stack{ private Object[] elements; private int size = 0; private static fianl int DEFAULT_INITIAL_CAP.. (이펙티브 자바) 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라 들어가며 제목이 낯설다. 조금 더 명확하게 표현하면 다음과 같다. "하나의 java 파일에는 하나의 class를 생성하자." 왜 이렇게 해야 하는지 차근차근 살펴보자. 왜 하나의 java 파일에 여러 class 파일을 올리면 안 돼? 자바 개발을 하다보면 기술적으로 가능하지만, 관례적으로 사용하지 않는 몇 가지가 있다. 당장 생각나는 간단한 예로 변수는 Camel case(ex. userName)로 표기하고, 상수는 Snake case(ex. USER_TYPE)로 표현하는 것이 있다. 같은 맥락으로 하나의 자바 파일에는 하나의 클래스 생성을 원칙으로 한다. 이유는 다음과 같다. 패키지 트리구조로 파악되지 않는 클래스가 생긴다. 수동 컴파일 시 컴파일하는 자바 파일의 순서에 따라 상이한 동작을 초래할 수 .. (이펙티브 자바) 아이템 27. 비검사 경고를 제거하라 할 수 있는 한 모든 비검사 경고를 제거하자! 제네릭을 사용했을때 나타나는 경고들은 아래와 같다. 비검사 형변환 경고 비검서 메서드 호출 경고 비검사 매개변수화 가변인수 타입 경고 비검사 변환 경고 Set set = new HashSet(); 위의 코드는 아래와 같은 비검사 경고가 발생한다. 우리는 이러한 비검사 경고를 무시해서는 안된다. 비검사 경고를 제거하게되면 아래와같은 두가지 이점이 찾아온다. 모두 제거하면 타입 안정성이 보장된다. 런타임에 ClassCastException이 발생할 일이 없고, 내가 의도한대로 잘 동작한다. @SuppressWarning 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 잇을 때 @SuppressWarning으로 경고를 숨기자 검증 없이 경고 숨길 때 : 경고.. (이펙티브 자바) 아이템 26. 로 타입은 사용하지 말라 먼저 제네릭 클래스, 제네릭 인터페이스란, 클래스와 인터페이스 선언에 타입 매개변수를 의미한다. 우리가 흔히 사용하는 List는 List라고 사용하며, 이러한 제네릭 클래스와 제네릭 인터페이스를 제네릭 타입이라고 한다. List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. (여기서 정규 타입 매개변수 E 가 String인 실제 타입 매개변수이다) 여기서 제네릭타입을 하나 정의하면 로 타입도 함께 정의한다. List의 로 타입은 List다. private final Collection stamps = ...; Stamp를 넣기위한 stamps를 정의하였지만, stamps를 이렇게 정의하면 Coin을 넣으도 아무 오류 없이 컴파일되고 실행된다. stamps.add(new Coin(.... (이펙티브 자바) 아이템 24.멤버 클래스는 되도록 static으로 만들어라. 들어가기에 앞서, 중첩 클래스란 다른 클래스안에 정의된 클래스를 말한다. 중첩 클래스의 종류로는, 정적 멤버 클래스, 멤버 클래스, 익명 클래스, 지역 클래스 로 총 네 가지가 있다. 이번 아이템에서는 각각의 중첩 클래스의 특징을 살펴보자. 먼저 중첩 클래스를 왜 사용하는가를 보자. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다. 서로 관련 있는 클래스들을 논리적으로 묶어, 코드의 캡슐화를 증가시킬 수 있다. 외부에서 내부 클래스에 접근할 수 없으므로 코드의 복잡성을 줄일 수 있다. 또한, 외부 클래스의 복잡한 코드를 내부 클래스로 옮겨 코드 복잡성을 줄일 수 있다. 정적 멤버 클래스 해당 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점을 제.. (이펙티브 자바) 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 이번장은 자바 8의 대표적인 특징 중 하나인 디폴트 메서드를 예시로 들면서 해당 메서드를 사용할 때의 유의사항에 대해서 설명을 한다. 결론은 양날의 검이니 상황에 맞게 잘 사용하자는 것이다. 자바 8 이전에는 기존에 정의된 인터페이스가 있다면 해당 인터페이스에 메서드를 추가하는 것은 불가능에 가까운 일이었다. 하나 자바 8 이후부터는 디폴트 메서드라는 기능이 생겨서 위에서 언급했던 불편함을 어느 정도 해소시켜주었다. 대표적인 예는 아래의 List의 sort 메서드이다. 이와 같이 자바 라이브러리에 포함된 디폴트 메서드는 코드 품질이 높고 대부분의 상황에서 무리 없이 사용할 수 있다. 그렇다면 이제 인터페이스에 메서드를 추가하는 문제점은 완전히 해결된 것인가? 아니다! 아래 두가지의 문제점이 존재한다. 디.. 이전 1 2 3 4 다음