이펙티브

이펙티브

    규칙 74 - Serializable 인터페이스를 구현할 때는 신중하라.

    클래스 선언부에 implements Serializable를 붙히면 간단하게 직렬화 가능 객체를 만들수 있다. 그렇기 때문에 개발자 입장에서는 Serializable을 붙혀서 직렬화 기능을 만드는 것이 간단하다고 생각할 수 있다. 여기서 먼저 직렬화에 대해서 간단한 예제를 보고 가자. import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = 1L; public Student(String name, int number, int height) { this.name = name; this.number = number; this.height = heigh..

    규칙 73 - 스레드 그룹은 피하라.

    스레드 그룹(thread group)은 원래 applet을 격리시켜 보안문제 해결할 목적으로 만들어졌으나 성공하지 못했다. 그러면 이런 스레드 그룹은 왜 남아있는가? 아예 쓸곳이 없는가? 그렇지는 않다. 스레드 기본연산을 여러 스레드에 동시에 적용할 수 있도록 하는 기능을 가지고 있다. 하지만 대부분이 deprecated 되었다. 결론을 이야기하자면 이미 다 페기가 되어버린 기능이다. 그렇기 때문에 신경쓸 것 없이 사용하지 말아야한다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1)

    규칙 72 - 스레드 스케줄러에 의존하지마라.

    실행해야 할 스레드가 많을 경우 어떠한 스레드를 얼마나 오랫동안 실행할지 결정은 스레드 스케줄러가 진행한다. 운영체제마다 스레드 스케줄러는 다르기 때문에 아무리 운영체제에서 효율적으로 진행한다고 하더라고 이에 의존하여 프로그램을 제작해서는 안된다. 정확하고 좋은 스레드 프로그램은 의존하는것이 아니라 실행가능한 스레드의 개수가 프로세수 개수보다 넘지 않도록 제작하는 것이다. 그렇게되면 스레드 스케줄러가 순차적으로 스레드를 실행시켜줄뿐 정책에 신경쓰지않는다. 그렇다면 실행중인 스레드의 개수를 최대한 줄일 수 있는 방법은 무엇일까? 바로 사용하지 않는 스레드는 실행하지 않고 정지하거나 종료해야한다. 그래서 바로 직전에 공부했던 스레드 풀을 사용하여 적절하게 스레드를 관리하면 좋은 프로그램을 만들 수 있다. 그..

    규칙 71 - 초기화 지연은 신중하게 하라

    Lazy initialization(초기화 지연)은 필드 초기화를 실제로 그 값이 쓰일 때까지 미루는 것이다. 대부분 초기화 지연의 이유는 초기화의 비용이 증가하고 사용빈도가 특별한 경우에 사용하는 필드에 대해서 그렇게 적용한다. 만약 그렇지 않은 경우에도 초기화 지연을 사용하면 어떨까?이럴 경우 클래스를 초기화하고 객체를 생성하는 비용은 줄이지만 필드 사용 비용은 증가시킨다. 그럼 동기화가 필요한 다중 스레드 환경에서는 초기화 지연은 어떻게 구현해야할까? 생각만 해도 어렵다. 몇가지 방법을 살펴보자.우선 초기화 지연을 사용하지 않고 진행하는 일반적인 초기화는 다음과 같다.1234567891011 public class TestClass { // 일반적인 초기화 기법 // 클래스가 처음 로드될 때 바로 ..

    규칙 70 - 스레드 안전성에 대해문서로 남겨라.

    클래스를 사용할 때 클래스의 객체와 정적 메서드가 병렬적으로 이용되었을 때, 어떠한 부작용이 있을 수 있는지 안전한지에 대한 정보가 없으면 추후에 큰 문제를 야기할 수있다. JavaDoc에서 synchronized 키워드를 통해 병렬설 지원 여부를 확인할 수있다고 알고 있으나 실상 그렇지 않다. 왜냐하면 Javadoc이 만드는 문서에는 Javadoc이 들어가지 않는다. 왜냐하면 synchronized 키워드는 메서드의 구현 상세에 해당하는 정보이며, 공개 API의 일부가 아니기 때문이다. 그렇기 때문에 synchronized 키워드를 통해 판단해서는 안되고 병렬적으로 사용해도 되는지의 여부는 문서에 남겨져 있어야 한다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사..

    규칙 69 - wait나 notify 대신 병행성 유틸리티를 이용하라.

    멀티 쓰레드 환경에서 wait와 notify를 사용할 경우에 주의가 필요하다. 하지만 그것을 효율적으로 사용하기에는 많은 어려움이 따른다. 그렇기 위해서 wait와 notify를 정확하게 사용하기 위해서는 high-level util(고수준 유틸리티)을 사용해야 한다.이런 고수준 유틸리티들은 Executor, Concurrent Colloection, Synchronizer를 통해 사용할 수 있다.그중 Conncurrent Collenction (병행 컬렉션)에 대해 알아보자. 대부분에 컬렉션 Map, List, Queue등은 병행 컬렉션을 제공한다. 병행성 컬렉션대표적으로 Map에서 제공하는 ConcurrentMap이다. 그중 putIfAbsent(key, value) 메서드가 대표적이다. 이 메서드는..

    규칙 68 - 스레드보다는 실행자와 태스크를 이용하라.

    여러 쓰레드를 실행해야할 때, 큐에 넣고 작업을 진행하거나 할 수 있으면 더욱 효율적으로 관리 할 수있다. 그래서 자바 1.5부터 자바 플랫폼에는 java.util.concurrent가 추가되었다. 이 패키지에는 Executor Framework가 들어 있는데 이는 인터페이스 기반 task 실행 프레임워크이다. 해당 Executor를 실행하기 위해서는 다음과 같이 입력하면 된다.1234567ExecutorService executor = Executors.newSingleThreadExecutor(); executor. @Override public void run() { System.out.println("test"); }});Colored by Color Scriptercs 그리고 만약 executo..

    규칙 67 - 과도한 동기화는 피하라

    동기화 시에 너무 많은 동기화 블록을 사용할 경우에 데드락이 걸리거나 성능저하 등등 문제를 일으킬 수 있는 소지들이 몇 가지 있다. 특히 동기화 영역안에서 수행되는 작업의 양을 가능한 줄여야 한다. 자바에서는 동기화에 대한 비용처리가 그나마 잘되어있지만 잘 사용해야 하는 이유는 잘못된 동기화 사용은 각 쓰레드들의 메인 메모리 접근에 대한 지연시간을 늘릴 수 있기 때문에 비용이 증가할 수 있다. 또한 클래스 내에서 동기화를 수행하는 것이 외부에서 객체 호출 시 사용하는것 보다 높은 병행성을 달성 할 수 있을 때문 진행해야한다. 다시말하자면 필요할 때 해당 메서드등을 호출하여 동기화를 실행해야지 해당 메서드 자체를 동기화 하는것은 좋지 않다. 예를 들면 기존에는 StringBuffer를 사용하여 내부적으로 ..

    규칙 66 - 변경 가능 공유 데이터에 대한 접근은 동기화하라.

    우리는 동시에 사용이 가능한 객체에 대해서 synchronized키워드를 사용하여 락을 걸어 코드 블록을 한번에 하나의 스레드만 접근할 수 있도록 한다. 이런 동기화를 적절하게 사용하면 모든 메서드가 항상 객체의 일관된 상태만 바라보도록 할 수 있다. 하지만 동기화 없이는 한 스레드가 만든 변화를 다른 스레드가 확인할 수 없다. 동기화는 스레드가 일관성이 깨진 객체를 관측할 수 없도록 할 뿐 아니라, 동기화 메서드나 동기화 블록에 진입한 스레드가 동일한 락의 보호 아래 이루어진 변경의 영향을 관측할 수 있도록 보장한다. 그렇기 때문에 특정 객체의 값을 다른 쓰레드가 읽기를 원한다면 동기화를 무조건 진행해야한다.즉, 변경 가능한 공유 데이터에 대한 접근을 동기화 해야한다. 다음 예를 보자.123456789..

    규칙 65 - 예외를 무시하지마라.

    사용하려고 하는 API의 설계자가 예외가 발생될 수 있다고 명시한 예외는 조심해야한다. 무시방법은 간단하게 호출하는 메서드를 빈 catch 블록이 붙은 try 문으로 감싸면, 예외를 무시할 수있다. 12345try { } catch (Exception ex) { }cs 빈 catch 블록은 예외를 선언한 목적으로 만들어진다.만약 이렇게 빈 catch 블록을 만들려고 하는 경우에는 적어도 왜 넘겼는지 주석을 달아주는 것이 좋다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙65

    규칙 63 - 어떤 오류인지를 드러내는 정보를 상세한 메시지에 담으라.

    개발을 진행하다보면 예기치 못한 상황에서 에러가 자주 발생한다. 에러가 발생하는 것을 다 알고 차단할수있다면 정말 바람직한 프로그램이라고 할 수있을 것이다.하지만 그럴수가 없기때문에 에러를 관리하고 효율적으로 에러정보를 전달하는것이 중요하다. 정확한 에러정보를 전달하는것이 빠르게 문제를 해결하는 실마리가 될것이다.그래서 에러가 발생되었을 때 오류의 상세 메시지에 예외에 관련된 모든 인자와 필드값을 포함시켜야 한다. 예를 들어, IndexOutOfBounds Exception의 경우 해당 범위를 벗어난 인자값과 하한과 상한값도 포함되어있어야 한다. 그러면 정확히 어떻게 오류가 발생된 것인지 알기가 쉬워진다. 하지만 관련된 데이터를 담는 것이 중요하지만 잘못사용하면 별로 도움이 되지 않을 수 있다.그리고 이..

    규칙 62 - 메서드에서 던져지는 모든 예외에 대해 문서를 남겨라.

    메서드를 올바르게 사용하려면 메서드에서 던져지는 예외에 대한 설명이 문서에 있어야 한다. 그리고 메서드가 던질수있는 모든 무점검 예외까지 선언할 필요는 없지만 점검지점 예외들과 마찬가지로주의해서 문서로 남겨놓으면 좋다. 특히 Javadoc @throws 태그를 사용해서 메서드에서 발생 가능한 모든 무점검 예외에 대한 문서를 남겨야 한다. 하지만 메서드 선언부의 throws 뒤에 무점검 예외를 나열하지는 말아야 한다. 요약하자면 메서드가 던질 가능성이 있는 모든 예외를 문서로 남겨라. 점검지점 예외, 무점검 예외도 남겨라. 이를 지키지 않으면 해당 API를 사용하는 다른사람들이 효과적으로 사용하는게 어려워진다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(201..

    규칙 61 - 추상화 수준에 맞는 예외를 던져라

    메서드가 하는 일과 관련성이 없는 예외가 메서드에서 발생하면 디버깅하기 어렵거나 관리하기 어려울 수 있다. 이는 추상화 수준이 낮은 곳에서 발생한 예외를 그대로 밖으로 전달하면 이런일이 발생한다. 이런 문제를 해결하기 위해서 상위계층에서는 하위계층에서 발생하는 예외를 반드시 받아서 상위 계층 추상화 수준에 맞는 예외로 바꿔서 던져야한다. 이를 예외 변환(exception translation)이라고 한다. 예를 들어 몇가지 사례를 살펴보자. 우선 AbstractSequentialList 클래스를 살펴보자. 이 클래스의 get 메서드의 명세를 보면 예외가 발생되었을 때 예외 변환을 해서 보내달라는 것을 확인할 수 있다. 12345678910111213141516 /** * Returns the elemen..

    규칙 60 - 표준 예외를 사용해라

    예외를 사용할 때 기존에 정의되어있는 표준예외를 사용하는 것이 좋다. 그 이유는 다음과 같다. - 배우기 쉽고 사용하기 편리한 API를 만들수 있으며 다른 프로그래머들도 친숙한 널리 퍼진 관습을 따르기 때문이다. - 잘모르는 예외가 없어 API 가독성을 높일수있다. - 예외클래스를 별도로 만들어서 클래스를 늘리지 않으면 프로그램의 메모리 요구량이 줄어들고 클래스를 로딩하는 시간도 줄어든다. 대표적인 표준 예외 예외용례lllegalArgumentExceptionnull이 아닌 인자값이 잘못되었을때llegalStateException객체 상태가 메서드 호출을 처리하기에 적절치 않을때NullPointerExceptionnull 값을 받으면 안 되는 인자에 null이 전달되었을 때IndexOutOfBoundsE..

    규칙 59 불필요한 점검지정 예외 사항은 피하라.

    점검지점 예외 (checked error) 은 프로그래머에게 예외상황을 처리하도록 강제함으로써 안전성을 키울수있다. 하지만 모든것이 넘치면 부족하니 못한것처럼 점점지점 예외도 너무 남발하면 사용하기 불편한 API가 될수있다. 다음과 같은 경우를 예를 들어보자 12345try { obj.action(args);catch (Exception e) { ....}cs 만약 위에 코드에서 예외가 발생되지 않도록 미리 체크하는 부분이 있으면 굳이 점검지점예외를 사용하지 않아도된다. 12345if (obj.check(args)) { obj.action(args);} else { ...}cs 이렇게 리팩터링을 사용하면 좀더 유연하게 사용가능한 API가 될 것이다. 하지만 이런경우처럼 리팩터링을 진행할 수 없는 경우가 ..

    규칙 57 예외는 예외적 상황에만 사용하라.

    예외는 잘 사용하면 프로그램의 가독성, 안전성, 유지보수성을 모두 향상시킬 수 있다. 그러나 제대로 사용하지 않으면 반대 효과를 낼 수있다. 다음의 예를 보자. 12345678910111213141516171819202122232425262728public class Main { public static void main(String args[]) { int i = 0; Test[] data = new Test[] {new Test("t1"), new Test("t2")}; try { while(true) { System.out.println(data[i++].getData()); } } catch (ArrayIndexOutOfBoundsException ex) { } } static class Test..

    규칙 56 - 일반적으로 통용되는 작명 관습을 따르라

    자바의 작명관습은 두 가지 범주로 나눌 수 있다. 철자. -> 패키지, 클래스, 인터페이스, 메서드, 필드 그리고 자료형 변수에 관한 것 -> 아주 그럴듯한 이유가 없이 이 규칙을 어겨서는 안 된다. 1). 패키지 -> 마침표를 구분점으로 사용하는 계층적 이름 이어야 한다. -> 각각의 컴포넌트는 알파벳 소문자로 구성하고, 숫자는 거의 사용하면 안된다. -> 패키지 시작은 회사 조직의 도메인으로 시작한다. com.wedul -> 패키지명 컴포넌트는 짧아야 하며, 8자리 이하여야 한다. -> 약어를 사용하여 의미를 충분히 전달할 수 있어야한다. 2). 클래스, 인터페이스, Enum -> 하나이상의 단어로 구성된다. -> 각 첫 글자는 대문자로 시작해야 하며 널리 사용 되는 약어를 제외하고는 약어를 사용해서..

    규칙 54 - 네이티브 메서드는 신중하게 사용하라.

    자바의 네이티브 인터페이스 (JNI)는 C, C++ 등의 네이티브 프로그래밍 언어로 작성된 네이티브 메서드를 호출할 때 사용한다. 네이티브 메서드가 수행하는 계산은 네이티브 언어로 실행되며, 자바언어로 전달된다. 네이티브 기능에 경우 기존에 자바가 많은 발전이 있기전에 기존에 만들어져있는 기능등을 사용하기 위해서 자주 사용되었다. 하지만 자바가 발전하면서 대부분의 기능들이 자바에서 문제없이 사용이 가능하게 되었다. 네이티브 메서드를 사용하는 것 보다, 자바로 새로 구현된 기능을 사용하는 것이 성능이 더 빠르다. 그 이유는 자바에서 사용하는 JVM 속도가 훨씬 개선되어, 1.3 이후부터는 네이티브 메서드를 사용할 필요가 없다. 또한 네이티브 메서드에서 가장 심각한 문제는 안전하지 않기 때문에, 메모리 훼손..

    규칙 53 - 리플렉션 대신 인터페이스를 이용하라

    자바에서 제공하는 리필렉션 기능을 이용하면 메모리에 로드된 클래스 정보를 바탕으로 필드 정보를 가져오거나, 메서드를 실행시키고 객체를 만드는 등 다양하게 조작을 할 수 있다. 하지만 여기서 이런 리플렉션 기능에는 단점이 존재한다. 1. 컴파일 시점에 자료형을 검사하면서 얻을 수 있는 예외 처리에 대한 이점을 포기해야한다. 또한 접근할 수 없는 메서드를 호출하게 되는 경우에는 오류를 발생시킬 수 있다. 2. 리플렉션 기능을 이용하면 코드가 가독성이 떨어진다. 3. 리플렉션을 통한 메서드 호출은 일반적인 방식 보다 속도가 2 ~ 50배 정도 늦어진다. 사실 리플렉션은 컴포넌트 기반 응용 프로그램 저작 도구를 위해 개발 되었기 때문에, 일반적인 프로그램은 프로그램 실행 중에 리플렉션을 통해 객체를 이용하려 하..

    규칙 52 - 객체를 참조할 때는 그 인터페이스를 사용하라.

    규칙 40에서 클래스 대신 인터페이스로 자료형을 사용하는 것에 대해 이야기 했었다. 더 나아가 객체를 참조할 때 인터페이스를 사용하는 것이 좋은 이유에 대해 설명하겠다. 예를 들어 Vector 클래스를 예로 들어보자. 참고로 Vector는 List 인터페이스를 구현해서 제작되었다 // List 인터페이스를 참조 List a = new Vector(); // Vector 클래스를 참조 Vector b = new Vector();위의 경우를 보면 하나는 List 인터페이스를 하나는 Vector 클래스를 참조하였다. 여기서 만약 위에 객체를 Vector가 아닌 ArrayList로 바꾸려고 한다면, 인터페이스를 참조한 위에 경우는 바로 변경이 가능하지만 아래의 경우에는 변경이 불가능하다. 즉, 인터페이스를 사용..

    규칙 51 - 문자열 연결 시 성능에 주의하라

    문자열 연결시에 + 를 사용하여 연결하면 편리하고 좋다. 한줄 정도나 몇 개 정도의 객체를 문자열로 변환할 때는 사용해도 무관하다. 하지만 연결하는 것이 많으면 성능에 문제가 발생한다. n개의 문자열에 연결 연산자를 반복 적용해서 연결하는 데 소요되는 시간은 n의 제곱에 비례한다. -> 왜냐하면, 문자열은 변경불가능한 객체이기 때문에 새로 만들기위해서 두 개의 문자열을 붙힐 때 기준에 문자열을 모두 복사한다. 만족스런 성능을 위해서는 stringBuilder나 동기화가 적용된 StringBuffer를 사용하라. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙50 인용.

    규칙 50 - 객체화된 기본 자료형 대신 기본 자료형을 이용하라.

    기본적으로 문자열 형태를 많이쓰기 때문에 숫자, 불리언 값 들도 문자열로 받은 경우에는 그대로 가지고 있는 경우가 많다. 하지만 문자열로 가지고 있어야 하는 것은 본래 문자열인 데이터만 그렇게 가지고 있어야 하고 자신에 맞는 데이터 타입으로 바꾸어서 가지고 있어야 한다. 이는 당연한 지침인데 잘 지켜지지 않는다.(나도 마찬가지다..) 더 좋은 자료형이 있거나 만들수 있을 때는 객체를 문자열로 표현하는 것을 피하는 것이 좋다. 왜냐하면 제대로 쓰지 못할 경우 문자열은 다른 자료형에 비해 다루기 성가시고, 유연성도 떨어지며, 느리고 오류 발생 가능성도 높기 때문이다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙50 인용.

    규칙 49 - 객체화된 기본 자료형 대신 기본 자료형을 이용하라.

    자바에는 기본 자료형인 int, double, boolean등이 있고, 객체화된 기본 자료형인 Integer, Double, Boolean등이 있다. 자바 1.5부터 autoboxing과 auto-unboxing이 되면서 두개의 차이를 희미하게 했다. 하지만 이 두가지 자료형의 차이점이 3가지가 있다. 1. 기본자료형은 값만 가지지만 객체화된 기본자료형은 값 이외에 identity을 가진다. -> 그렇기 때문에 객체화된 기본자료형은 값이 같더라도 서로 다른 identity일 수 있다. 2. 기본 자료형은 완전한 값이지만 객체화된 기본자료형은 null이라는 값이 하나 더 있다. 3. 기본자료형이 시간이나 공간 요구량 측면에서 더욱 효율적이다. 결론은 자동 객체화를 통해 편하게 사용할 수 있지만, 객체화된 ..

    규칙 48 - 정확한 답이 필요하다면 float와 double은 피하라

    이 자료형들은 이진 부동 소수점 연산에 사용된다. 하지만 float와 double는 정확한 돈계산에 사용에는 적합하지 않다. 예를 들어보자. 위의 코드를 예상하는 바로는 4 items bought가 나와야 하고 잔돈은 0원이 나와야하는 것이 맞다. 하지만 예상과 달리 잔돈이 생기고 구매 숫자가 다르다. 그 이유는 float와 double은 0.1(또는 10의 다른 음수, 10-1, 10-2...)을 정확하게 계산을 못하기 때문이다. 이는 컴퓨터가 계산을 10진수에서 2진수로 변환하는 과정에서 문제가 발생한다고 한다. 참조 : http://apphappy.tistory.com/152 자바에서는 그래서 이런 문제를 해결하기 위해 BigDecimal을 제공한다. 참조 : http://12soso12.tisto..

    규칙 47어떤 라이브러리가 있는지 파악하고 적절히 활용하라

    기존의 개발자들이 0부터 제한된 난수의 값을 만들라고 하는 경우에 다음의 코드를 사용하는 경우가 많다. 1234private status final Random rnd = new Random();static int random(int n) { return Math.abs(rnd.nextInt()) % n;}Colored by Color Scriptercs 위의 코드는 동일한 숫자를 뱉어내는 경우와 범위 이상에 데이터를 뱉어내기도 한다. 이는 다행 스럽게도 Random.nextInt(int) 플랫폼 라이브러리를 이용하여 해결할 수 있다. 이런 라이브러리에 내부 구현 동작을 모두 알면 좋지만, 모두 해석해서 사용하기에는 어려움이 있다. 만들어져 있는 라이브러리만 정상적으로 잘 사용한다면 시간을 낭비하지 않고..

    메서드- 규칙 46 for문 보다는 for-each 문을 사용하라

    기존에 배열을 순회할 때 다음과 같이 for문장을 사용하는 경우가 있다. 123for (int i = 0; i

    메서드- 규칙 45 지역 변수의 유효범위를 최소화하라.

    지역 변수의 유효 범위를 최소화하면 가독성과 유지보수성이 좋아지고, 오류 발생 가능성도 줄어든다. C 에서는 선언부에 모든 변수를 먼저 작성한다. 하지만 자바에서는 어디에서나 작성이 가능하다. 이것이 핵심이다. 지역변수의 유효범위를 최소화하는 가장 강력한 기법은, 처음으로 사용하는 곳에서 선언하는 것이다. 선언하기 전에 적으면 프로그램의 의도를 알고자 소스 코드를 읽는 사람에게 혼란을 야기할 수 있기에 실제로 변수가 사용될 때쯤 되면, 그 변수의 사용에 대해 잊어먹게된다. 그리고 또 다른 이유로, 문장의 초기에 선언하게되면 변수의 사용 가능 범위가 증가하게 된다.(변수는 선언된 순간 부터 문장의 종료까지 유효하다.) 그리고 반복문은 for문장이 while보다 좋다. 그 이유는 for의 () 안에 선언된 ..

    메서드- 규칙 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..