✔ 열거형
인터페이스 기반의 상수 정의
- 인터페이스 내에 선언된 변수는 public, static, final이 선언된 것으로 간주되므로
이를 통해 의미가 부여된 이름을 갖는 상수들을 하나의 인터페이스로 묶어서 선언할 수 있음
- 하지만 자료형이 같지 않더라도 값이 같을 경우 실행 오류가 발생하지 않는 문제점이 발생함
interface Animal {
int DOG = 1;
int CAT = 2;
}
interface Person {
int MAN = 1;
int WOMAN = 2;
}
Person.MAN // 1
Animal.DOG // 1
자료형의 부여를 돕는 열거형
- 열거형은 열거형 값을 정의하며, 참조변수의 선언으로 사용될 경우 해당 열거형 내에 선언된 열거형 값만 대입이 가능함
enum Scale {
DO, RE, MI, FA, SO, RA, TI
{
Scale sc = Scale.DO;
// Scale sc = DO;
- 클래스 내에 열거형을 정의할 수 있음
- 특정 클래스 내에서만 사용하고자 하는 열거형 값이 있다면 해당 클래스 내에 열거형을 정의
class Customer {
enum Gender {
MALE, FEMALE
}
private Gender gen;
gen = Gender.MALE;
}
열거형 값의 정체
- 클래스 내에서 해당 클래스형 참조변수를 선언하는 것과 인스턴스를 생성하는 것이 가능함
- 모든 열거형은 Enum<E> 클래스를 상속하고, Enum<E>는 Object 클래스를 상속하기 때문에
열거형은 Object 클래스를 상속하는 일종의 클래스가 되므로
열거형 값은 클래스의 인스턴스를 참조하는 참조변수이며 열거형 값은 해당 자료형의 인스턴스가 됨
- 그러므로 열거형의 정의에 생성자가 있을 경우, 인스턴스이기 때문에 생성자를 호출하게 되고
생성자가 없으면 디폴트 생성자가 삽입되게 됨
- 열거형의 생성자는 무조건 private으로 선언해야 함
- 만약 인자를 전달받는 열거형의 생성자일 경우, 소괄호를 통해서 생성자에 인자를 전달할 수 있음
class Person {
// 참조변수를 선언하는 것과 인스턴스를 생성하는 것이 가능함
public static final Person MAN = new Person();
public static final Person WOMAN = new Person();
@Override
public String toString() {
return "I am a dog person";
}
}
enum Person {
MAN(29), WOMAN(25);
int age;
private Person(ing age) {
this.age = age;
}
@Override
public String toString() {
return "I am a dog person";
}
}
✔ 매개변수의 가변 인자 선언
매개변수의 가변 인자 선언과 호출
- 메소드의 매개변수를 선언할 때 가변 인자 선언을 하면 전달되는 인자의 수에 제한을 두지 않을 수 있음
- 가변 인자 선언을 하면 배열을 생성하여 전달되는 인자들을 모두 담고 그 배열이 매개변수에 전달되게 됨
- 그러므로 매개변수의 길이을 확인할 수 있는 것
public static void showAll(String...vars) {
System.out.println("LEN: " + vargs.length);
...
}
showAll("Box");
가변 인자 선언에 대한 컴파일러의 처리
- 컴파일러는 가변 인자 선언을 기반으로 작성된 메소드 정의와 호출문을 배열로 수정하여 컴파일을 완료하게 됨
public static void showAll(String[] vars) {
System.out.println("LEN: " + vargs.length);
...
}
showAll(new String[]{"Box"});
✔ 어노테이션
어노테이션이란?
- 어노테이션이란 자바 컴파일러에게 메시지를 전달하는 목적의 메모
어노테이션 타입
- @Override, @Deprecated, @SuppressWarnings은 기본 어노테이션 타입
- 그 외로도 다양한 어노테이션 타입이 존재
@Override
- 상속 관계에서 상위 클래스의 메소드 오버라이딩, 인터페이스에 선언된 추상 메소드의 구현을 나타냄
- 어긋난 메소드 정의가 이뤄지면 컴파일 오류로 이어져서 잘못된 부분을 확인할 수 있음
interface Viewable {
public void showIt(String str);
}
class Viewer implements Viewable {
@Override
public void showIt(String str) {
System.out.println(str);
}
}
@Deprecated
- 문제 발생 소지가 있거나 개선된 기능의 다른 것으로 대체되어서 더 이상 필요 없게 되었음을 나타냄
- 아직은 호환성 유지를 위해 존재하지만 이후에 사라질 수 있는 클래스 또는 메소드를 가리킴
- 컴파일은 잘 되지만 컴파일러가 Note 메시지를 전달하여 경고하게 됨
interface Viewable {
@Deprecated
public void showIt(String str);
}
class Viewer implements Viewable {
@Override
public void showIt(String str) {
System.out.println(str);
}
}
@SuppressWarnings
- 메소드를 대체할 수 있는 상황이 아니라서 당분간 그 메소드를 구현하고 호출해야 하는 상황을 나타냄
- 경고 메시지를 전달하지 말라고 요청하여 위에서 발생하는 컴파일러의 경고를 지울 수 있음
- 이 외에도 다양한 경고 유형에 따라 어노테이션 경고를 지울 수 있음
interface Viewable {
@Deprecated
public void showIt(String str);
}
class Viewer implements Viewable {
@Override
@SuppressWarnings("deprecation") // @SuppressWarnings({"fallthrough", "deprecation"})
public void showIt(String str) {
System.out.println(str);
}
}