전체 글

전체 글

    자바 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()가 달라질 필요는 없다. 단, 해시테이블 성능 최적화를 위해서 다르게 나오..

    이펙티브 자바, 쉽게 정리하기 - item 10. equals는 일반 규약을 지켜 재정의하라

    equals는 일반 규약을 지켜 재정의하라 equals() 메서드의 함정 기본적으로 객체의 내용이 동일한지 논리적 동치성을 확인하는 메서드이다. 하지만, 직접 구현하다보면 생각치 못한 여러가지 함정이 있으므로 직접 구현하지 않는 편이 안전하다. 구현하지 않아야 할 때 각 인스턴스가 본질적으로 고유할 때 ex) 스레드는 각각의 스레드가 고유하다. 인스턴스의 논리적 동치성을 검사할 일이 없을 때 상위 클래스에서 재정의한 equals()가 하위클래스에서도 문제없이 이용 가능할 때 ex) Map, Set은 AbstractMap, AbstractSet에서 내려받은 equals()를 그대로 사용한다. 클래스가 private 혹은 package-private일 때 논리적 동치성과 객체 식별성이 같은 의미를 가지게 될..

    이펙티브 자바, 쉽게 정리하기 - item9. try-finally보다는 try-with-resources를 사용하라

    try-finally보다는 try-with-resources를 사용하라 자바 라이브러리 내부의 close() 메서드 자바에서는 종종 .close() 메서드를 통해 자원을 닫아줘야 하는 경우가 있다. 주로 외부의 리소스를 사용했을 때이다. 외부의 리소스는 로컬 PC 환경에 존재하는 리소스일 수도 있고, 네트워크로 연결된 다른 컴퓨터에 존재하는 리소스(Connection)일 수도 있다. finalizer를 안전망으로 활용하긴 하지만, item8에서 배웠듯 딱히 믿을만하진 않다. try-finally를 이용하여 리소스 닫기 예제 1 - 반환할 자원이 1개일 때 static String firstLineOfFile(String path) throws IOException { BufferedReader br = ..

    이펙티브 자바, 쉽게 정리하기 - item8. finalizer와 cleaner 사용을 피하라

    finalizer와 cleaner의 사용을 피하라 자바가 제공하는 객체 소멸자 자바에서는 2가지 객체 소멸자를 제공한다. finalizer와 cleaner이다. 그러나, 이 두 소멸자는 기본적으로 쓰지 말아야 한다. 이후에 나오지만 try-catch-with-resources 방식이 권장된다. finalizer와 cleaner를 지양해야 하는 이유 가비지 컬렉터에 의해 실행이 결정되며, 즉시 실행된다는 보장은 없다. 객체에 접근하지 못하게 된 뒤로 finalizer나 cleaner가 실행되는데 얼마나 소요되는지 알 수 없다. finalizer와 cleaner가 즉시 실행된다는 보장이 없을 때 생기는 문제 ex) 시스템이 동시에 열 수 있는 파일의 갯수는 한정되어 있다. 열었던 파일을 닫아주지 않으면, 더..

    이펙티브 자바, 쉽게 정리하기 - item7. 다 쓴 객체 참조를 해제하라

    다 쓴 객체 참조를 해제하라 Stack 코드의 예제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } pri..

반응형