본문 바로가기
[Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. [Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. - 비어있는 배열이나 컬렉션 대신 null 을 반환하는 메소드를 사용할 때는 null checking 을 하는 복잡하고 긴 형태의 코드를 작성해야 한다. 또한 클라이언트 코드를 작성하는 프로그래머가 반환 값인 null 을 처리하는 코드 작성을 잊어버리면 NullPointerException 이 발생하기 쉽다. - 비어있는 배열보다는 null 값을 반환하는 것이 좋다는 주장도 있다. 배열을 생성하는 비용이 들지 않기 때문이다. 그러나 두 가지 면에서 이는 틀렸다. 1. 해당 메소드가 정말로 성능 문제의 원인인지 성능 프로파일에 나타나지 않으면 이런 경우에는 성능 우려를 할 것이 못 된다. 2. 길이가 0인 배열은 불변 객체이.. 2017. 1. 19.
[Effective Java] 오버로딩(overloading)을 분별력 있게 사용하자. [Effective Java] 오버로딩(overloading)을 분별력 있게 사용하자. public class CollectionClassifier{public static String classify(Set s){return "Set";} public static String classify(List lst){return "List";} public static String classify(Collection c){return "Unknown Collection";} public static void main(String[] args){Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() };for( Col.. 2017. 1. 16.
[Effective Java] 메소드 시그니처를 신중하게 설계하자. [Effective Java] 메소드 시그니처를 신중하게 설계하자. - 메소드 이름을 신중하게 짓자. 이름은 항상 표준 작명 규칙을 따라야 한다. 이름에는 일관성이 있어야 한다. 폭넓게 공감 가는 이름을 선택해야 한다. - 편리한 메소드를 만드는데 너무 열중하지 말자. 모든 메소드는 자신의 역할을 해야 한다. 메소드가 너무 많으면, 클래스를 배우고 사용하고 문서화하고 테스트하고 유지하기가 어렵다. 클래스나 인터페이스가 지원하는 각 동작에 대해서 충분한 기능을 수행하는 메소드를 제공하자. - 너무 많은 매개 변수를 피하자. 매개 변수는 네 개 이하를 목표로 하자. 매개 변수가 네 개를 넘으면 시종일관 문서를 참조하지 않고는 그 메소드 API 를 사용할 수 없다. 같은 타입의 매개 변수가 길게 나오면 특히 .. 2017. 1. 12.
[Effective Java] 필요하면 방어 복사본을 만들자. [Effective Java] 필요하면 방어 복사본을 만들자. - 자바는 꽤나 안전한 언어이지만, 우리 클래스의 클라이언트가 불변 규칙을 파괴하기 위해 최선을 다할 거라는 가정하에 방어적으로 프로그램을 작성해야 한다. - 가변 객체인 매개 변수는 각각의 방어복사본(defensive copy)을 만들어서 생성자에 전달해야 한다. 그렇지 않으면 예상치 못한 여러 상황이 발생할 수 있다. - 방어복사본은 매개 변수의 유효성 검사에 앞서 만들어야 하며, 유효성 검사는 원본이 아닌 복사본을 대상으로 해야 한다!! ( TOCTOU 공격 ( 검사시간/사용시간) 이슈 ) - clone 은 위험한 복사방법이므로 가급적이면 다른 방법으로 복제하자. final 이 아닌 Class 는 sub class 가 clone 을 상속.. 2017. 1. 10.
[Effective Java] 매개 변수가 유효한지 검사하기. [Effective Java] 매개 변수가 유효한지 검사하기. - 대부분의 메소드와 생성자는 자신들의 매개 변수로 전달될 수 있는 값에 제한을 둔다. 그런 모든 제약은 명확하게 문서화해야 하며, 메소드 몸체 코드의 맨 앞에서 검사하도록 해야 한다. 이것은 에러가 발생한 후 가능한 빨리 검출해야 한다는 일반적 원칙의 특별한 경우이다. 만일 사전 검사에 실패하면 에러의 검출이 불확실하게 되고, 에러가 생긴 소스 코드를 찾기가 더욱 어려워진다. - public 메소드의 경우는 javadoc 의 @throws 태그를 사용해서 매개 변수 값의 제약을 위반했을 때 발생되는 예외를 문서화한다. 일반적으로 IllegalArgumentException, IndexOutOfBoundsException, NullPointe.. 2017. 1. 9.
[Effective Java] 타입 정의는 표시 인터페이스를 사용하자. [Effective Java] 타입 정의는 표시 인터페이스를 사용하자. - 표시 인터페이스(marker interface)는 메소드 선언은 전혀 없으면서 클래스가 그 인터페이스를 구현하는지만 나타내는(표시하는) 인터페이스이다. - annotation 이 이를 대체할 수도 있겠지만, marker interface 는 annotation 에 비해 두 가지 장점이 있다. 1. marker interface 는 표시된 클래스의 인스턴스에 의해 구현되는 타입을 정의한다. 2. 더 정확한 목표를 가질 수 있다. ( annotation 은 class 한정이 아니다. ) - annotation 도 장점이 있다. 1. 주요 장점은 이미 발표되어 사용 중이라도 기본적으로 하나 이상의 주석 타입 요소들을 추가함으로써 더 많.. 2017. 1. 5.
[Effective Java] Override 주석을 일관성 있게 사용하자. [Effective Java] Override 주석을 일관성 있게 사용하자. - 슈퍼 클래스의 메소드를 오버라이드 한다고 생각되는 모든 메소드에 Override 주석을 사용해야 한다. 그래야 잘못된 오버로딩을 방지할 수 있다. 이 규칙에는 한가지 예외가 있다. 실체 클래스를 작성하면서 추상 메소드를 오버라이드 한다면 Override 주석을 잘 필요가 없다. 그러나 주의를 환기시키기 위해서 이 경우에도 Override 를 넣는 것이 좋다. Summary 수퍼 타입의 메소드를 오버라이드하는 모든 메소드에 Override 주석을 달아주면, 컴파일러가 굉장히 많은 에러를 막아줄 수 있다. concrete class, Effective JAVA, override, [Effective Java] Override 주.. 2017. 1. 3.
[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.
[Django] 파이썬 웹 프로그래밍 - 파이썬 웹 표준 라이브러리 [Django] 파이썬 웹 프로그래밍 - 파이썬 웹 표준 라이브러리 - 책을 읽으며 Remind 하는 내용, 핵심 내용, 모르던 내용을 정리한 것입니다. 예문 및 자세한 설명은 책을 구매하여 보세요~ - 파이썬을 설치하면 기본적으로 같이 설치되는 표준 라이브러리가 있는데, 크게 웹 클라이언트 프로그래밍이냐 웹 서버 프로그래밍이냐에 따라 사용하는 라이브러리 모듈이 달라진다. - urllib 패키지에는 웹 클라이언트를 작성하는 데 사용되는 모듈들이 있으며, 가장 빈번하게 사용하는 모듈이다. http 패키지는 크게 서버용과 클라이언트용 라이브러리로 나누어 모듈을 담고 있고, urllib 에 비해 저수준의 API 를 제공한다. - 서버 프로그래밍에서는 http.cookie, .. 2016. 12. 8.
반응형