본문 바로가기
[Effective Java] 인스턴스 제어에는 readResolve 메소드보다 enum 타입을 사용하자. [Effective Java] 인스턴스 제어에는 readResolve 메소드보다 enum 타입을 사용하자. - readResolve 메소드는 readObject 메소드에서 생성한 인스턴스를 다른 인스턴스로 바꾸어준다. 만일 역직렬화되는 객체의 클래스에서 readResolve 메소드를 올바르게 정의하면 그 객체가 역직렬화된 후 그 결과로 새롭게 생성된 객체에 대해 이 메소드가 자동 호출되며, 이 메소드에서 반환하는 객체 참조가 역직렬화로 새롭게 생성된 객체 대신 반환된다. - 싱글톤의 경우 다음과 같은 방법으로 싱글톤을 유지할 수 있다. private Object readResolve(){// Deserialization 으로 생성된 새로운 녀석은 GC 된다.return INSTANCE;} - readRe.. 2017. 3. 27.
[Effective Java] Serializable 인터페이스를 분별력 있게 구현하자. [Effective Java] Serializable 인터페이스를 분별력 있게 구현하자. - 객체 직렬화(object serialization) API 는 객체를 바이트 스트림으로 인코딩하고, 인코딩된 바이트 스트림으로부터 객체를 복원(디코딩) 하는 프레임워크이다. - 객체를 바이트 스트림으로 인코딩하는 것을 직렬화(serializing)이라 하고, 그 반대의 절차를 역직렬화(deserializing)이라고 한다. - 객체가 일단 직렬화되면, 인코딩된 객체는 향후에 역직렬화 하기 위해 하나의 실행 중인 VM 에서 다른 VM 으로 전송되거나 디스크에 저장될 수 있다. 직렬화는 원격 통신을 위한 표준 통신 회선 수준의 객체 표현을 제공한다. 직렬화 프록시는 effective java 의 직렬화 주제중 가장 .. 2017. 3. 21.
[Effective Java] 잘 판단해서 최적화하자 [Effective Java] 잘 판단해서 최적화하자 - 최적화에 대한 명언이 있다. 더 많은 컴퓨팅 죄악이 다른 어떤 한 가지 이유(무지로 인한 어리석음을 포함해서)보다는 효율성(달성이 안 되는)의 이름으로 저질러진다. 사소한 효율성은 잊어야 한다. 97%의 시간에 대해 논하자. 성급한 최적화는 모든 죄악의 근원이다. 최적화에 관한 두 가지 규칙을 따르자. 규칙 1. 하지 말자. 규칙 2. (전문가에 한해서). 아직 하지 말자. 정말 최적화되지 않은 솔루션이 있을 때까지는. - 성급한 최적화는 얻는 것보다 잃는 것이 더 많기 쉽다. 최적화를 하면서 빠르지도 않고 제대로 동작하지도 않으며, 문제를 쉽게 해결하기도 어려운 소프트웨어를 만들기도 쉽다. - 성능 때문에 훌륭한 아키텍쳐 원리를 포기하지 말자. .. 2017. 2. 16.
[Effective Java] 매개 변수가 유효한지 검사하기. [Effective Java] 매개 변수가 유효한지 검사하기. - 대부분의 메소드와 생성자는 자신들의 매개 변수로 전달될 수 있는 값에 제한을 둔다. 그런 모든 제약은 명확하게 문서화해야 하며, 메소드 몸체 코드의 맨 앞에서 검사하도록 해야 한다. 이것은 에러가 발생한 후 가능한 빨리 검출해야 한다는 일반적 원칙의 특별한 경우이다. 만일 사전 검사에 실패하면 에러의 검출이 불확실하게 되고, 에러가 생긴 소스 코드를 찾기가 더욱 어려워진다. - public 메소드의 경우는 javadoc 의 @throws 태그를 사용해서 매개 변수 값의 제약을 위반했을 때 발생되는 예외를 문서화한다. 일반적으로 IllegalArgumentException, IndexOutOfBoundsException, NullPointe.. 2017. 1. 9.
[Effective Java] 작명 패턴보다는 주석(annotation)을 사용하자. [Effective Java] 작명 패턴보다는 주석(annotation)을 사용하자. - 1.5 배포판 이전에는 도구나 프레임워크에서 특별히 취급할 필요가 있는 프로그램 요소들을 나타내기 위해 작명 패턴(naming pattern)을 사용하는 것이 일반적. 예를 들어 JUnit 테스팅 프레임워크에서는 테스트 메소드들의 이름을 test로 시작하도록 하였다. 이 방법은 효과는 있지만 단점들이 있다. 1. 철자상의 오류로 인한 오류 2. 적합한 프로그램 요소에만 사용되는지 확신할 방법이 없다. 3. 매개 변수 값을 프로그램 요소와 연관시키는 좋은 방법을 제공하지 않는다. - 작명패턴의 단점은 annotation 을 사용하여 깔끔히 해결된다. - annotation 정의는 다음과 같이 한다. @Retention.. 2017. 1. 2.
[Effective Java] int 상수 대신 enum 을 사용하자. [Effective Java] int 상수 대신 enum 을 사용하자. - int enum pattern 이라고 불리는 int 를 이용한 분기는 단점이 많다. - 타입 안전을 보장하지도 않고, 편리하게 사용할 수 있는 방법도 제공하지 않는다. 즉 취약하다. - int enum 상수를 출력 가능한 문자열로 쉽게 바꾸는 방법도 없다. - 하나의 int enum 그룹에 있는 모든 상수를 loop 처리하거나, 그룹 사이즈를 알 수 있는 좋은 방법도 없다. - int enum 패턴의 변이로 String enum 패턴이 있는데 더더욱 바람직하지 않다. print 하는 부분에서는 좋지만, 문자열 비교에 의존하여 성능 문제가 생길 수도 있다. 더욱 문제가 되는 것은 필드명 대신 string 상수 값을 클라이언트 코드에.. 2016. 12. 19.
[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] 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다. 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다. - 메소드 오버라이딩으로 인한 파급 효과를 분명하게 문서화해야 한다. 같은 클래스의 다른 메소드들이 호출하는지에 대해 반드시 문서화해야 한다. ( self-use ) - 각각의 public 이나 protected 메소드 및 생성자가 어떤 오버라이드 가능한 메소드를 호출하는지, 어떤 순서로 하는지, 호출한 경로가 다음 처리에 어떤 영향을 주는지에 대해서도 반드시 문서화해야 한다. 오버라이드 가능하다는 것은 final 이 아니면서 public 이나 protected 인 경우를 의미한다. - 관례적으로 오버라이드 가능한 메소드를 호출하는 메소드에는 문서화 주석의 제일 끝에 그런 호출에 대한 설명을 추가한다. 그리고 설명의 시작은 "이.. 2016. 11. 1.
[Effective Java] 가변성을 최소화 하자. [Effective Java] 가변성을 최소화 하자. -불변 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스. - 불변 클래스는, 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 에러 발생이 적으며 보안이나 사용 측면에서 더 안전하다. - 불변 클래스를 만들 때는 다음 다섯 가지 규칙을 따르자. 1. 객체의 상태를 변경하는 그 어떤 메소드도 제공하지 않는다. 2. 상속을 할 수 없도록 하자. ( class 에 final 을 주어 막을 수 있다. ) 3. 모든 필드를 final 로 지정한다. 4. 모든 필드를 private 으로 지정한다. 5. 가변 컴포넌트의 직접적인 외부 접근을 막자. 생성자와 접근자 메소드 및 readObject 메소드에서 해당 객체의 방어 복사본을 만들어 사용하도록.. 2016. 10. 24.
반응형