http://alecture.blogspot.com/2011/06/annotation.html


자바의 어노테이션(Annotation)


Java5부터 새로 도입된 어노테이션(Annotation) 기능에 대해서 알아보기로 하겠다. 즉 여러분이 자바5 이후의 버젼을 설치하였다면 이 기능을 사용하는데 아무런 문제가 없을 것이다. 필자가 처음에 받으라고 올린 자바 설치 프로그램은 자바6이므로 당근 어노테이션 사용가능하다.^^ 잠시 들어가기 전에 Java5는 뭔지 아리쏭해하는 이들이 있을지도 모르겠다. 특히 오래전에 자바를 공부하다가 다시 공부하는 이들은 자바5는 뭐고 자바6는 뭔지 이게 완전히 다른건지 궁금해 하는 이들을 위해 필자가 잠시 정리를 하고 본 단원을 진행하겠다.

새로 자바를 공부하는 이들은 자바6가 요즘 나온 프로그램이구나라고 생각하면서 쓰겠지만 오래전에 자바를 공부한 이들은 아마 버젼 1.2 아니면 1.3 그래도 최근이었으면 1.4 정도까지 하다가 그 뒤부터 잠시 손을 뗀 이들이 보통 혼란스러워한다. 자바가 새로운 기능과 문제점을 보완하고 업데이트해 오면서 줄곧 1.xx 형태로 해왔는데 메이저급 업데이트를 함에도 불구하고 거의 제품에 차이가 없다고 생각하는 이들이 많아 확연히 다르다는 것을 강조하기 위해 버젼을 Java5(=1.5) 그리고 우리가 지금 쓰고 있는 Java6(=1.6)로 표기하고 있다고 알고 있으면 된다. 한마디로 엄청 달라진것 같이 느껴지니 그런 의미에서는 확실히 성공한듯 하다.ㅎㅎ

