안드로이드 앱을 실행하기 위해서는 화면의 배치를 알려주는 XML파일과 화면의 기능을 담당하는 소스 코드 파일이 필요하다.
소스 파일과 XML파일의 연결은 onCreate()
메소드의 setContentView()
메소드가 연결한다.
프로젝트를 생성하면 AppCompatActivity
를 상속하는 MainActivity
클래스가 자동으로 만들어진다. AppCompatActivity
에는 화면에 필요한 기능(메소드)들이 있다.
onContentView()
메소드는 XML레이아웃 파일 이름을 파라미터로 전달하여, 소스코드와 연결한 것이다.
R.layout.activity_main
과 같은 형태로 파라미터를 전달하는데 R
은 res
를 의미하고, layout
은 layout
폴더를 의미한다. 결국 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레이아웃 파일이 될 수 있다.