본문 바로가기
[Effective Java] 바운드 와일드 카드를 사용해서 API 의 유연성을 높이자. [Effective Java] 바운드 와일드 카드를 사용해서 API 의 유연성을 높이자. - 매개변수화 타입은 불변(invariant) 이다. 서로 다른 두 개의 타입 Type1, Type2 에 대해 List, List 는 서브 타입도 수퍼 타입도 아니다. - 매개변수화 타입은 불변이기 때문에, 바운드 와일드 카드 타입(bounded wildcard type)을 사용해야 유연성이 좋다. 예) -> 를 사용하였기에 null 이외에는 put 을 할 수 없다. 이 경우 1번의 방법을 helper 로 갖는 function 을 하나 더 가져야 한다. 하지만, public 하게는 raw type 도 받을 수 있어 유연성은 더 좋다. Summary 메소드 API에 와일드 카드 타입을 사용하면 코드 작성이 조금 어려워.. 2016. 12. 5.
[Effective Java] 배열보다는 List 를 사용하자. [Effective Java] 배열보다는 List 를 사용하자. - 배열은 두 가지 관점에서 제네릭 타입과 다르다. 1. array는 공변(covariant). Sub이 Super 의 서브 타입이라면, 배열 타입 Sub[] 은 Super[] 의 서브 타입이라는 의미. 제네릭은 불변(invariant). Type1 와 Type2 가 있을 때, 이들의 관계는 모두 무시하고, List 과 List 는 서로 슈퍼도 서브도 아니다. 이 차이를 기반으로 제네릭이 유연성을 떨어뜨린다고 볼 수 있지만, array는 안전성을 보장하지 못한다. 배열을 사용하면 런타임 에러를 발생시키기 쉽고, List 를 사용하면 컴파일 에러를 마딱뜨리기 쉽다. 당연히 컴파일 시 에러를 발견하는 것이 최고다. 2. array 는 구체적(r.. 2016. 11. 28.
[Effective Java] public 클래스에서는 public 필드가 아닌 접근자(accessor) 메소드를 사용한다. public 클래스에서는 public 필드가 아닌 접근자(accessor) 메소드를 사용한다. - 어떤 클래스가 자신이 속한 패키지의 외부에서 접근 가능하다면 무조건 접근자 메소드를 제공하자. - 만일 패키지 전용 클래스거나 private inner class 라면 데이터 필드를 노출해도 아무 문제가 없으며 ( 클래스 설계를 잘 했다는 가정 하에 ), 접근자 메소드를 사용하는 것보다 코드를 알아보기 쉽다. - public 클래스에서 내부 필드를 외부로 노출하는 것은 결코 좋은 발상이 아니지만 필드가 불변이라면 그나마 덜 해롭다. Summary public 클래스는 자신의 가변 필드를 절대로 외부에 노출시키지 않아야 한다. 논란의 여지는 있으나 불변 필드를 노출하는 것은 그나마 덜 해롭다. 패키지 전용 또.. 2016. 10. 21.
[Effective Java] equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자. equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자. - equals 메소드를 오버라이드 하는 모든 클래스에서는 반드시 hashCode 메소드도 오버라이드 해야 한다. 그렇게 하지 않으면 Object.hashCode 메소드의 보편적 계약을 위반하게 되어, HashMap 과 HashSet 및 HashTable 을 포함하는 모든 hash 기반 컬렉션들에서 제대로 작동 안 할 수 있다. - HashCode 의 메소드 명세 계약 사항은 아래와 같다. 1. equals 메소드에서 비교하는 객체의 값이 변경되지 않는다면, 여러번 호출해도 일관성 있는 정수를 반환해야 한다. ( 단 어플리케이션이 재실행 될 때까지 같을 필요는 없다. ) 2. equals 메소드 호출 결과 두 .. 2016. 10. 5.
[iOS Study] ARC 를 통한 메모리 관리 [iOS Study] ARC 를 통한 메모리 관리 출처 : 아론 힐리가스의 iOS 프로그래밍 - 메소드나 함수가 실행되면 스택(stack)이라고 하는 메모리 영역의 일부가 할당된다. 이 할당된 메모리 공간을 프레임(frame)이라고 한다. -프로그램을 시작하고 main() 이 실행되면 main() 의 프레임이 스택에 들어간다.main() 이 다른 메소드(또는 함수)를 호춣하면 그 메소드의 프레임은 스택의 꼭대기에 들어간다. 각 메소드나 함수가 끝날 때마다 해당 프레임은 스택 꼭대기에서 즉시 빠져나와 사라진다.그 메소드가 다시 호출되면 새 프레임이 할당되고 스택에 들어간다. - ARC(자동 레퍼런스 카운팅, Automatic Reference Counting) 가 프로그램의 메모리 관리를 대신해준다. - .. 2016. 2. 15.
병렬 프로그램을 위한 어노테이션 병렬 프로그램을 위한 어노테이션 클래스 어노테이션 - @Immutable, @ThreadSafe, @NotThreadSafe. - @Immutable 어노테이션은 해당 클래스가 불변(immutable) 클래스임을 나타낸다. 자동적으로 @ThreadSafe 이기도 하다. - @NotThreadSafe 어노테이션은 해당 클래스가 스레드 안전성을 확보하지 못하고 있다는 의미이다. 스레드 안전성을 확보했다는 어노테이션을 달지 않은 모든 클래스는 당연하게 @NotThreadSafe 이기 때문에 꼭 사용해야만 하는 것은 아니다. 다만 한눈에 알아볼 수 있도록 하려면 @NotThreadSafe 어노테이션을 달아두는 편이 좋다. - 어노테이션은 상대적으로 방해되는 부분이 적으면서 클래스 사용자나 유지보수 담당자 모두에.. 2015. 7. 20.
[Effective Java] 불필요한 객체의 생성을 피하자. 불필요한 객체의 생성을 피하자. - 기능적으로 동일한 객체를 필요할 때마다 매번 새로 생성하기보다는 하나의 객체를 재사용하는 것이 좋을 때가 많다. 재사용을 하면 객체 생성에 소요되는 비용(시간과 자원)이 절감되어 실행 속도가 더 빨라지고 코드도 보기 좋게 작성할 수 있다. 불변(immutable) 객체는 항상 재사용이 가능하다. - 불 필요한 객체 생성을 막기 위한 첫번째 좋은 방법은 static 팩토리 메소드를 사용하는 것이다. - 불변객체가 아닌 가변객체더라도 상태가 변경되지 않는 것이 보장되면 재사용 가능하다. - 재사용을 막기 위한 static 팩토리 메소드에서 늦 초기화 ( lazy initialization ) 을 하는 경우가 있는데, 후에 다루겠지만 두드러진 성능 개선이 나타나진 않고, 오.. 2015. 4. 30.
반응형