
public을 빼는게 좋아보인다. 내부 구현인데 다른 애들이 알 필요는 없다.package-private으로 하는게 낫다.한 클래스에서만 사용하는 package-private 클래스나 인터페이스는 해당 클래스에 private static으로 중첩 시키자.이렇게 사용하는

아이템 16. 핵심 정리

한번 만들어지면 그 상태가 바뀌지 않아야 한다.상속하면 다른게 추가가 되는데 바뀔 수 있는 객체가 되었다. 불변 클래스를 상속받으면서 불변 클래스가 아니게 객체의 상태를 바뀌도록 되었기 때문에 이상한 클래스가 만들어지는 것을 방지할 수 있다.final 키워드를 적어서

상속의 내부 구현을 알아야 한다.하위 클래스에서 기능을 추가한 경우 counting을 해서 개수를 새겠다. private으로 정의한다 했는데 상위 클래스에서 나중에 getAddCount() int 타입으로 정의한다면 그러면 또 깨진다. 이거에 대한 대안으로 컴포지션을

여기서 addAll을 부를 때 add도 부르게 되는데 그러면 addAll 사용 시 주석에 add를 호출한다고 문서를 적어줬어야 한다. 에러가 난다. 아래와 같은 -tag를 지정해주자.javadoc에서 확인 가능하다.Sub라는 생성자에서는 Super를 호출하고 처리하게

ZonedDateTime getZonedDateTime(String zoneString); 가 추가된 경우 기존에 implements한 코드들에서 전부 해당 기능이 깨지기 때문에 컴파일 오류가 난다.default 메소드로 제공할 수 있으면 굉장히 손쉽게 기능을 확장하고

Collection의 removeIfsynchronizedCollection은 모든 오퍼레이션을 동기화를 통해서 멀티스레드 환경에서 한 번에 오직 한 스레드만 해당 오퍼레이션 실행을 해야 하는데 여기 어디에도 동기화와 관련된 코드가 없기 때문에 멀티스레드 환경에서 안전

안티패턴이다. 인터페이스의 원래 의도를 오염시키기 때문이다.interface는 타입을 정의하려고 만든 것이다. interface에 정의된 상수들은 클래스 내부에서 사용하려고 만든 것인데 클래스 내부 정보가 인터페이스를 통해서 공개되었기 때문에 어떻게 보면 캡슐화가 깨진

쓸데없는 코드가 한꺼번에 다 모이게 되는 것이다. 모든 필드를 final로 사용하려면 생성자에서 모두 초기화해줘야 한다.모든 문제를 해결하는 방법은 상속을 사용하는 법이다.

정적 멤버클래스란 무엇이냐아래가 static 멤버 클래스이다. 정의되어 잇는 스콥이 클래스 범위에 정의가 되어 있다.바깥 클래스에 있는 static한 필드에 접근할 수 있다.바깥 클래스의 인스턴스를 필요로 하지 않는다. 그래서 이렇게 이너 클래스 인스턴스만 만들어서 얼

아이템 25. 톱 레벨 클래스는 한 파일에 하나만 담으라 컴파일을 어떻게 하느냐에 따라 결과가 달라질 수 있다. 컴파일 할 때 Utensil을 컴파일하는게 아니라 Desert와 Main이 컴파일을 한다면 potpie를 보게 되는 것이다. 셋 다 동시에 컴파일을 하

Law Type은 Object를 넣을 수 있다. Integer가 들어갔다고 가정하는데 String이 들어가면 에러가 안나기 때문에 문제를 발견해내기 어렵다.제네릭 사용 이후는 컴파일 오류가 나오기 때문에 좋다.형변환을 할 필요가 없어진다. E라는 타입을 사용할 수 있다

로타입을 사용했다는 뜻<> 다이아몬드 연산자를 사용하면 앞의 타입을 안 적어줘도 된다. 알아서 추론을 한다.아래것도 <>를 쓰면 경고가 사라진다. SuppressWarningsSuppressWarnings같은 경우 우리가 타입 안정성을 어떻게 여기서 보장할

오브젝트가 최상위 타입이니까 String은 오브젝트로 변환이 가능하다.제네릭은 불공변이다. 배열은 공변이다. 배열안에 들어가는 타입을 어떤 타입으로 변환하는 것이 가능하다.안에 들어가는 실제 인스턴스는 String의 배열이다. anyting0 = 1; 인 경우 버그이다

제네릭 클래스가 아닌 경우 타입을 반드시 형변환해줘야 한다.첫번째 방법은 object 대신에 generic type의 배열을 선언하고 대신에 여기서 오브젝트 타입의 배열을 만드는 것이다. 힙 오염이 발생할 여지가 있다.코드내에서 꺼내느 부분이 있다면 형변환을 해야 하는

합친 다음에 꺼내서 쓸 때 String이 나올것이다 라고 예측을 하면 오류가 난다.컴파일 타입에 방지하려면 제네릭 타입을 사용한 것을 적용시켜주면 된다.컴파일 타입에 체크가 되니까 안전하게 사용을 할 수 있다.다른 한가지 용도는 싱글턴 팩토리가 있다. stringIde

Number의 하위타입을 받아서 할 수 있기 때문에 들어갈 수 있다.Double도 들어갈 수 있다.extends E : 타입 아래에 있는 것들, 상속받은 클래스들을 의미한다. 뭔가를 저장하는 쪽이면 extendssuper E : E의 슈퍼 타입, 부모 클래스, 클래스가

String의 배열을 objects 배열에 넣는다.objects의 배열이니 integer를 할당할 수 있다.stringlists0.get(0)을 뺄 때 자바가 컴파일에서 문자열로 캐스팅을 할 수 있는 코드를 넣어준다.배열 보다는 리스트를 활용해서 해야 한다.SafeVa

clazz.cast로 하면 get을 할 때 해당 타입으로 나오게 된다.이 경우 문자열을 꺼낼 때 내가 요청했던 타입으로 숫자를 Integer로 형변환 하려고 한다. 그 후에 ClassCastException이 발생한다.넣을 때 오류가 나온다.덮어쓰게 된다.상속을 쓴 경