Annotation(Override, Deprecated, SuppressWarnings)


Annotation


어노테이션은 클래스나 메소드 등의 선언시에 @를 붙여주는 것입니다.

클래스, 메소드, 변수 등 모든 요소에 선언할 수 있습니다.

어노테이션을 선언하는 목적은 다음과 같습니다.

  • 컴파일러에게 정보를 알려주기
  • 컴파일할 때와 설치시의 작업을 지정하기
  • 실행할 때 별도의 처리하기


미리 정해져있는 어노테이션은 3개(Override, Deprecated, SuppressWarnings)가 있고,

커스텀하게 만들 수도 있습니다.

여기서는 미리 정해진 3개의 어노테이션에 대해서만 알아보겠습니다.




Override


해당 메소드가 부모클래스의 메소드를 Override했다는 것을 명시적으로 선언합니다.

예를 들어보겠습니다.

일단 다음과 같이 부모 클래스가 있습니다.

Parent.java

public class Parent {
    public Parent(){
        System.out.println("Default Constructor of Parent class");
    }
    public Parent(String name){
        System.out.println("Constructor with string parameter of Parent class");
    }
    public void printName(){
        System.out.println("printName() method of parent class");
    }
}

그리고 이 Parent 클래스를 상속받는 자식클래스를 만듭니다.

AnnotationOverride.java

public class AnnotationOverride extends Parent {
    @Override
    public void printName(){
        System.out.println("printName() method that is overridden in AnnotationOverride class");
    }
}

이렇게 @Override를 printName()앞에 선언하면,

이 printName()메소드는 Parent 클래스의 printName()을 상속받는 것이다 라고 명시적으로 나타내는 것입니다.

안써줘도 되지만, @Override를 써주면 한눈에 어떤 메소드가 오버라이딩 했는지 알 수 있습니다.


만약 오버라이딩을 잘못했으면 다음과 같이 예외가 발생합니다.

img_java_exception_override

위 코드에서는 printName(String name)과 같은 메소드가 Parent 클래스에 없는데

오버라이드 한다고 명시했으므로 예외가 발생합니다.




Deprecated


Deprecated는 더이상 사용하지 않는 클래스나 메소드를 선언하는데 사용됩니다.

다음과 같이 @Deprecated를 선언한 메소드가 있다고 가정하겠습니다.

AnnotationDeprecated.java

public class AnnotationDeprecated {
    @Deprecated
    public void noMoreUse(){
    }
}

그리고 이 noMoreUse() 메소드를 다음 코드와 같이 참조하는 클래스가 있습니다.

AnnotationDeprecatedSample.java

public class AnnotationDeprecatedSample {
    public void useDeprecated(){
        AnnotationDeprecated ex = new AnnotationDeprecated();
        ex.noMoreUse();
    }
}

이 코드를 IDE로 보면 다음과 같이 중앙 선이 그어집니다.

img_java_deprecated_ide

콘솔창에서 컴파일을 해보겠습니다.

img_java_deprecated_console_terminal

처음에

$ javac AnnotationDeprecatedSample.java

를 했을 때, Note 두개가 나옵니다.

첫번째 Note는 deprecated된 API를 사용하고있다고 말해주고 있고,

두번째 Note는 -Xlint:deprecation 을 이용해 다시 컴파일(recompile)해보라고 합니다.

그래서 pwd로 현재 위치 경로를 확인한 뒤,

$ javac -Xlint:deprecation /User/onsil/programming/java/intellij_default/ch17/src/AnnotationDeprecatedSample.java

로 다시 컴파일 하니, 어떤 부분이 deprecated인지 나옵니다.

다만 이것은 warning이지 예외나 에러가 아니므로, 실행은 됩니다.


자바 API에서도 Deprecated를 발견할 수 있습니다.

img_java_api_deprecated

이렇게 API에서 Deprecated된 메소드나 생성자들은,

자바의 버전이 올라가면서 불필요하게 된 것입니다.

이것들을 그냥 삭제하지 않고 그대로 두면서 Deprecated라고 명시하는 이유는,

하위 버전 호환성 때문입니다.

만약 불필요하게 된 메소드를 새 버전 자바에서 바로 삭제했다고 가정하면,

이전에 작성된 자바 코드들은 새 버전 자바 환경에서 제대로 실행되지 않을 것입니다.


자바의 built-in 메소드 말고, 개발자가 작성한 메소드도 나중에 불필요하게 될 수 있습니다.

특수한 경우를 제외하고는 대부분 직장에서 다른 개발자들과 같이 일을 하게 되는데요,

A라는 사람이 작성한 a라는 메소드를 B라는 사람이 개발할 때 참조했다고 가정해보겠습니다.

만약 A가 a메소드가 불필요해졌다고 생각하고 막 지워버린다면,

B가 작성하고 있는 프로그램은 갑자기 에러가 발생할 것입니다.


그렇게 막 지워버리는 대신에 @Deprecated를 선언한다면

위에서 보았듯이, B라는 사람이 IDE를 사용하든 콘솔을 사용하든

자기가 사용하는 메소드 중에 deprecated된 메소드가 있다는 warning을 보게됩니다.

보면… 고치겠죠??

이렇게 다른 사람이 deprecated 메소드를 수정할 시간을 주고나서

나중에 삭제하는 것이 바람직합니다.




SuppressWarnings


SuppressWarnings은 deprecation과 같은 warning을 무시하라고 선언하는 어노테이션입니다.

예문을 보겠습니다.

AnnotationSuppressWarning.java

public class AnnotationSuppressWarning {
    @SuppressWarnings("deprecation")
    public void useDeprecated(){
        AnnotationDeprecated ex = new AnnotationDeprecated();
        ex.noMoreUse();
    }
}

위 코드에서 볼 수 있듯이, SuppressWarnings()의 소괄호안에

무시하고자 하는 경고를 직접 쓰면 됩니다.

여기선 noMoreUse()라는 deprecated된 메소드를 사용하고 있는데요

@SuppressWarnings(“deprecation”)으로 인해 나와야할 경고가 안나옵니다.

img_suppressWarnings_ide

img_suppressWarnings_console

Deprecated의 예문과는 달리 어떤 경고도 안뜨는 걸 볼 수 있습니다.




제가 보고있는 책에서는 커스텀한 어노테이션을 선언하는 법도 나와있습니다.

하지만 책에서 저자는

“대부분의 개발자들은 어노테이션을 선언할 일이 별로 없다.”

“이미 선언되어 있는 어노테이션을 사용하기에도 벅찬 것이 현실이다.”

라고 나와있습니다.


나중에 실전에서 자바를 이용해 개발하게 되면

커스텀한 어노테이션을 선언하는 방법에 대해 포스팅 하겠습니다.