들어가기 전 이 글은 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 Raw Type (List) 대신 반드시 제네릭 (List)를 사용해라. 제네릭을 사용하면 표현력 / 안정성이 더욱 향상된다. 제네릭을 사용하면 런타임 에러 대신 컴파일 에러가 발생하도록 바꿔준다. List, List 위는 로타입으로 List를 선언한 경우다. List strings는 실제로는 List으로 의도하고 만든 것이다. 따라서 unsafeAdd()가 요구하는 List 타입에 호환되지 않기 때문에 unsafeAdd() 메서드에서 컴파일 에러가 발생해야한다. 그렇지만 실제로는 발생하지 않는다. 만약, List 로타입을 List으로 타입 매개변수를 선언해주면 어떻게 될까? 위는 List으로 타입 매개변수를 ..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 어댑터 패턴은 클라이언트가 요청하는 타입과 이미 구현된 클래스가 호환되지 않을 때, 중간에 Adapter 클래스를 하나 생성해서 서로 호환될 수 있도록 해준다. Adapter 클래스는 클라이언트가 요청하는 타입(인터페이스 / 클래스)를 상속/구현한다. 따라서 호환 가능해진다. Adapter 클래스는 비정적 멤버 클래스로 선언해서 사용하면 좀 더 응집도 있게 코드를 작성할 수 있다. 완벽 공략 39. 어댑터 패턴 어댑터 패턴의 목적은 다음과 같다. 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴 예를 들어 클라이언트가 바라는 타겟은 220v를 사용하고 있는데, 우리가 이미 구현한 클래..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 중첩 클래스 중 일부는 멤버 클래스다. 멤버 클래스가 아닌 중첩 클래스는 익명 클래스, 로컬 클래스가 있다. 중첩 클래스가 바깥 클래스의 인스턴스를 참조하지 않는다면 정적 멤버 클래스로 구성해서 메모리를 효율화 할 수 있다. 중첩 클래스가 바깥 클래스의 인스턴스를 참조한다면 비정적 멤버 클래스로 구성한다. 비정적 멤버 클래스는 바깥 클래스의 묵시적 참조를 가지며, Outerclass.this로 접근 가능하다. 비정적 멤버 클래스는 주로 어댑터 패턴에 자주 사용된다. 익명 클래스는 메서드 scope에서 생성된 클래스다. 최근에는 람다 / 메서드 레퍼런스로 점차 사라지는 중이다. 로컬 클래스는 쓰지 않는다...
핵심 정리 태그 달린 클래스의 단점 쓸데없는 코드가 많다. 가독성이 나쁘다. 메모리도 많이 사용한다. 필드를 final로 선언하려면 불필요한 필드까지 초기화 해야 한다. 인스턴스 타입만으로는 현재 나타내는 의미를 알 길이 없다. 클래스 계층 구조(상속)로 바꾸면 모든 단점을 해결할 수 있다. 태그가 달린 클래스는? 태그 달린 클래스는 클래스가 가진 필드 중 일부가 클래스의 구체적인 타입을 나타내고, 이 타입에 따라 클래스의 전체 동작이 바뀌는 클래스다. 예시로는 Figure 클래스를 들 수 있다. // 코드 23-1 태그 달린 클래스 - 클래스 계층구조(상속)보다 훨씬 나쁘다! (142-143쪽) public class Figure { enum Shape {RECTANGLE, CIRCLE} // 태그 필..
핵심 정리 상수를 정의하는 용도로 인터페이스를 사용하지 말 것! 클래스 내부에서 사용할 상수는 내부 구현에 해당한다. 내부 구현을 클래스의 API로 노출하는 행위가 된다. 클라이언트에 혼란을 준다. 상수를 정의하는 방법 특정 클래스나 인터페이스 열거형 인스턴스화 할 수 없는 유틸리티 클래스 (private 생성자등) 상수를 정의하는 용도로 인터페이스를 사용하는 것은 안티패턴임 인터페이스에 상수를 정의하고, 클래스가 이 인터페이스를 구현을 하도록 한다. 그러면 그 클래스는 상수를 바로 사용할 수 있게 된다. 이것은 안티패턴이고, 이유는 두 가지다. 인터페이스의 원래 의도를 오염시킨다. 내부에서 사용되는 상수를 외부로 바로 노출시킨다. (내부 구현 노출) 아래에서 이 내용들을 하나씩 살펴보고자 한다. // ..