CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL

SOLID BASICS

[안드로이드] 뷰 바인딩이란 무엇일까?
솝트 33기 안드로이드/[솝트 33기] 안드로이드 왕초보 스터디

[안드로이드] 뷰 바인딩이란 무엇일까?

2023. 10. 9. 21:46

1. 뷰 바인딩

 

예를 들어, xml에서 이렇게 텍스트뷰를 3개 쓰고 있다고 치자

 

 
public class MainActivity extends AppCompatActivity {
 
 
 
private TextView nameView, phoneView, addressView; // 변수 선언하고
 
 
 
@Override
 
protected void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
 
setContentView(R.layout.activity_main);
 
 
 
nameView = findViewById(R.id.name); // findViewById로 id를 찾아서 넣어준다.
 
phoneView = findViewById(R.id.phone);
 
addressView = findViewById(R.id.address);
 
}
 
}

예전에는 액티비티에서 텍스트뷰의 값을 변경하거나 뭔가 작업을 하려면

이렇게 변수를 선언하고, findViewById를 이용해서 xml의 뷰와 변수를 연결시켜주는 그런 작업을 해야 했다.

이게 한 두 개 정도는 상관없다. 근데 한 페이지에 들어가는 뷰가 좀 많아야지...

덕분에 코드가 항상 길어지고 더러워졌다.

 

view binding은 이 findViewById를 대체할 수 있는 기능이다.

 

1-2. 변천사

안드로이드 스튜디오 버전에 따른 변천사

3.5 버전까지는 개발자들이 findViewById를 사용했었다.

Butter knife라는 라이브러리나 extension을 이용해서 불편함을 해결했다고 한다.

 

그러다가 3.6 버전에서 이를 대체할 수 있는 view binding이 나오게 된다.

코틀린에서는 이 뷰 바인딩 작업조차 안 하고

id를 바로 변수처럼 사용할 수 있는 Kotlin Synthetic이 생겼다.

 

하지만 다음과 같은 문제가 있어 4.1 버전에서 Kotlin Synthetic은 deprecated 되었다.

  • 전역 네임 스페이스가 오염된다.
  • 개발자가 실수로 다른 레이아웃의 동일한 id를 가진 뷰를 가져오면서 NullPointException이 발생할 가능성이 있다.
  • Kotlin만 지원이 가능하다.

현재는 자바와 코틀린 둘 다 view binding을 사용한다.

findViewById도 사용할 수 있지만, 속도도 느리고 안전하지 못하다.

 

1-3. findViewById와의 차이점

앱을 디버깅하면 이런 파일이 만들어진다.

뷰 바인딩을 사용하면 직접 id를 적고 타입을 정하고 이런 작업을 하지 않아도 된다.

자동으로 클래스 파일을 생성해주기 때문이다.

그에 비해 findViewById의 문제점은 다음과 같다.

 

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

 

 

2. 사용법

2-1. gradle 추가

 
// 안드로이드 스튜디오 4.0 이상
 
android {
 
...
 
buildFeatures {
 
viewBinding = true
 
}
 
}

사용하고 있는 안드로이드 스튜디오 버전이 4.0 이상이라면 이렇게

 

 
// 안드로이드 스튜디오 3.6 ~ 4.0
 
android {
 
...
 
viewBinding {
 
enabled true
 
}
 
}

이하라면 이렇게 적어주면 된다.

(3.6 보다 낮으면 안 됨)

 

2-2. 액티비티

 
public class MainActivity extends AppCompatActivity {
 
 
 
private ActivityMainBinding binding;
 
 
 
@Override
 
protected void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
 
binding = ActivityMainBinding.inflate(getLayoutInflater()); // 1
 
setContentView(binding.getRoot()); // 2
 
}
 
 
 
private void updateUI(UserProfile userProfile){
 
binding.name.setText("아이유"); // 3
 
binding.phone.setText("010-1111-2222");
 
binding.address.setText("사랑시 고백구 행복동");
 
}
 
}

1. [목차 1-2]에서 보여주었던 클래스를 만들기 위하여 위와 같이 적어준다. inflate는 xml에 있는 뷰를 객체화해준다고 생각하면 된다.

2. 원래는 R.layout.activity_main을 넘겨주지만 이번에는 우리가 생성한 루트 뷰를 넘겨준다.

3. 바인딩된 객체 안에 있는 name, phone, address에 접근하여 사용하면 끝!

사용하기도 간단하고 코드도 깔끔해진 것을 볼 수 있다.

 

Activity 이름 Binding Class 이름
MainActivity ActivityMainBinding
HelloActivity ActivityHelloBinding
XXXActivity ActivityXXXBinding

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

마치 자바 파일 이름에 맞는 xml 파일이 생성되듯이..

규칙에 맞게 사용해주자.

 

 
private lateinit var binding: ActivityMainBinding
 
 
 
class MainActivity : AppCompatActivity() {
 
override fun onCreate(savedInstanceState: Bundle?) {
 
super.onCreate(savedInstanceState)
 
binding = ActivityMainBinding.inflate(layoutInflater)
 
setContentView(binding.root)
 
 
 
binding.textView.text = "안녕"
 
}
 
}

코틀린은 이런 식으로 작성해주면 된다.

 

 

저작자표시 (새창열림)

'솝트 33기 안드로이드 > [솝트 33기] 안드로이드 왕초보 스터디' 카테고리의 다른 글

[안드로이드] Inflate 란? 무엇일까  (0) 2023.10.09
    '솝트 33기 안드로이드/[솝트 33기] 안드로이드 왕초보 스터디' 카테고리의 다른 글
    • [안드로이드] Inflate 란? 무엇일까
    CHANGEL
    CHANGEL
    NOT GIVING UP | SOLID BASICS

    티스토리툴바