고급 자바
-
Item 17. 변경 가능성을 최소화하라백수의 개발/이펙티브 자바 2019. 10. 2. 16:38
불변 클래스 인스턴스의 내부 값을 수정할 수 없는 클래스이다. 불변 클래스의 인스턴스는 객체가 생성되는 시점에 초기화 되고 소멸될 때까지 절대 달라지지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하기 쉽다. 불변 클래스는 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 클래스를 만드는 5가지 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록(상속을 막는다) 한다. 클래스를 final로 선언 모든 생성자를 private로 선언, 생성자 정적 팩터리 메서드를 제공 모든 필드를 final로 선언한다. (스레드 안전함) 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근 할 수 없도록 한다. 객체의 참조를 얻을 수 없..
-
Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라백수의 개발/이펙티브 자바 2019. 10. 1. 12:31
class Point{ public double x; public double y; } 위와 같은 클래스는 데이터 필드에 직접 접근할수 있으니 캡슐화의 이점을 제공하지 못한다.(퇴보한 클래스) API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다. 따라서, 필드들을 모두 private로 바꾸고 public 접근자(getter)를 추가한다. 접근자와 설정자 제공 class Point{ private double x; private double y; public Point(double x, double y){ this.x = x; this.y = y; } public double getX() { return x; } publi..
-
Item 15. 클래스와 멤버의 접근 권한을 최소화하라백수의 개발/이펙티브 자바 2019. 9. 30. 12:00
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능 향상을 시키지는 않지만, 성능 최적화에 도움을 준다. 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있도록 하기 때문이다. 소프트웨어의 재사용성을 높인다. 외부에 거의 의존하지 ..
-
Item 14. Comparable을 구현할지 고려하라백수의 개발/이펙티브 자바 2019. 9. 29. 19:45
Comparable의 compareTo()는 단순 동치성 비교뿐만 아니라 순서까지 비교할 수 있으며, 제네릭하다. 따라서 Comparable을 구현했다는 것은 해당 클래스의 순서가 있음을 의미한다. 그로 인해 아래와 같이 간단하게 정렬을 사용할 수 있는 객체가 된다. Arrays.sort(a); CompareTo 메서드의 일반 규약 이 객체와 주어진 객체의 순서를 비교한다. 이 객체가 주어진 객체보다 작으면 음의 정수(-1)를, 같으면 0을, 크면 양의 정수(1)를 반환한다. 이 객체와 비교할 수 없는 타입이 주어지면 ClassCaseException을 던진다. 1. 대칭성 Comparable을 구현한 클래스는 모든 x, y에 대해 sgn(x.compareTo(y)) == -sgn(y.compareTo(..
-
Item 13. clone 재정의는 주의해서 진행하라백수의 개발/이펙티브 자바 2019. 8. 27. 20:32
Cloneable 인터페이스 Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스(mixin interface)이다. 그러나 clone 메서드가 Cloneable이 아닌 Object에 protected로 명시되어 있다. 그래서 Cloneable을 구현한다고 해서 clone을 호출할 수 없다. 그럼에도 불구하고 Cloneable 방식은 널리 사용되고 있어 올바르게 사용하는 방법을 알아보자. Cloneable의 역할 메서드 하나 없는 Cloneable 인터페이스는 Object의 protected 메서드인 clone의 동작 방식을 결정한다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 모두 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스..
-
Item 12. toString을 항상 재정의하라백수의 개발/이펙티브 자바 2019. 8. 22. 17:38
Object의 기본 toString 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 일반적으로 TestClass@a7cd(클래스이름@16진수로 표시된 해시코드)와 같이 보여줄 뿐이다. 그래서 toString을 재정의하여 사람이 읽기 쉬운 형태의 유익한 정보를 반환할 필요가 있다. toString를 재정의하는 이유 전화번호를 저장하는 PhoneNumber객체가 있을 때, 이를 출력한다고 가정해보자. PhoneNumber Jeny = new PhoneNumber(707, 867, 5309); System.out.println("Jeny PhoneNumber : " + Jeny); 이와 같이 했을 때, 'Jeny PhoneNumber : PhoneNumber@abcd'와 'Jeny..
-
Item 11. equals를 재정의하려거든 hashCode도 재정의하라백수의 개발/이펙티브 자바 2019. 8. 20. 17:43
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 이는 HashMap이나 HashSet같은 컬렉션의 원소로 사용할 때 문제를 일으킬 수 있기 때문이다. hashCode의 규약 equals에 비교되는 정보가 변경되지 않았다면, hashCode 메서드는 일관되게 항상 같은 값을 반환해야 한다.(단, 애플리케이션 재실행 시 값이 달라져도 상관없다.) equals가 두 객체를 같다고 판단했다면, 두 객체의 hashCode도 동일해야 한다. equals가 두 객체를 다르다고 판단하더라도, 두 객체의 hashCode가 다른 값을 반환할 필요는 없다.(단, 다른 값을 반환해주어야 해시테이블의 성능이 향상된다.) hashCode 재정의가 안되거나, 잘 못된 경우 대부분 hashCode 재정의 ..
-
Item 10. equals는 일반 규약을 지켜 재정의하라백수의 개발/이펙티브 자바 2019. 8. 13. 17:51
equals 메서드는 객체 내의 정보들에 대한 동등성을 비교하기 위한 메서드이다. 비교 가능한 객체의 경우 equals 메서드를 잘못 작성하게 되면 의도하지 않은 결과가 초래되니, equals를 재정의하는 방법에 대해 알아보자. equals를 재정의하지 않아도 되는 경우 1. 각 인스턴스가 본질적으로 고유하다. 데이터나, 객체의 정보를 표현하는 것이 아닌, 동작하는 개체를 표현하는 클래스가 이에 속한다.ex) Thread 2. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. java.util.regex.Pattern은 Pattern의 인스턴스가 같은(동치성) 정규표현식을 나타내는지 검사할 필요가 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 대부분의 Set 구현체들..