사용자 도구

사이트 도구


study:java:javachobo:appendix

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
study:java:javachobo:appendix [2010/03/19 21:30]
gauryan
study:java:javachobo:appendix [2010/03/21 14:48] (현재)
gauryan
줄 1: 줄 1:
 ====== JDK 1.5에 추가된 기능 ====== ====== JDK 1.5에 추가된 기능 ======
 +
 +===== StringBuilder =====
 +StringBuilder 가 새로 추가되었다. StringBuilder 는 StringBuffer 와 완전히 동일한 클래스이다. 다만 동기화(synchronization)처리를 하지 않기 때문에 멀티쓰레드 프로그래밍에서는 사용하면 안 되지만 멀티쓰레드 프로그래밍이 아닌 경우에는 StringBuffer 보다 바른 성능을 보장한다.
 +동기화의 여부를 제외하고 두 클래스가 기능상으로 완전히 동일하기 때문에 코드에서 StringBuffer 를 StringBuilder 로 바꾸기만 하면 된다. 즉, StringBuffer 타입의 참조변수를 선언한 부분과 StringBuffer 의 생성자만 바꾸면 된다는 말이다.
 +<code java>
 +StringBuffer sb;
 +sb = new StringBuffer();
 +sb.append("abc");
 +</code>
 +<code java>
 +StringBuilder sb;
 +sb = new StringBuilder();
 +sb.append("abc");
 +</code>
 +StringBuffer도 충분히 성능이 좋기 때문에 성능향상이 반드시 필요한 경우를 제외하고는 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없을 것이다.
  
 ===== 오토박싱(autoboxing) ===== ===== 오토박싱(autoboxing) =====
줄 150: 줄 165:
 } }
 </code> </code>
-위와 같이 선언된 메서드가 있을 때, 이 메서드의 매개변수로는 Array<Unit>타입의 변수만 사용할 수 있다. 즉, ArrayList<Unit> list = new ArrayList<Unit>();으로 생성된 객체만 매개변수로 사용될 수 있다는 뜻이다.+위와 같이 선언된 메서드가 있을 때, 이 메서드의 매개변수로는 ArrayList<Unit>타입의 변수만 사용할 수 있다. 즉, ArrayList<Unit> list = new ArrayList<Unit>();으로 생성된 객체만 매개변수로 사용될 수 있다는 뜻이다.
  
 <code java> <code java>
줄 178: 줄 193:
 **[주의]** 여기서 만일 Unit이 클래스가 아닌 인터페이스라 할지라도 키워드로 'implements'를 사용하지 않고 클래스와 동일하게 'extends'를 사용한다는 것에 주의하자. **[주의]** 여기서 만일 Unit이 클래스가 아닌 인터페이스라 할지라도 키워드로 'implements'를 사용하지 않고 클래스와 동일하게 'extends'를 사용한다는 것에 주의하자.
  
-예제 : /GenericsEx1.java +  * 예제 : /GenericsEx1.java <code java>
-<code java>+
 import java.util.*; import java.util.*;
  
줄 252: 줄 266:
 </code> </code>
  
-예제 : EnumEx.java +  * 예제 : EnumEx.java <code java>
-<code java>+
 import java.util.*; import java.util.*;
  
