목록개발/자바 (4)
LALA's blog
Exception 상속 구조 예외는 진짜 예외 상황에만 사용해라 예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다. try { int i = 0; while (true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } 코드를 try-catch 블록 안에 넣으면 JVM 이 적용할 수 있는 최적화가 제한된다. 예외를 사용한 경우 표준 관용구보다 훨씬 느리다. 또한 어떤 문제가 있을 수 있을까? 반복문 안에 버그가 숨어 있다면 흐름제어로 사용된 예외가 이 버그를 잡고 숨기게 되어 디버깅을 어렵게 만든다. 만약 climb() 내부 어딘가에서 관련없는 배열을 사용하다 ArrayIndexOutOfB..
미션을 수행하면서 객체가 가지고 있는 Collection 을 get 해오는 경우가 종종 있었다. 그 경우 원본 Collection 의 참조값을 넘겨주면 어떻게 될까? 복사본의 Collection 을 add() 혹은 remove() 를 통해 컬렉션 요소를 변경시킬 경우 어떤 문제가 발생할까? 복사본은 원본 Collection 과 동일한 참조값을 가지고 있기 때문에 원본 Collection 의 요소들도 변경되게 된다. 이는 객체지향의 캡슐화를 완벽히 무너뜨리는 방법이므로 주의해야할 점이다. (getter 를 안 쓰도록 해야 하지만..) 1. 방어적 복사 생성자를 통해 초기화하거나 내부의 객체를 반환할 때, 새로운 객체로 감싸서 복사해주는 방법이다. 외부와 내부에서 주소 값을 공유하는 인스턴스의 관계를 끊어주..
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { ... } Map 인터페이스의 구현체이다. AbstractMap 을 상속받는다. HashMap 는 순서가 아닌 수행 시간의 가장 큰 장점을 가지고 있다. add, remove, find 에 평균 O(1) 의 속도를 발휘한다. (TreeMap 은 O(logN) 이다.) HashMap 은 외부에서 볼 때 항상 같은 형태를 띨 것 같지만, capacity 와 load factor 를 통해 동적으로 변화한다. capacity 는 해시테이블의 버킷 수이다. load factor 는 해시 테이블의 용량이 자동으로 증가하기 전에 해시 테이블이 얼마나 가득 차도록 허용되는..
equals와 hashCode는 모든 Java 객체의 부모 객체인 Object 클래스에 정의되어 있다. 그렇기 때문에 Java의 모든 객체는 Object 클래스에 정의된 equals와 hashCode 함수를 상속받고 있다. equals() boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용된다. eqauls가 구현된 방법은 2개의 객체가 참조하는 것이 동일한지를 확인하는 것이다. 즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. 모든 객체는 equals 메서드를 재정의하여 사용할 수 있다. equals 로 동치관계를 구현하는데, 이를 정의하기 위한 규칙이 있다. 반사성 : 객체는 자기 자신과 같아야 ..