ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 쓰기 힘든 findViewById() 버리고 Kotlin Android Extensions 사용하기
    Android 2021. 3. 21. 21:32

     

    안녕 형들~!

    오늘은 쓰기 불편했던 findViewById 말고 간단하게 쓸 수 있는 방법이 없는지 알아보려고 해~

     

    다들  안드로이드를 처음 접해서 개발하는 입장이라면 findViewById 를 무지하게 많이 볼 수 있을거야😭

    findViewById 를 통해서 xml 에 설정한 View 들의 id 를 레이아웃에서 사용할 수 있게 만들 수 있으니깐...

     

    근데 코드를 직접 작성하다 보면 그다지 행복하지 않을 수 있어!

    아래는 짧게 작성한 4개의 뷰들에 대한 인스턴스와 초기화 작업을 적어본거야.

    뷰를 만들 때마다 저 짓거리를 할려면 한숨부터 나오지??😩

    뭐 어쩔 수 없다고 생각 할 수도 있고, 컴파일 에러 뜨니깐 괜찮다고 생각할 수도 있지.

    public class MainActivity extends AppCompatActivity {
    
        private CardView cardView;
        private TextView textView;
        private ImageView imageView;
        private Button button;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main);
    
            cardView = (CardView) findViewById(R.id.cardView);
            textView = (TextView) findViewById(R.id.textView);
            imageView = (ImageView) findViewById(R.id.imageView);
            button = (Button) findViewById(R.id.button);
        }
    }

     

    하지만 이 모든건 Kotlin Android Extensions 를 사용하면 쉽게 해결된다는 거 알아?

     

    저 kotlin project 에서 Kotlin Android Extensions 를 설정하는 방법을 먼저 알려줄게!

    빨간 박스로 칠해져 있는 부분을 추가해 주면 될거야 위에 2개는 kotlin 으로 설정했었다면 기존에 설정되어 있을테니 그대로 가져가면 되니깐 따로 설명하진 않도록 할게

     

    Kotlin Android Extensions을 사용해서 kotlin 으로 작성한 위와 동일한 코드를 보여줄게!! 🤩

    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    }
    

     

    이게 뭐냐고? 뭐긴 그냥 저렇게 import 로 설정만 해주면 가져다 쓸 수 있다는 거야

    실제 사용 사례를 보여줄게~

    아래 처럼 하면 textView 라는 id 를 가지고 있는 텍스트뷰에 text 가 떡하니 박히는 것을 볼 수 있어. 

    개꿀~~ 🙌🙌🙌

    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            textView.text = "Hello kwang0~!"
        }
    }
    

     

    이렇게 하면 이점은 뭐가 있을까?

     

    개인적으로 생각하는 큰 이점은 아래 3개 정도인 것 같아.

    1. 타입문제 해결

    2. Null 체킹

    3. 코드 간결화

     

    다 이해 되면 그냥 Kotlin Android Extensions 를 사용하면 될 것 같아.

     

    하나씩 설명해 보자면

     

    1. 타입문제 해결

    위에 findViewById() 를 보면 하나하나 타입을 설정해주고 있는 것을 확인할 수 있을거야...

    이게 얼마나 귀찮은 일인지는 직접해본 사람들이면 알겠지?

    하지만 Kotlin Android Extensions 에서는 그걸 자동으로 해주니깐 잘못 적을 일이라던지 일일이 변경해주지 않아도 된다는 이점이 있어.

     

    2. Null 체킹

    안드로이드 개발하면서 가장 많이 접하는 에러가 NPE 일거야! 생각없이 코딩하다보면 발생하게 되는데, 따로 기본적인 NPE 를 확인할 수 있는 툴들을 따로 사용하기도 하고 할텐데

    특히 findViewById 를 사용하면 의도치 않은 NPE 를 접할 수 있어...

    그와 다르게Kotlin Android Extensions 에서는 뒤에 [?] 를 붙여서 NPE 를 바로 피할 수 있어!!

    imageView?.setImage~~(~~)
    textView?.text = ""
    cardView?.setBackgroud(~~)

    하지만 반드시 null체킹을 넣는게 좋다고는 말 할 수 없는게 뷰변화를 테스트과정에서 감지 못하고 그냥 넘어갈 수 있으니깐

    이건 취사선택하는게 좋을 것 같아.

     

    3. 코드 간결화

    뭐 이건 말안해도 알겠지?

    그냥 위에 적어 놓은 findViewById 랑 비교만 해보아도 단번에 알 수 있을 거야

    거의 뷰 하나당 2줄씩 차이나는 거니깐 말하면 입만 아프징~😘

     

Designed by Tistory.