코드의 퀄리티를 올려주는 안드로이드 Annotation들

WonDDak·2024년 8월 16일
0

Android

목록 보기
6/6

Android에서는 Annotation이라는 기능을 지원하고있다.
해당 기능을 이용해 코드의 퀄리티를 올려보자.

리소스 관련 Annotation

안드로이드에서 리소스들파일을 res폴더에 넣어 관리하며,
파일을 불러올땐는 R.drawble.<file_name> 같은 형태로 불러와 사용하게 된다.
이러한 형식은 Int형으로 값이 넘어오게 된다.


다음과 같은 이미지뷰에 확장함수를 만들었다고하자.

fun ImageView.setImage(imgRes : Int) {
    this.setImageResource(imgRes)
}

다음과 같이 사용이 가능할것인데,

setImage(R.drawable.<file_name>)

다음과 같이 아무 Int형 숫자를 넣어도 코드상에는 아무 문제가 없으므로 작동하게 된다.
하지만 항상 의도하지 않은 사용은 무시무시한 결과를 불러올수도 있다..

setImage(12345)

다음과 같이 imgRes앞에 @DrawableRes라는 어노테이션을 추가하였다.

fun ImageView.setImage(@DrawableRes imgRes : Int) {
    this.setImageResource(imgRes)
}

drawbleRes가 아닌 경우 IDE에서 오류가 발생한다.

자주 사용하는 리소스인 String,Drawble,Color등 해당하는 어노테이션이 있으니
함수에 설정만 해주면 오류를 잡는데 좋을것이다.

String -> @StringRes
Drawable -> @DrawbleRes
Color -> @ColorRes
Raw -> @RawRes
등등 ..

상속을 강제하는 CallSuper 어노테이션

코드를 작업하다 보면 상속을 하게되고,
어느 특정 부분에서 반드시 상위클래스의 메소드를 상속받아 사용해야할 부분이 생긴다.
그 경우 상위 클래스의 메소드를 무조건 사용하도록 강제하는 어노테이션이다.

다음과 같이 상속 관계에 있는 class를 보면
하위 클래스에서 함수를 상속받았지만 , 상위 클래스의 반드시 해야하는 작업이 누락되어있다.
잘 작동할수도있지만, 의도치 않은 결과를 불러올 수 있으므로, 원하는 행동이 아닐것이다.

open class Test() {
    open fun thisIsIsTest() {
        println("반드시 이 작업을 해야합니다.")
    }
}

class NewTest() :Test() {
    override fun thisIsIsTest() {
        println("New 작업을 합니다.")
    }
}

다음과 같이 @Callsuper 어노테이션을 추가하면

open class Test() {
    @CallSuper
    open fun thisIsIsTest() {
        println("반드시 이 작업을 해야합니다.")
    }
}

다음 함수는 상위 함수의 메서드가 빠져있어 오류가 난다고 알려준다.

class NewTest() :Test() {
    override fun thisIsIsTest() {
        println("New 작업을 합니다.")
    }
}

그리고 super 함수를 이용해 상위 메서드를 불러오면 오류는 사라진다.

권한을 요청하는 RequiresPermission 어노테이션

함수를 사용하다보면, 이 함수에서는 특정 권한이 무조건 필요한 경우가 있다.
예를 들면 카메라 open 함수라면 카메라 권한이 무조건 필요할것이다.

    fun openCamera() {
        // 카메라 관련 내용
    }

해당 함수를 사용하는 것은 문제가 없으나 ,
manifest에 다음과 같은 카메라 권한이 필요로 한다는 것은 알것이다.

    <uses-permission android:name="android.permission.CAMERA" />

하지만 해당 권한을 적지않고 해당함수를 사용해도 build는 성공적으로 진행된다.

 @RequiresPermission(value = "android.permission.CAMERA")
    fun openCamera() {
        // 카메라 관련 내용
    }

위와 같이 필요한 퍼미션 어노테이션을 달아두었으면,
다음과 같이 manifest에 해당권한이 없다고 알려준다.

profile
안녕하세요. 원딱입니다.

0개의 댓글