불순분자 Kotlin [13] - ViewBinding

불순분자들·2022년 8월 8일
0

List App 만들기

목록 보기
13/18

ViewBing

안드로이드 버전 3.5 까지는 findViewById를 사용했었다.
3.5이하 버전에서는 Butter knife 라이브러리나 extension을 이용하여 findViewById의 불편함을 해결했다고 한다.
3.6버전에 들어서면서 ViewBinding 기술이 도입되게 되었다.
ViewBinging -> 직접 id를 적고 타입을 정하는 작업을 하지 않아도 되며, 자동으로 클래스 파일을 생성해준다.

ViewBing의 문제점

4.1 버전 이후에 문제점으로 인해 ViewBing이 사용되지 않는다한다.
그 이유는 다음과 같다.

  • 전역 네임 스페이스가 오염된다.
  • 개발자의 실수로 다른 레이아웃의 동일한 Id를 가진 뷰를 가져오면서 NullPointException이 발생 할 가능성이 있다.
  • Kotlin만 지원 가능하다.
    현재는 자바와 코틀린 둘 다 ViewBinging을 사용할 수 있다.

findViewById의 문제점

  • Null 안정성 : 개발자가 실수로 유효하지 않은 id를 사용하면 null 오류가 발생할 수 있다.
  • Type 안정성 : textView의 타입을 imageView라고 잘 못 적어서 캐스팅하면 CastException이 발생할 수 있다.
  • 코드가 길어지고 속도가 상대적으로 느리다.

ViewBing 사용방법


먼저 위 그림과 같이 Gradle에 android안에 구문을 추가해주어야한다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
   
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // layout의 tv_name을 낙타체로 표기
        binding.tvName.setText("안녕하세요.")
        // layout의 tv_test를 낙타체로 표기
        binding.tvTest.setText("하이이ㅣ이")

위 코드를 쪼개서 조금씩 설명해보겠다.

private lateinit var binding : ActivityMainBinding

lateinit은 단순히 늦은( late ) 초기화( initialize )를 의미한다.
-> 별도의 값 부여 X, 타입만 지정하고 실제 초기화를 내가 원하는 지점에 하고싶을 때, lateinit을 사용한다.

이 때, 주의해야할 것이 있다.
Layout 이름이 MainActivity일 경우 -> AcitivityMainBinging
Layout 이름이 HolyActivity일 경우 -> ActivtyHolyBinding

처럼 바인딩 클래스 이름은 규칙이 정해져 있다.

binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

inflate(layoutInflater)는 xml에 있는 뷰를 객체화해준다고 생각하면 된다.
원래는 R.layout.activity_main을 넘겨주지만 ViewBinding에서는 생성한 루트 뷰를 넘겨준다.

	// layout의 tv_name을 낙타체로 표기
	binding.tvName.setText("안녕하세요.")
    // layout의 tv_test를 낙타체로 표기
   	binding.tvTest.setText("하이이ㅣ이")

그렇기 때문에 바인딩 된 객체 안에 있는 tvName과 tvText를 사용하여 접근해주면 된다.

profile
장래희망 : 침대 위 녹아든 치즈

0개의 댓글