item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스 라고 한다. 대표적인 예가 Serializable이다 package java.io; public interface Serializable { } 자바에서 직렬화를 사용하고 싶은 클래스에 Serializable을 붙여주면된다. 직렬화 : 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술 Serializable 인터페이스를 구현한 클래스는 ObjectOutputStream.writeObject 메서드를 통해 직렬화..
item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라 불공변인 제네릭 타입 서로 다른 Type1 Type2가 있을 때 List은 List의 하위 타입도 상위 타입도 아니다. List 에는 어떤 객체든 넣을 수 있지만 List에는 문자열만 넣을 수 있기 때문에 리스코프 치환 원칙에 어긋나 하위타입이 될 수 없다. 한정적 와일드카드 타입 - 생산자 와일드카드를 사용하지 않은 pushAll 메서드 public void pushAll(Iterable src) { for (E e : src) { push(E); } } Stack numberStack = new Stack(); Iterable iterable = ...; numberStack.pushAll(iterable); Integer는 Numbe..
item 24. 멤버 클래스는 되도록 static으로 만들어라 중첩클래스 다른 클래스 안에 정의된 클래스를 말한다. 자신을 감싼 바깥 클래스에서만 사용되어야 한다. 중첩 클래스를 사용함으로써 불필요한 노출을 줄여 캡슐화를 할 수 있고 유지보수하기 좋은 코드를 작성할 수 있다. 중첩 클래스 종류 정적 멤버 클래스 비정적 멤버 클래스 익명 클래스 지역 클래스 정적 멤버 클래스 정적 멤버 클래스와 비정적 멤버 클래스를 구분하는 기준은 static 키워드가 함께 작성되었는지 여부로 판단할 수 있다. class Outer { private int out = 100; static class Inner { private int in; void callOut() { Outer outer = new Outer(); Sy..
개발을 하다보면 인스턴스 필드들만 모아놓는 목적만 가진 아래와 같은 클래스를 구성하는 경우가 있다. class Point { public double x; public double y; } 이러한 클래스 형태로 구현하였을 때는 클라이언트에서 필드에 직접 접근할 수 있으므로 캡슐화의 이점을 제공하지 못한다. 그리고 또 다른 단점들은 API를 수정하지 않고는 내부 표현을 바꿀 수 없다. public 필드로만 구성되어 있기 때문에 내부 표현을 변경하기 위해서는 필드를 변경해야 한다. 불변식을 보장할 수 없다. 클라이언트에서 직접적으로 필드에 접근하고 있으므로 클라이언트에 의해 언제든지 변경이 가능하다. 외부에서 필드에 접근 할 때 부수적인 로직을 추가할 수 없다. Point.x 라는 필드를 조회했을 때 부수적..