JAVA/Effective Java
메서드- 규칙 43 null 대신 빈 배열이나 컬렉션을 반환하라.
다음과 같은 상황을 보자. getData()를 통해 Babo 클래스를 담고 있는 List를 반환받고 그 반환된 List를 통해서 어떤 행위를 Main 메서드에서 실행한다고 가정해보자. 123456789101112131415161718192021package effective42; import java.util.List; public class Main { public static void main(String args[]) { System.out.println(getData().contains(new Babo())); } public static List getData() { return null; } static class Babo { int a; int getA() { return a; } }}Col..
메서드- 규칙 42 varags는 신중히 사용하라.
Varags는 가변 인자 메서드로 자바 1.5부터 공식적으로 추가되었다. 이 메서드는 지정한 자료형의 인자를 0개 이상으로 받을 수 있다. 기본 형태는 다음과 같다. 123public int sum(String... args) { System.out.println(args.size());}Colored by Color Scriptercs varargs 가변 인자 메서드는 0개 이상 인자를 받을 수 있기 때문에 인자를 보내지 않아도 사용할 수 있다. 이런점이 편리할 수도 있으나 문제점을 야기할 수 있다. 만약 인자를 가지고 동작을 하도록 설계된 함수가 있다고 해보자. 12345public void getString(String... args) { for (int i = 1; i
메서드- 규칙 41 오버로딩할 때는 주의하라.
오버로딩을 조심하라는 이번 주제를 확인하기 전에 오러로딩이 무엇인지 정리해보자. 오버로딩이란 오버로딩은 같은 이름의 메소드를 파라미터를 달리하여 사용하는 메서드를 말한다. 아래에 보면 오버로딩이 된 printData를 int와 string 데이터들이 사용하는 것을 볼 수있다. 12345678910111213141516171819public class Effective41 { public static void main(String args []) { printData(10); printData("test"); } public static void printData(int data) { System.out.println("test " + data); } public static void printData(S..
메서드- 규칙 40 메서드 시그니처는 신중하게 설계하라.
메서드를 설계할 때 주의해야 할 부분과 좋은 개선 방안에 대한 이야기를 살펴보겠다. 1. 메서드 이름을 신중하게 고르라. - 개발을 진행하면서 어려운 부분중에 네이밍 규칙이 꼽히는 것 같다. 메서드뿐만 아니라 변수를 선언을 할 때에도, 이름을 지어야하는데 쉽지 않은 것 같다. - 일관성을 유지해야하고, 일반적인 이름을 사용하지 않아서 혼돈을 격을 수 있는경우를 피해야한다. 2. 편의 메서드(convenience method)를 제공하는데 너무 열 올리지 마라. - 자주 사용하는 메서드를 정의하기 위해서 우리는 CommonUtil등에 정의를 하여 공통으로 사용할 수 있도록 하는경우가 많다. - 하지만 이는 유지보수, 테스트와 같은 여러 측면에서 번거로움이 생길 수 있기에 그럴지 모르겠다면 빼버려라. 3. ..
메서드- 규칙 39 필요하다면 방어적 복사본을 만들라.
포인터를 사용하지 않아 잘못된 메모리 접근으로 다른 메모리 영역에 데이터를 건드려서 beffer overrun(오버플로우)등의 오류는 자바에서는 발생하지 않는다. 하지만 아무리 안전한 언어를 사용한다고 해도, 스스로 노력하지 않는 경우, 클래스의 클라이언트가 불변식(invariant)을 깨버릴 수 있기 때문에, 조금 더 방어적인 프로그래밍을 해야 한다. 예를 통해서 확인해보자. 결재정보를 담고 있는 BillTimeObj라는 클래스는 결재 날짜 정보를 가지고 있는 Date 클래스를 생성자를 통해서 전달받는다. BillTimeObj 클래스는 final로 선언되어 있어서 변경되지 않을 것 같아 보이지만 생성자로 전달되는 Date 객체가 변경이 가능하기 때문에 이는 불변식이 깨져버린다. 1234567891011..
메서드- 규칙 38 인자의 유효성을 검사하라.
만약 메서드에서 파라미터 값으로 전달되는 값을 제한해야 하는 경우 어떤 값이 들어오면 시스템이 죽거나, 잘못된 데이터가 나온다는 것을 기재해 놓아야 한다. 그렇지 않으면 심각한 문제가 발생될 수 있다. 그렇기 때문에 몇 가지 안전장치를 마련해야 한다. 방법 - 만약 인자 유효성을 위반하는 경우는 Javadoc의 @throw 태그를 사용하여 문서화 해야 한다. 1234567/** * * @throw ZeroDivisionException (0으로 나누었을 때)*/public int getData() { return 222/0;}Colored by Color Scriptercs - assertion을 이용하여 인자 유효성 체크할 수 있다. - assertion은 항상 참이 되어야 한다. 만족되지 못하면 As..
어노테이션 - 규칙 37 자료형을 정의할 때 표식 인터페이스를 사용하라.
표식 인터페이스(marker interface)는 아무런 메스드도 없는 인터페이스이다. 클래스를 선언할 때 이런 표식인터페이스를 선엉ㄴ하는 이유는 해당 클래스가 어떤 속성을 만족한다는 사실을 표시하는 것과 같다. 표식 인터페이스의 장점은 다음과 같다. 1. 표식 인터페이스는 자료형이기 때문에 컴파일 시 오류를 탐지할 수 있다. 예를 들어서 살펴보자. Wedul이라는 표식 인터페이스를 만들고 Cjung클래스는 이를 구현하고, Gglee 클래스는 이를 구현하지 않았다. 이때 Wedul 인터페이의 인자를 받는 메서드 makeBar를 선언해놓고, 이 메소드에 파라미터로 Cjung과 Gglee를 넣었다. 이때 Wedul 인터페이스를 구현하지 않은 gglee 클래스 객체는 넣을 때 컴파일러에서 오류를 뱉는다. 12..
어노테이션 - 규칙 36 Override 어노테이션은 일관되게 사용하라.
자바 1.5에 어노테이션이 추가되었을 때, 자바 기본 라이브러리에 몇 가지 어노테이션 자료형이 추가되었다. 그 중 대표적인 어노테이션 @Override이다. @Override 어노테이션은 메서드 선언부에서만 사용할 수 있고, 부모 자료형에 선언된 메서드를 재정의 할 때 사용한다. 만약 메서드를 재정의 할 때 @Override 어노테이션을 입력하지 않으면 다음과 같은 문제가 발생할 수 있다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162package effective36; import java.util.Objects; /** * Stdudent c..
Enum - 규칙 35 작명 패턴 대신 어노테이션을 사용하라.
만약 특정 작업을 수행할 메서드를 구별하는데 메서드 이름을 사용한다고 가정해보자. 만약 testRoute라는 메서드를 tsetRoute라고 잘못 기입했다면? 이는 실행되지 않을 것이다. 이렇게 이름을 통해서 특정 기능을 실행하게 한다면, 오타와 같이 특수상황에서 실행이 되지 않았다는 것을 알기 어려울 뿐만아니라, 사용하기에도 네이밍 규칙을 지켜야하기 때문에 좋은 방법이 아니다. 이를 해결하기 위해서 사용하는 방법이 자바 1.5버전에 나온 어노테이션이다. 어노테이션을 이용하게 되면 실행될 메소드 지정하기 수월할 뿐 아니라 해당 메서드 안에서 예외가 발생하면 메서드가 실패한 것으로 지정하기도 편하다. 어노테이션 만들기 어노테이션 선언부 위에 존재하는 Retention, Target이라는 어노테이션들은 메타-..
Enum - 규칙 34 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라.
연산자를 정의해둔 Enum을 사용할 때 더많은 유형의 자료형을 사용하기 위해서 기존의 enum객체를 계승해서 작성하고 싶을 수 있다. 하지만 enum 자료형은 계승해서 사용하는 방법은 어렵다. 왜냐하면 모든 Enum 객체들은 함축적으로 Enum 객체를 상속받고 있다. 자바에서는 클래스는 하나이상의 부모를 가질 수 없으므로, enum 객체는 추가 상속이 어렵다. 그렇기에 인터페이스를 먼저 구현하고 그에 맞게 enum을 구현할 수 있도록 인터페이스를 활용하는 방식으로 대처할 수 있다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676..