반응형
안드로이드 개발을 하면서, 어노테이션이라는 이야기를 자주 듣게된다. 간단히 찾아보면 @가 붙은 문구들을 어노테이션이라고 하는데, 이를테면 @Override와 같은 것들이다. 그래서 아, 그런 용도군! 정도로만 알고 살아가다가 (..) 문득 왜 이런 어노테이션을 쓰는 지에 대해 궁금해져서 간단히 조사해봤다.
어노테이션은 주석이란 뜻으로, 인터페이스를 기반으로 한 문법이다.
우리가 아는 주석 // /* ~ */ 와 같은 것과 다르게 클래스에 특별한 의미를 부여하거나 기능을 주입하는 것이다. 또 해석되는 시점을 정할 수 있다. 어노테이션은 크게 3가지 존재한다.
JDK에 내장되어 있는 built-in annotation
어노테이션에 대한 정보를 나타내기 위한 어노테이션 meta annotation
개발자가 직접 만들어 내는 custom Annotation
Java에서 기본적으로 제공하는 어노테이션 종류
@Override
- 메소드가 오버라이드된 것을 나타낸다.
- 만약 부모 클래스(혹은 인터페이스)에서 해당 메소드를 찾을 수 없으면 런타임 에러를 발생시킨다.
@Deprecated
- 해당 메서드가 더 이상 사용되지 않음을 표시한다.
- 만약 사용할 경우 컴파일 경고를 발생시킨다.
@SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시하도록 만든다.
@SafeVarargs
- Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.
@FunctionalInterface
- Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션.
- 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생시킨다.
안드로이드에서 사용하는 어노테이션은 이 문서에서 볼 수 있다.
최근에 쓰면서 꽤 코드가 간결해졌다 라고 느꼈던 어노테이션은 @JvmOverloads라는 어노테이션이다. Java로 작성된 뷰를 Kotlin으로 변환하는 과정에서 어노테이션 없이 코드를 작성했는데, 코드 리뷰로 해당 어노테이션을 사용하는 방법을 찾아보라고 리뷰를 받은 것이다.
Java
public class CustomLinearLayout extends LinearLayout {
public CustomLinearLayout(Context context) {
super(context);
}
public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
Kotlin
class CustomLinearLayout : LinearLayout {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
}
어노테이션을 사용하면 다음과 같다.
class CustomLinearLayout @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr)
참고자료
반응형
'IT > Teckweek' 카테고리의 다른 글
반복자 패턴(Iterator Pattern) (0) | 2021.03.27 |
---|---|
Debounce / Throttle (0) | 2021.03.18 |
딥 링크Deep Link (0) | 2021.02.05 |
그로스 해킹이란? (0) | 2021.01.21 |
코드 컨벤션 (0) | 2021.01.15 |
댓글