본문 바로가기

이펙티브 자바9

이펙티브 자바 - 계승대신 구성 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 계승(extends)은 코드 재사용을 돕는 강력한 도구이지만 잘못 사용하면 S/W 가 깨지기 쉽다. 계승을 사용하기전에는 아래와 같은 사항들을 고려해보는것이 좋다. 단일 패키지내에서 상위 클래스와 하위 클래스 구현자가 같은 경우 계승을 고려해 설계되었으며 문서를 갖춘 클래스인 경우 만약 객체 생성 가능 클래스라면 해당 클래스가 속한 패키지밖에서 계승을 시도하는것은 위험하다. - 계승의 문제점 메소드 호출과 달리 계승은 캡슐화 원칙을 위반한다. 상위 클래스 A 와 이를 extends 한 하위 클래스 B가 있다고 가정해보자. 하위 클래스 B를 변경하지 않아도 release 가 거듭되면서 상위 클래스 A 의 동작이 변경되면 하위 클래.. 2021. 11. 6.
이펙티브 자바 - 변경가능성 최소화 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 변경 불가능(immutable) 클래스 변경 불가능 클래스란 수정할 수 없는 클래스를 말하며, 객체가 생성될 때의 정보가 살아있는 동안 그대로 보존된다. 우리가 자주 사용하는 String, 기본 자료형(primitive type), Big Integer, Big Decimal 등이 모두 변경 불가능 클래스에 해당한다. 변경 불가능 클래스는 설계와 구현이 쉬우며 Client 가 사용하기도 쉽다. 그리고 오류 발생가능성이 적어 훨씬 안전하다. 변경 불가능 클래스가 지켜야 할 5 가지 규칙은 아래와 같다. 상태 변경 메소드(ex - setter, mutator) 를 제공하지 않는다. 계승(extends) 를 막아야 한다. 보통은 final.. 2021. 10. 30.
이펙티브 자바 - Public 클래스의 Public 필드 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 public 클래스에서 멤버 변수를 public 으로 대외에 공개하지 말라는 규칙을 본적이 있을것이다. 이렇게 멤버 변수를 대외에 공개하면 많은 문제점들이 일어날 수 있다. 캡슐화의 이점을 누릴수가 없다. 내부표현을 변경하기 위해서 API 를 변경해야 한다. 불변식을 강제할 수 없다. 필드 사용시 그에 따른 동작을 수행할 수 없다. 해결법은 그리 어렵지 않은데 public 멤버 변수를 private 변수와 public 접근자 메서드로 변경하는것이다. - 공개해도 괜찮은 경우 private 변수와 public 접근자 메서드는 정설처럼 여겨져서 많은 사람들이 지키는 규칙이다. 그래서 코딩할 때 해당 변수는 외부에 공개되어도 되는 변.. 2021. 10. 26.
이펙티브 자바 - 클래스와 멤버 접근 권한 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 어떤 클래스가 잘 설계되었는지 판단할 수 있는 요소에는 여러 가지가 있지만, 그 중 하나는 구현 세부사항을 얼마나 잘 감추었는가이다. 이 규칙을 잘 지키면 각 모듈들끼리는 API 를 통해서만 의사소통하며 구현 세부사항은 각 모듈내부로 제한된다. 이것이 우리가 흔히 말하는 '정보은닉'과 '캡슐화'이다. - 정보은닉 정보은닉은 모듈과 모듈사이의 의존성을 줄여주기때문에 중요하다. 모듈 사이의 의존성이 줄어들면 각각 개발, Test, 최적화, 변경을 손쉽게 할 수 있으며 대규모 시스템을 개발할때 위험(Risk)을 낮춰준다. Java 에서 정보은닉을 구현하려면 클래스, 인터페이스 멤버들에 접근제어자를 사용해야 한다. 정보은닉을 위한 몇 .. 2021. 10. 19.
이펙티브 자바 - Comparable - 이 글은 Effective Java 를 기반으로 작성되었습니다. - Comparable 개요 compareTo 메소드는 Comparable 인터페이스에서 유일한 메소드이며, 여태까지 다루었던 메소드들과는 달리 Object 에 선언되어 있지 않다. compareTo 는 equals 와 특성이 비슷하지만 순서 비교가 가능하며 좀 더 일반적이다. 순서 비교가 가능하므로 검색하거나 최대/최소를 계산하고 정렬 상태를 유지할 수 있는 특징이 있다. Comparable 은 compareTo 메소드 하나만 갖는 간단한 인터페이스이지만 이를 구현하면 다양한 제네릭 알고리즘 및 해당 인터페이스를 사용하도록 설계된 컬렉션 구현체들과도 전부 연동할 수 있어서 매우 강력하다. 따라서 알파벳 순서, 값 크기, 시간 선후관계처.. 2021. 10. 17.
이펙티브 자바 - hashCode 재정의 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - hashCode 재정의의 중요성 equals 를 재정의할 때는 반드시 hashCode 도 재정의 해야 한다. 그러지 않으면 HashSet, HashMap, HashTable 과 같은 Hash 컬렉션을 사용할 때 문제가 발생할 수 있다. Object 클래스 명세에서 hashCode 에 관한 일반 규약을 살펴보자. equals 가 사용하는 정보가 변경되지 않는다면 hashCode 를 여러 번 호출해도 동일 hash 값을 반환해야 한다. equals 메소드가 같다고 판정한 두 객체는 같은 hash 값을 반환해야 한다. equals 메소드가 다르다고 판정한 두 객체의 hash 값이 같을 수는 있다. 하지만 이런 일이 자주일어나면 성능이 떨어.. 2021. 10. 2.
이펙티브 자바 - 유효기간이 지난 객체 참조 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - Java 의 GC C, C++ 처럼 메모리 관리를 손수 하다가 Java 를 처음 사용해보면 편리함을 느끼게 된다. 메모리 관리를 손수하지 않아도 GC 가 알아서 해주기 때문이다. 그렇다며 메모리 관리는 전혀 신경쓰지 않아도 되는거 아닌가 라고 착각하게 될 수 있는데 이는 잘못된 생각이다. - 유효기간이 지난 객체 참조 자료구조를 젤 처음 접할 때 보통은 Queue 나 Stack 을 구현하게 된다. Stack 의 경우 배열을 선언해놓고 push, pop 연산시 index 를 증감시킨다. public class SimpleStack { private Object[] elements; private static final int DEFAU.. 2021. 9. 19.
이펙티브 자바 - 불필요한 객체 생성 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 불필요한 객체 생성 기능이 동일한 객체가 있다면 새로 생성하지 않고 재사용을 하는 편이 좋다. 특히 변경 불가능한 immutable 객체의 경우 값을 변경하지 않기 때문에 언제나 재사용이 가능하다. String test1 = "test1"; String test2 = "test1"; String test3 = new String("test1"); String test4 = new String("test1"); 위의 코드에서 모두 같은 test1 이라는 문자열을 생성하지만 test1 과 test2 는 리터럴 형식으로, test3 과 test4 는 new 를 이용해서 String 객체를 생성했다. test1 과 test2 는 JVM 내에.. 2021. 9. 18.
이펙티브 자바 - 싱글턴 패턴 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 싱글턴 싱글턴은 객체를 하나만 만들 수 있는 클래스이다. 1.5 이전 버전의 JDK 에서는 2 가지 방법으로 싱글턴을 구현할 수 있다. 하나는 정적 멤버를 선언하는 것이고 다른 하나는 정적 팩토리 메소드를 이용하는 것이다. 이 방법으로 어떻게 싱글턴을 구현할 수 있는지 살펴보자. 2 가지 방법은 구현방법이 다르지만 공통점이 있는데 생성자가 private 여야 한다는 것이다. 생성자를 private 로 써야한다니 뭔가 있어 보이지만 생각해보면 객체가 하나만 존재하려면 자기자신 외에 생성자를 호출하면 안되므로 당연한것이다. - 정적 멤버 첫번째 방법은 정적 멤버 final (static final) 멤버를 초기화하고 이를 외부에 공개하는.. 2021. 9. 18.