자 이제 본격적으로 어노테이션에 대해서 설명해 보겠다. 우리말로 해석하자면 주석이라는 뜻인데 이게 사실 우리가 여태까지 설명을 쓸때 주석(//)을 썼지만 이런 주석이랑 같은 의미로 생각하면 내용을 파악하기 힘들다. 그래서 영어 그대로 어노테이션이라고 표기하니 어노테이션에 무슨 기능이 있는지 여러분이 이번 시간을 통해 알아놓고 필요할때 써먹을수 있으면 그걸로 족하니 안심하기 바란다. 언제나 그렇듯 어노테이션에 대해서 정말 모르겠다하는 이들은 오늘 강좌를 들으면 고작 이런거였어?라는 말이 나오도록 만들어 줄것이니 본 강좌에 집중하기 바란다.^^

어노테이션에서 여러분이 쓸수 있는 기능이 다양하지만 그중에서도 @Deprecated와 @Override가 아주 유용하게 써먹을수 있는 어노테이션이므로 본 단원에서는 이 두가지에 대해서 배워보기로 하겠다. 일단 어노테이션을 쓰려면 자바코드로 어떻게 써야하는지 알아보자.

@어노테이션명

위와 같이 AT으로 불리는 골뱅이 마크를 쓰고 싶은 어노테이션 이름앞에다가 붙이면 작동한다. 어노테이션은 자바 프로그램에 영향을 주는 것이 아니라 컴파일할때 개발자에게 주석같이 설명처럼 알려주는 형태를 말한다. 어노테이션은 클래스나 필드 혹은 메소드 앞에 붙여서 사용하며 끝에 세미콜론(;)은 붙이지 않는다. 예제를 보면서 필자의 설명을 들으면 저절로 이해가 될것이니 감이 오지 않는 이들은 아래 예제를 보면서 따라오기 바란다.^^

t63.jpg

강이의 자바강좌
클래스 A의 one 메소드

위의 예제를 실행하면 위와 같은 결과가 나온다. 예제가 간단하니 이해못할 이들은 없을 것이라 본다. 첫번째로 @Deprecated 어노테이션에 대해서 설명하겠다. one( )이라는 메소드 앞에 붙였으니 one( ) 메소드를 Deprecated로 어노테이션 처리하라는 뜻이다. deprecated는 사전적 의미로 비난하다 반대하다라는 뜻이 있지만 프로그래밍 용어로는 사용을 피해달라 사용을 자제해달라는 의미로 쓰인다. 영어만 해석했는데도 이해가 팍팍되고 있으리라 생각한다.ㅎㅎ 즉 기존에 있는 one( ) 메소드를 쓰지말고 필요하면 다른걸로 만들어서 써달라는 뜻으로 해석하면 된다. 위의 예제는 컴파일이 되어 실행이 가능하지만 컴파일시 이런 메세지를 준다.

Note: C:\Test63.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

이 메세지는 @Deprecated라는 어노테이션을 써서 컴파일시 이렇게 알려주는 것이다. 그럼 이런 기능은 언제 쓰라고 만든 것일까? 이해하기 쉽도록 필자가 예를 들어보겠다. 여러분이 프로그램을 만들었는데 지금은 이 기능을 지원하지만 다음 버젼업된 프로그램에서는 이런 기능을 없애려 한다던지 다음부터는 더 향상된 다른 기능으로 대체하려고 계획하고 있는데 기존에 지원하던 기능을 계속해서 쓴다면 나중에 여러분이 계획했던 프로그램을 만들때 많은 비용과 시간에 차질이 생길수 밖에 없을 것이다. 이런 것을 방지하고자 만든 기능이다.

그럼 다음으로 클래스 B에서 @Override라는 어노테이션을 two( ) 메소드 앞에 썼는데 이건 무엇을 의미하는 것일까? 일단 override라는 뜻은 기억하는가? 자바에서 상속시 오버라이드는 리턴타입이니 매개변수니 메소드명이니 이런거 모두 같고 내용이 다른 것을 말한다고 이미 예전 강좌에서 배웠는데 기억하나 모르겠다.ㅎㅎ

위의 예제에서는 @Override를 썼지만 two( ) 메소드의 오버라이드를 정확히 구현하였으니 문제가 없어 컴파일시 아무런 에러도 나지 않고 프로그램이 실행된다. 하지만 여러분이 void two( ) 메소드 대신에 void twp( ) 메소드로 이름을 잘못 썼다던지 void two(int a) 메소드로 매개변수를 넣었다던지 하면 컴파일시 에러가 난다. 직접 이런 식으로 고쳐서 실행해 보기 바란다. 에러가 나서 실행이 되지 않을 것이다. 정말 대단하지 않은가? 만약 two( ) 메소드앞에 @Override 어노테이션이 없었다면 철자가 틀리든 매개변수가 있든 상관하지 않고 에러없이 실행된다. 상속받았다고 해서 오버라이드만 하라는 법은 없으니까 말이다. twp( )라고 썼으면 자바는 메소드를 새롭게 인식해서 실행할 것이고 two(int a)도 자바의 다형성 중에 하나인 오버로딩한 형태로 인식하므로 전혀 문제될것이 없다. 이런 기능이 굳이 필요할까? 라고 반문하는 이가 있을지 모르겠다.

지금은 예제가 짧아서 별것 아닌듯이 느낄지 모르겠으나 프로그램이 좀 복잡하고 길면 오버라이드하려고 계획하고 프로그램을 짰어도 오타가 있을시 이를 찾아내는데 상당히 애를 먹게된다. 컴파일하고 실행하는데는 아무런 문제가 없을테니까 말이다. 다만 여러분이 생각한데로 똑같이 프로그램을 만들지 못한 것이니 프로그램 안에 버그(?)가 도사리고 있는게 문제가 될것이다.ㅎㅎ

사실 그리 난해한 내용은 아니므로 정확한 의미만 파악한다면 어노테이션을 자유자재로 여러분이 만드는 프로그램에서 써먹을수 있을 것이다. 특히 어노테이션의 @Override 기능은 오버라이드할때 될수 있으면 쓰는 습관을 갖기 바란다. 여러분이 본의아니게 조그마한 실수를 해도 자바 컴파일러가 알아서 여러분을 구원(?)해 줄테니까 말이다.^^