04-1 레이아웃 인플레이션 이해하기

안드로이드 앱을 실행하기 위해서는 화면의 배치를 알려주는 XML파일과 화면의 기능을 담당하는 소스 코드 파일이 필요하다.

소스 파일과 XML파일의 연결은 onCreate()메소드의 setContentView()메소드가 연결한다.

프로젝트를 생성하면 AppCompatActivity를 상속하는 MainActivity클래스가 자동으로 만들어진다. AppCompatActivity에는 화면에 필요한 기능(메소드)들이 있다.

onContentView()메소드는 XML레이아웃 파일 이름을 파라미터로 전달하여, 소스코드와 연결한 것이다.

R.layout.activity_main과 같은 형태로 파라미터를 전달하는데 Rres를 의미하고, layoutlayout폴더를 의미한다. 결국 res/layout/activity_main.xml파일을 말하는 것이다.

실제로 앱을 실행하면, XML레이아웃을 소스코드에서 사용한다. 앱이 실행될 때, XML레이아웃의 내용이 메모리에 객체화되어 저장(할당)되고, 객체화된 XML레이아웃을 소스 코드에서 사용한다.

이렇게 레이아웃의 내용이 메모리에 객체와 되는 과정을 **인플레이션(inflation)**이라고 한다.

XML레이아웃은 앱이 실행되는 시점에 메모리에 객체화 된다. 따라서 레이아웃 파일에 <Button> 태그를 정의해도 앱은 실행되기 전까지 버튼이 있는지 모른다.(인플레이션되지 않는다.)

따라서 setContentView()이전에(레이아웃이 인플레이션(객체화)되기 전에) 정의한 Button객체를 참조하면 오류가 발생한다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button button= findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "button clicked", Toast.LENGTH_LONG).show();
            }
        });

        setContentView(R.layout.activity_main);
    }
}

앱이 중지되며 오류메세지가 나온다. 메모리에 객체화(인플레이션)되지 않은 버튼 객체를 참조했기 때문이다.

오류가 발생하면 Logcat창에 오류 로그가 출력된다. 이 경우는 객체화 전에 객체를 참조했기 때문에 NullPointException이다.

이와 같이 setContentView()메소드는 매우 중요한 역할을 한다. 화면에 표시할 XML레이아웃을 지정하거나, 화면에 표시할 뷰 객체를 지정하는 역할을 한다.

파라미터로는 뷰 객체 또는 XML레이아웃 파일이 될 수 있다.