본문 바로가기

Language/Java33

이펙티브 자바 - 계승을 위한 설계, 문서화 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 이전의 '계승대신 구성하라'는 규칙에서는 계승을 고려한 설계나 문서화가 되지 않은 클래스에 대해 하위 클래스 생성시 문제점을 살펴보았다. 그렇다면 '계승을 고려한 설계나 문서화'의 의미란 무엇인가? - 재정의 가능 메서드 문서 작성 재정의 가능 메서드는 non-final 인 public 이나 protected 접근제어자를 가진 메서드나 생성자를 말한다. 이들에 대해 재정의 가능 메서드의 호출 순서나 호출 결과를 문서로 남겨야 한다. 관습적으로 주석 맨 마지막 부분에 작성하며 '이 구현은~'으로 시작한다. /** * {@inheritDoc} * * This implementation iterates over the collecti.. 2021. 11. 21.
이펙티브 자바 - 계승대신 구성 - 이 글은 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.
이펙티브 자바 - clone 재정의 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - Cloneable 인터페이스 Cloneable 은 객체의 복제를 허용한다는 사실을 알려주는 믹스인(mixin) 인터페이스이다. 하지만 문제점이 한 가지 있는데 clone 메소드가 없고 Object 의 clone 메소드의 접근제어자가 protected 라는것이다. 이렇게 되면 clone 메서드가 구현되어있으리라는 보장이 없는데 그럼에도 불구하고 널리 사용되므로 알아둘 필요가 있다. Cloneable 은 protected 접근제어자를 갖는 Object 의 clone 메소드가 어떻게 동작할지를 정하는 역할을 한다. clone 메서드가 정의되어있지도 않은 Cloneable 인터페이스를 도대체 왜 신경써야하는지 의문이 들 수 있다. 그냥 Cl.. 2021. 10. 11.
이펙티브 자바 - toString 재정의 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - toString 의 default 구현 toString 을 별도로 재정의 하지 않고 그냥 사용하게 될 경우 기본형은 클래스명@16진수와 같은 형태를 띄게 된다. 프로그램에 특별히 해를 끼치는것은 아니지만 사람이 보기에 그다지 유용한 정보는 아니다. /** * Returns a string representation of the object. In general, the * {@code toString} method returns a string that * "textually represents" this object. The result should * be a concise but informative representation .. 2021. 10. 4.
이펙티브 자바 - hashCode 재정의 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - hashCode 재정의의 중요성 equals 를 재정의할 때는 반드시 hashCode 도 재정의 해야 한다. 그러지 않으면 HashSet, HashMap, HashTable 과 같은 Hash 컬렉션을 사용할 때 문제가 발생할 수 있다. Object 클래스 명세에서 hashCode 에 관한 일반 규약을 살펴보자. equals 가 사용하는 정보가 변경되지 않는다면 hashCode 를 여러 번 호출해도 동일 hash 값을 반환해야 한다. equals 메소드가 같다고 판정한 두 객체는 같은 hash 값을 반환해야 한다. equals 메소드가 다르다고 판정한 두 객체의 hash 값이 같을 수는 있다. 하지만 이런 일이 자주일어나면 성능이 떨어.. 2021. 10. 2.
이펙티브 자바 - equals 재정의 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - equals 재정의 equals 메소드는 IDE 에서 자동으로 완성해주기 때문에 쉽다고 생각할 수 있지만 사실은 생각해야할 게 많다. equals 메소드를 정의하지 않아도 되는 경우가 있는데 이때 모든 객체는 자기 자신과만 동일하다. - equals 메소드를 재정의 하지 않아도 되는 경우 각 객체가 고유한 경우: 주로 Value Object 가 아닌 활성 객체(Active Entity, ex - Thread) 와 같은 경우가 이에 해당한다. 클래스에 동치성 검사방법이 존재하지 않아도 상관 없을 때 상위 클래스의 equals 메소드를 하위 클래스에서 그대로 사용가능한 경우: 대부분의 Set, List, Map 클래스는 각각 Abstra.. 2021. 9. 23.