가변인자
- 가변인자를 선언할 때는 ...을 사용한다.
- 메소드의 매개변수를 선언할 때 가변 인자 선언을 하면, 전달되는 인자의 수에 제한을 두지 않을 수 있다.
- 가변인자를 선언한 메소드 호출이 이뤄지면, 배열을 생성하여 전달되는 인자들을 모두 담는다.
public static void showAll(String... vargs)
class Varargs {
public static void showAll(String...vargs) { // 매개변수의 가변인자 선언
// vargs를 배열처럼 사용
System.out.println("LEN: " + vargs.length);
for (String s : vargs)
System.out.println(s + " ");
System.out.println();
}
public static void main(String[] args) {
showAll("Box");
showAll("Box", "Toy");
showAll("Box", "Toy", "Robot");
}
}
// 실행 결과
LEN: 1
Box
LEN: 2
Box
Toy
LEN: 3
Box
Toy
Robot
💡 가변인자 선언에 대한 컴파일러의 처리
- 매개변수의 가변 인자 선언은 자바 5에서 추가된 문법이다.
- 따라서 컴파일러는 가변인자 선언 및 호출문을 만나면 다음과 같이 수정하여 컴파일을 완료한다.
/* 수정 전 */
public static void showAll(String... vargs) {...}
public static void main(String[] args) {
showAll("Box");
showAll("Box", "Toy");
showAll("Box", "Toy", "Robot");
}
/* 수정 후 */
public static void showAll(String[] vargs) {...}
public static void main(String[] args) {
showAll(new String[]{"Box"});
showAll(new String[]{"Box", "Toy"});
showAll(new String[]{"Box", "Toy", "Robot"});
}
어노테이션
- 어노테이션은 자바 컴파일러에게 메세지를 전달하는 목적의 메모이다.
- 둘 이상의 어노테이션 선언을 동시에 할 수 있다.
- 어노테이션 타입 (Annotation Types)
- 자바 5에서 소개된 어노테이션 타입 3가지는 다음과 같다.
- @Override
- @Deprecated
- @SuppressWarnings
@Override
- 상위 클래스의 메소드 오버라이딩 또는 인터페이스에 선언된 추상 메소드의 구현이다.
- 상속 관계에서의 메소드 오버라이딩, 인터페이스의 구현을 위한 메소드 정의에 @Override를 붙일 수 있다.
interface Viewable {
public void showIt(String str); // 추상 메소드
}
class Viewer implements Viewable {
@Override
public void showIt(String str) {
System.out.println(str);
}
}
class Annotation_Override {
public static void main(String[] args) {
Viewable view = new Viewer();
view.showIt("Hello Annotations");
}
}
// 실행 결과
Hello Annotations
@Deprecated
- 호환성 유지를 위해 존재하지만 이후에 사라질 수 있는 클래스 또는 메소드이다.
- 문제의 발생 소지가 있거나 개선된 기능의 다른 것으로 대체되어서 더이상 필요 없게 되었음을 의미한다.
interface Viewable {
@Deprecated
public void showIt(String str); // Deprecated 된 메소드
public void brShowIt(String str);
}
class Viewer implements Viewable {
@Override
public void showIt(String str) { // 컴파일러가 경고하는 부분
System.out.println(str);
}
@Override
public void brShowIt(String str) {
System.out.println('[' + str + ']');
}
}
class Annotation_Deprecated {
public static void main(String[] args) {
Viewable view = new Viewer();
view.showIt("Hello Annotations");
view.brShowIt("Hello Annotations"); // 컴파일러가 경고하는 문장
}
}
// 실행 결과
Hello Annotations
[Hello Annotations]
@SuppressWarnings
- 컴파일러가 경고 메세지를 전달하는 특정 상황에서, 관련 경고 메세지를 생략하라는 의미
- 둘 이상의 경고 유형에 대해 동시에 @SuppressWarnings 선언하려면 ","로 구분해준다.
@SuppressWarnings({"fallthrough", "deprecation"})
interface Viewable {
@Deprecated
public void showIt(String str);
public void brShowIt(String str);
}
class Viewer implements Viewable {
@Override
@SuppressWarnings("deprecation") // deprecation과 관련된 경고 메세지 생략 요청
public void showIt(String str) {
System.out.println(str);
}
@Override
public void brShowIt(String str) {
System.out.println('[' + str + ']');
}
}
class Annotation_SuppressWarnings {
public static void main(String[] args) {
Viewable view = new Viewer();
view.showIt("Hello Annotations");
view.brShowIt("Hello Annotations"); // 컴파일러가 경고하는 문장
}
}
// 실행 결과
Hello Annotations
[Hello Annotations]
'☕ Java > 이론' 카테고리의 다른 글
[Java] 메소드 참조 (Method References) (0) | 2022.02.04 |
---|---|
[Java] 함수형 인터페이스 (0) | 2022.02.03 |
[Java] 람다 (0) | 2022.01.28 |
[Java] 네스티드 클래스, 이너 클래스 (0) | 2022.01.27 |
[Java] 열거형 (enum) (0) | 2022.01.26 |
[Java] 컬렉션 기반 알고리즘 (sort, binarySearch, copy) (0) | 2022.01.25 |
[Java] Queue 컬렉션 클래스 (0) | 2022.01.25 |
[Java] Set 컬렉션 클래스 (0) | 2022.01.25 |