본문 바로가기

전체 글

(52)
[item15] 클래스와 멤버의 접근 권한을 최소화하라 캡슐화의 장점: 정보은닉 캡슐화를 통해 얻는 대표적인 장점은 정보 은닉이다. 필요한 정보만 노출시키고 불필요한 정보를 숨겨서 객체의 자율성을 보장시킬 수 있다. 캡슐화를 통해 2가지 이점을 어을 수 있다. 데이터 보호: 외부로부터의 데이터 접근을 막아 데이터가 오염되는 것을 방지한다 데이터 은닉: 외부에서 책임을 요청할 때 필요한 정보만 명시하여 외부에서 내부의 자세한 동작 없이도 책임을 요청해 수행시킬 수 있다. 이팩티브자바의 현 챕터에서는 정보 은닉에 대한 관점을 이 내용을 서술한다. 이팩티브 자바에서 제시하는 정보 은닉을 통해 얻는 이점은 다음과 같다. 시스템 개발 속도를 높인다. 시스템 관리 비용이 낮아진다. 성능 최적화에 도움을 준다 재사용성을 높인다 시스템의 책임을 컴포넌트별로 분리하기에 시스..
[item14] Comparable를 구현할지 고려하라 Comparable 인터페이스 이 클래스로 만들어진 객체들은 순서를 매길 수 있도록 하는 인터페이스이다. 주로 정렬에 사용되며 이외에도 검색, 극단값 계산등에도 이용할 수 있다. Clonable과 달리 compareTo(T o) 라는 자기 자신을 가리키는 객체가 있어서 Cloneable에서 느꼈던 복잡한 내용을 이해하지 않아도 되어서 편하다. compareTo(T o) 의 일반 규약 signum(signum function/부호함수) signum(x.compareTo(y)) == -signum(y.compareTo(x)) equals 일반 규약의 대칭성을 만족해야한다는 의미이다. 두 객체의 비교 순서를 바꾸면 부호만 바뀐 동일한 결과가 나와야 한다. x.compareTo(y) > 0 && y.compar..
[item13] clone 오버라이딩은 주의해서 진행해라 Cloneable 인터페이스 Cloneable 인터페이스는 이 클래스는 복제가 가능함을 명시하는 목적으로 사용하는 mix interface이다. 그러나 clone() 메소드는 인터페이스가 아니라 최상위 객체인 Object 클래스에 작성이 되어 있다. 그래서 Cloneable 인터페이스에는 아무것도 적혀있지 않는다. public interface Cloneable { } Cloneable 인터페이스를 상속 받지 않으면 clone를 호출할 시 CloneNotSupportedException 예외가 발생한다. clone 메소드 일반 규약 x.clone() != x 는 true이다. x.clone().getClass() == x.getClass() 는 true 이다. x.clone().equals(x) 는 tr..
[item12] toString은 항상 오버라이딩하라 toString() 메소드 최상위 객체인 Object 클래스에 작성되어 있으며 객체를 String으로 표현하는 책임을 가진다. 왜 항상 재정의를 해야할까? Object 클래스에 toString은 다음과 같이 작성되어 있다. public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 클래스명@해시코드 로 String 객체를 만들어 반환해준다. 이 방법의 문제점은 String으로 보여주는 내용으로 프로그래머가 얻을 수 있는 정보가 거의 없다. 클래스명, 해시코드를 알면 실제 객체를 알아보기 위한 시간이 더 소모된다. 심지어 해시 코드는 프로그램이 실행될 때마다 달라질 수 있으므로 디버깅이 더 ..
[item11] equals와 hashCode는 같이 정의해라 hashCode의 역할 hashCode는 객체의 해시코드를 반환해주는 책임을 수행하는 메소드이다. 해시라는 값은 같은 객체라면 같은 해시값을, 아니면 다른 해시값값을 반환해야야한다. hashCode는 Set,HashMap 등의 Collections에서 해시를 직접 사용하는 객체에 영향을 줄 수 있다. hashCode 규약 hashCode도 equals와 마찬가지지로 규약이 있다. JavaDocs로 작성된 Object명세에 다음과 같이 작성되어 있다. equals 를 통한 비교 정보가 달라지지 않았으면 hashCode도 변하지 않아야 한다. 단 어플리케이션이 재실행되면 값이 변할 수 있다. 두 객체의 equals의 결과가 true이면 같은 hashCode 를 가진다 두 객체의 equals의 결과가 fals..
[item10] equals는 일반 규약을 지켜 재정의해라 equals 메소드 객체의 동등성을 비교하기 위한 메소드이며 Object 객체에 정의되어 있기에 모든 객체들이 가지고 있는 메소드이다. 동등성과 동일성 필자도 가끔 햇갈리는데 정리좀 하겠다. 동등성: 참조하는 객체가 다르지만 값이 같다. 동일성: 참조하는 객체가 같아 값과 주소가 같다. 동일성을 가진 객체들은 값을 수정하면 관련된 모든 객체레 적용되지만 동일성은 참조하는 주소가 다르기에 값을 수정하면 동일성을 깨지지만 동일성을 가졌던 다른 객체에 영향을 주지 않는다. equals(Object obj) method equals메소드는 두 객체가 같음을 확인하는 책임을 가진 메소드이다. 이 메소드는 최상위 객체인 Object객체가 정의하고 있기에 모든 객체들은 equals메소드를 가지고 있다. equals는..
[item9] try-finally보다 try-with-resources를 사용해라 자원의 회수방법에 대해서 파일, DB 커낵션등 자원을 사용한 후에 회수를 위해 직접 닫아야 하는 자원들이 있다. try-finally finally 블록에 사용이 완료한 자원을 닫아 처리가 실패해 예외가 발생하더라 하더라도 자원의 회수는 무조건 실행하도록 하는 방법이다. public void processFile(String fileName) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new FileReader(fileName)); String line; while ((line = br.readLine()) != null) { // 파일 내용 처리 } } finally { if (br != null) { br...
[item7] 다 쓴 객체 참조를 해제하라 java에도 메모리 문제가 나온다. GC는 만능이 아니다. 대부분의 메모리의 자원의 회수를 GC가 해준다고 해도 가져올 수 없는 상황들이 발생된다. 메모리 문제가 발생할 수 있는 경우 cache의 사용: 객체를 캐싱한 후에 사용을 잊어버려 어떤 데이터인지 모르게 만든다. 메모리를 직접 관리하는 클래스 리스너와 콜백의 명확하지 않는 해지 예방법 내장 객체를 이요할 시 Weak 유형의 객체를 사용해라. 다 쓴 객체는 null참조를 통해 참조를 해제하여 GC가 메모리 할당을 해제하도록 유도한다. Weak Reference로 콜백을 등록 결론 it에는 '은총알은 없다' 라는 관용구를 자주 쓰인다. GC라는 것이 겉으로 보기에는 메모리 문제를 완전히 해결해주는 은총알 처럼 보이지만 아니다. GC도 모든 메모리 문..