Learn & Run

Android - 인플레이션(Inflation) 이해하기 (1) 본문

Android

Android - 인플레이션(Inflation) 이해하기 (1)

iron9462 2021. 6. 9. 19:31

안드로이드를 공부한지 꽤(내 기준) 되었음에도 불구하고, 인플레이션이란 것이 무엇인지 정확하게 설명할 수 없어 내 것으로 만들어보고자 한다. 도대체 안드로이드에서 인플레이션이란 무엇일까? 또한, 인플레이션이 어디에서 일어나고 있는 것일까? 라는 궁금증이 생기곤 한다. 흔히 보던 Activity내의 setContentView 메서드는 어떤 역할을 하는지, 그것이 인플레이션과 어떤 연관성이 있는지 알아보고자 합니다.

 

 

 

1. Inflation이란 무엇인가

 

 

아마 다들 경제학 용어로 많이 들어봤을 것이다. 안드로이드에서 Inflation이 의미하는 것은 팽창이라는 의미에 가깝다고 생각한다. 뒤에서 다시 한 번 언급하겠지만, Inflation이란 과정은 눈에보이지 않던(코드로만 작성되어 있는) XML 파일이 실제 메모리에 적재(객체화)되어 화면을 통해서 보여지게 되는데, 이 때 사전적으로 봤을때 팽창하는 것에 비슷한 느낌을 받기 때문이다.

 

 

 

2. Inflation 과정 (XML 만든 레이아웃이 어떻게 화면에 보여지는 것일까?)

 

 

위에서 말했던 객체화 되는 과정은 위와 같은 흐름으로 표현해 볼 수 있다. XML 파일이 메모리에 로딩되어야 우리는 비로소 화면으로 보여지는 것을 확인할 수 있고, 해당 XML 파일에 정의된 뷰들을 참조할 수 있다. 실제로는 안드로이드에서 XML 파일만이 아닌 Java, Kotlin 소스 파일이 결합되어 하나의 Activity를 구성하게 된다. 여기서 Java, Kotlin 소스파일 부분은 XML 파일에서 정의한 뷰들이 실제 동작하는 부분이라고 생각하면 쉽다.

 

 

 

3. 어디서 Inflation이 일어날까?

 

 

프로젝트를 새로 만들면 기본 설정으로 만들어지는 코드이다.

 

안드로이드 스튜디오를 켜서 프로젝트를 만들면 위와 같은 화면이 나타날 것이다. 그리고 기본 프로젝트에서 가상 기기나 실제 기기를 실행해보면 Hello World! 라고 노출되는 기본 설정이 되어있는 앱이 실행되는 것은 누구나 다 알 것이다. 여기서 생각해볼 수 있는 것은 activity_main.xml 파일이 인플레이션 과정을 통해서 화면으로 보여지고 있다는 것이다. 과연 어디서 인플레이션이 일어나고 있는 것일까? 이제 한 번 실험을 해보도록 하자.

 

 

setContentView 메서드가 불려지기 전 activity_main.xml에 정의된 textView를 참조해보도록 한다. 과연 어떤일이 일어날까? R.id.textView는 실제로 TextView에 id값을 부여하였고 'Hello World!'로 텍스트가 지정되어 있다. 앱을 실행해보도록 하자.

 

안타깝게도 NullPointerException이 발생하였다. Text는 분명히 지정해놓았고 위의 메시지를 보니 없는 뷰(메모리에 로딩되지 않은)를 참조하여 에러가 발생한 것을 확인할 수 있다. 여기서 우리가 확인할 수 있는 것은 activity_main.xml 파일에 대해서 인플레이션 과정이 이루어지지 않았다는 것이다. 그럼 위의 순서를 바꿔보자.

 

setContentView 메서드가 불려지고 난 후에 textView를 참조해보면 Exception 발생 없이 Toast 메시지가 잘 뜨는 것을 확인할 수 있다. 이제 결론을 내보도록 하자.

 

 

4. setContentView() 메서드의 역할

 

 

우리는 이제서야 이해가 될 것이다. 항상 봐오던 setContentView 메서드를 통해서 인플레이션 과정이 일어나고 있다는 것을 말이다. 실제로 인플레이션 과정이 일어나는지는 직접확인해 보도록 하자. 아래는 AppCompatDelegateImpl.java에 나타난 setContentView 메서드들이다. 

 

우리가 사용하는 setContentView(int resId) 메서드를 확인해 보면, 중간에 inflate 함수를 사용하여 resId를 contentParent와 연결(인플레이션) 시켜주고 있는 것을 확인해볼 수 있다.

 

Inflation에 대해서 깊게 다루진 않았지만 setContentView 메서드가 하는 역할에 대해서 다음과 같이 정의를 내려볼 수 있다.

 

  • 화면에 나타낼 뷰를 지정하는 역할
  • XML 레이아웃의 내용을 메모리 상에 객체화 하는 역할

 

 

5. 추가적인 궁금증

 

 

우리는 위에서 activity_main.xml 파일의 전체 화면이 인플레이션되는 과정을 알아 보았다. 하지만, 프로젝트를 하다보면 부분 화면으로 인플레이션되는 과정이 꽤나 빈번하게 발생한다. 내 기억으로는 주로 Adapter 클래스 내에서 사용하고자 하는 뷰를 객체화시킬 때 사용하곤 했던것 같다. 그럼 다음 포스팅에서 '우리는 인플레이션 과정이 필요한 부분 화면을 어떻게 객체화 시키고 있는가?'나 'setContentView 메서드에 연결되는 XML 파일을 제외하고 동적으로 할당되는 XML 파일들은 어떻게 접근할 수 있을까?'와 같은 궁금증을 풀어보도록 하자.

 

 

 

 

코딩을 하는 동안에 이전 직장에서 나를 항상 채찍했었던 말이 종종 떠오르곤 한다. '생각좀 하고 코딩하세요', '이 기술 사용에 대해 장단점을 알고 사용하시나요?'와 같은 말이다. 오늘도 나는 반성한다. 반성하면서 무엇이 부족한지, 필요한지 알아가며 내일은 오늘보다 더 성장할 것이라 믿는다.

 

+ 혹시나 수정해야 할 내용들이 있다면 댓글 달아주시면 감사하겠습니다. 또한 궁금증이 있으시다면 같이 고민하고 싶습니다.