Java
이펙티브 자바, 쉽게 정리하기 - item 20. 추상 클래스보다는 인터페이스를 우선하라
이펙티브 자바, 쉽게 정리하기 - item 20. 추상 클래스보다는 인터페이스를 우선하라 추상 클래스와 인터페이스 살펴보기 공통점 메서드의 시그니쳐만 만들고 구현을 구현 클래스에게 맡긴다. 차이 추상클래스: 단일 상속만 가능하다. 구현체는 추상클래스의 하위 클래스가 된다. 인터페이스: 다중 상속이 가능하다. 인터페이스를 구현했다면, 같은 타입으로 취급된다. 인터페이스의 장점 활용하기 1: 믹스인(mixin) 믹스인: 구현 클래스에 '선택적 행위'를 제공한다고 선언하는 효과를 준다. ex) Comparable, Iterable, AutoCloseable, Serializable 추상 클래스는 이미 다른 클래스를 상속하는 클래스의 경우, 해당 클래스가 두 부모 클래스를 가질 수는 없으므로 믹스..
이펙티브 자바, 쉽게 정리하기 - item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.
이펙티브 자바, 쉽게 정리하기 - item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. 상속용 클래스가 지켜야 할 것들 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 어떤 순서로 호출하는지, 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다. 재정의 가능 메서드란 public, protected 중 final이 아닌 모든 메서드를 말한다. 재정의 가능한 메서드를 호출할 수 있는 모든 상황을 문서로 남기는 것이 좋다. 백그라운드 스레드나 정적 초기화 과정에서 호출될 수도 있으므로 유의하자. Implentation Requirements와 @implSpec 태그 - remove() 의 예 API 문서 메서드 설명 끝에서 발견할 수 ..
이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라
이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라 상속의 단점 여기서 이야기하는 상속은 '클래스 상속'이며, 인터페이스 상속과는 무관하다. 상속은 캡슐화를 깨뜨린다. 모듈을 만들 때는 객체지향 설계 원칙(SOLID)에 의해 응집도는 높고 결합도는 낮은 모듈을 만들고 변경사항이 있을 때는 클라이언트의 코드만 변경하는 것이 이상적이다. 그런데, 다른 객체를 상속 받는 하위 클래스는 상위 클래스의 구현 내용 변경에 따라 하위 클래스의 구현 내용도 바뀔 수 있다. 그 말은 즉, 코드 한줄 건드리지 않은 하위 클래스가 오동작할 수 있다는 것이다. 이러한 방식으로 상속은 캡슐화를 깨뜨릴 수 있다. 상속에서 일어나기 쉬운 실수 1: 자기사용 static class Inst..
이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라
이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라 불변 클래스 불변클래스란, 인스턴스 내부 값을 수정할 수 없는 클래스이다. 불변 클래스 내부 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바에는 String, 기본 타입 박싱 클래스, BigInteger, BigDecimal이 있다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉽다. 오류가 생길 여지도 적고 훨씬 안전하다. 클래스를 불변으로 만드는 방법 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. (상속이 불가능하게 만든다.) 모든 생성자를 private 혹은 package-private으로 만들고 정적 팩터리를 제공한다. 모든 필드를 final로 선언한다..
자바 CountDownLatch란?
CountDownLatch 란? 공식문서 설명 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. A CountDownLatch is initialized with a given count. The await methods block until the current count reaches zero due to invocations of the countDown() method, after which all waiting threads are released and any subsequent invocations of aw..
이펙티브 자바, 쉽게 정리하기 - item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 접근자와 변경자 활용의 이점 접근자와 변경자는 자바 소스에서 흔히 보이는 getter와 setter이다. 외부에서 필드에 직접 접근하는 것이 아니라 메서드를 통해 값을 얻거나 변경할 수 있도록 만드는 것이다. 단순히 public 필드를 외부에 공개하면, 추후에 클라이언트에 의해 이 클래스가 사용될 때 public 필드를 직접 이용하는 경우가 생기고, 이 경우 내부 표현 방식을 마음대로 바꿀 수 없게 된다. 단, package-private 클래스 혹은 private 중첩 클래스와 같은 경우는 public으로 필드 값을 노출해도 아무런 문제가 없다. 이 경우 클라이언트가 이 클래스를..
이펙티브 자바, 쉽게 정리하기 - item 15. 클래스와 멤버의 접근 권한을 최소화하라
이펙티브 자바, 쉽게 정리하기 - item 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트의 기준 내부 데이터와 내부 구현 정보를 외부로부터 얼마나 잘 숨겼느냐가 중요하다. 정보은닉, 캡슐화라고 한다. 시스템을 구성하는 컴포넌트를 독립시켜 개발, 테스트, 최적화, 적용, 분석, 수정이 개별적으로 가능해야 한다. 정보 은닉의 장점 컴포넌트간 의존성이 없어서 독립적으로 병렬로 개발 가능하기 때문에, 시스템 개발 속도가 높아진다. 컴포넌트별 디버깅이 가능하기 때문에, 시스템 관리 비용이 낮아진다. 컴포넌트별 최적화가 가능하기 때문에, 성능 최적화 하기가 쉽다. 컴포넌트간 의존성이 없기 때문에, 어디든 넣어 재사용 가능하다. 컴포넌트별 테스트가 가능하기 때문에, 큰 시스템의 제작 난이도를 낮춰..
이펙티브 자바, 쉽게 정리하기 - item 14. Comparable을 구현할지 고려하라
이펙티브 자바, 쉽게 정리하기 - item 14. Comparable을 구현할지 고려하라 Comparable 이란? 믹스인 인터페이스이다. 유일한 구현 메서드인 compareTo에 같은 객체끼리의 natrual order를 정의한다. equals()와 같이 동치도 비교하며, 순서도 비교하니 업그레이드된 버전이다. Comparable 구현의 이점 Comparable을 구현한 객체의 배열은 쉽게 정렬 가능하다. Arrays.sort(a) Collection 객체들에서도 정렬을 활용할 수 있다. TreeSet 자료구조 같은 경우, Comparable을 구현한 타입만 제너릭으로 받을 수 있다. String 타입을 넣는 경우, 들어간 모든 문자열을 알파벳순으로 출력 가능하다. natrual order만 정의해줄 ..
이펙티브 자바, 쉽게 정리하기 - item 13. clone 재정의는 주의해서 진행하라
clone 재정의는 주의해서 진행하라 Clonable의 역할 복제해도 되는 클래스임을 나타내는 믹스인 인터페이스이다. Object 클래스에 protected clone()이라는 메서드가 있다. Cloneable 인터페이스는 clone() 메서드의 동작방식을 결정한다. Cloneable을 구현하지 않은 인스턴스에서 clone()을 호출하면 CloneNotSupportedException을 던진다. clone() 사용해보기 static class Entry { String key; String value; public Entry(String key, String value) { this.key = key; this.value = value; } @Override protected Object clone() ..
자바 믹스인(mixins)이란?
믹스인이란? 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스이다. '포함'으로 설명된다. '상속'과 주로 비교되는 개념이다. (is-a vs has-a) Composition 혹은 Aggregation 이라고 불리기도 한다. 코드 재사용성을 높여주고, 상속의 단점을 해결할 수도 있다. 자바코드에서는 다중 상속의 제한이 없는 인터페이스로 구현하기 용이하다. 대상 타입의 주된 기능에 선택적 기능을 '혼합(mixed in)'한다고 해서 믹스인이라 불린다. 예제 코드 public interface Singer { AudioClip sing(Song s); } public interface Songwriter { Song compose(..
이펙티브 자바, 쉽게 정리하기 - item 12. toString을 항상 재정의하라
toString을 항상 재정의하라 toString() 메서드를 재정의해야 하는 이유 디버깅이 쉬워진다. 재정의하지 않으면 PhoneNumber@dbadd와 같이 클래스_이름@16진수_해시코드만 나온다. 재정의하면, 010-0000-0000과 같이 의미있는 정보를 볼 수 있다. 재정의 했다면, System.out.println(phoneNumber)와 같이 작성하면 내부 내용을 볼 수 있으므로 디버깅하기 쉽다. Map과 같은 경우, 내부에 많은 값을 가지고 있는데 toString()을 재정의하면 갖고 있는 모든 값을 알아내기에 매우 좋다. println(), printf(), + 연산자 등 toString() 메서드는 알게 모르게 많이 불려진다. 코딩이 쉬워진다. 만일 사용자에게 값을 보여줘야 할 일이 있..
이펙티브 자바, 쉽게 정리하기 - item 11. equals를 재정의하려거든 hashCode도 재정의하라
equals를 재정의하려거든 hashCode도 재정의하라. hashCode 일반 규약 equals()를 재정의한 클래스 모두에서 hashCode()도 재정의해야 한다. 그렇지 않으면, HashMap 혹은 HashSet의 원소가 되었을 때 문제가 발생할 수 있다. equals() 비교에 사용되는 필드가 변하지 않았다면, hashCode() 메서드는 몇번을 호출하든, 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 재시작한 경우에는 달라질 수 있다. equals(Object)가 두 값을 같다고 판단했다면, hashCode()의 반환 값도 같아야 한다. equals(Object)가 두 객체를 다르다고 판단했더라도, hashCode()가 달라질 필요는 없다. 단, 해시테이블 성능 최적화를 위해서 다르게 나오..