줄 305: 줄 318:
 } }
 </code> </code>
 +
 +===== 가변인수 (Varargs) =====
 +기존에는 메서드의 매개변수 개수를 고정적으로 지정해주어야만 했으나 JDK 1.5 부터는 동적으로 매개변수의 개수를 지정해 줄 수 있게 되었다.
 +<code java>
 +public String concatenate(String s1, String s2) { /* 내용생략 */ }
 +public String concatenate(String s1, String s2, String s3) { /* 내용생략 */ }
 +public String concatenate(String s1, String s2, String s3, String s4) { /* 내용생략 */ }
 +...
 +public String concatenate(String[] strArr) { /* 내용생략 */ }
 +</code>
 +문자열을 결합하여 반환하는 concatenate메서드를 위와 같이 오버로딩하여 정의하는 대신 아래와 같이 가변인수를 정의하면 된다. 가변인수는 '타입... 변수명'와 같은 형식으로 정의한다.
 +<code java>
 +public String concatenate(String... str) { /* 내용생략 */ }
 +</code>
 +가변인수의 대표적인 예는 PrintStream의 printf()와 MessageFormat의 format()이다.
 +<code java>
 +public PrintStream printf(String format, Object... args) { /* 내용생략 */ }
 +public static String format(String pattern, Object... arguments) { /* 내용생략 */ }
 +</code>
 +가변인수를 사용할 때 한 가지 주의해야할 점은 오버로딩을 하는 경우인데, 먼저 예제를 살펴보고 그 다음에 자세히 설명하겠다.
 +
 +  * 예제 : VarArgsEx1.java <code java>
 +class VarArgsEx1 {
 +    public static void main(String[] args) {
 +        System.out.println(concatenate("-", "100", "200", "300"));
 +    }
 +    
 +    static String concatenate(String delim, String... args) {
 +        String result = "";
 +        
 +        for(String str : args) {
 +            result += str + delim;
 +        }
 +        
 +        return result;
 +    }
 +
 +/*
 +    static String concatenate(String... args) {
 +        return concatenate("", args);
 +    }
 +*/
 +}
 +</code>
 +concatenate 메서드는 매개변수로 입력된 문자열에 구분자를 사이에 포함시켜 결합해서 반환한다. 가변인수로 매개변수를 선언했기 때문에 문자열을 개수의 제약없이 매개변수로 지정할 수 있다. 위의 예제에서는 주석처리하였지만 concatenate 메서드의 또 다른 오버로딩된 메서드가 있다.
 +이 두 메서드는 별 문제가 없어 보이지만 위의 예제에서 주석을 풀고 컴파일을 하면 아래와 같이 컴파일에러가 발생한다.
 +<code>
 +VarArgsEx1.java:5: reference to concatenate is ambigous, both method
 +concatenate(java.lang.String,java.lang.String...) in VarArgsEx1 and
 +method concatenate(java.lang.String...) in VarArgsEx1 match
 +         System.out.println(concatenate("-", "100", "200", "300"));
 +
 +1 error
 +</code>
 +에러의 내용을 살펴보면 두 오버로딩된 메서드를 구분되지 않아서 발생하는 것임을 알 수 있다. 가변인수를 선언한 메서드를 오버로딩할 때는 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다. 그래서 가능하면 가변인수를 사용한 메서드를 오버로딩하지 않는 것이 좋다.
 +
 +===== static import =====
 +import 문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import 문을 사용하면 static 멤버를 호출할 때 클래스명을 생략할 수 있다. 이러한 기능은 코딩을 편리하게 해주지만 남용하면 오히려 독이 될 수 있기 때문에 주의하도록 하자.
 +<code java>
 +import static java.lang.System.out;
 +import static java.lang.Math.*;
 +</code>
 +만일 위와 같이 static import 문을 선언하였다면, 아래의 코드처럼 간략히 할 수 있다.
 +<code java>
 +System.out.println(Math.random());
 +</code>
 +<code java>
 +out.println(random());
 +</code>
 +
 +  * 예제 : StaticImportEx1.java <code java>
 +import static java.lang.System.out;
 +import static java.lang.Math.*;
 +
 +class StaticImportEx1 {
 +    public static void main(String[] args) {
 +        // System.out.println(Math.random());
 +        out.println(random());
 +        
 +        // System.out.println("Math.PI : " + Math.PI);
 +        out.println("Math.PI : " + PI);
 +    }
 +}
 +</code>
 +
 +
study/java/javachobo/appendix.1269001818.txt.gz · 마지막으로 수정됨: 2010/03/19 21:30 저자 gauryan