안녕하세요.
안드로이드를 시작한지 2일된 꼬꼬마입니다.
안드로이드 java 파일의 구조가 이해가 안되는데, 책에는 설명이 없어서 질문드립니다.
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
위에 보면 Bundle 타입의 savedInstanceState를 파라메터를 왜 쓰는지 Bundle 타입은 뭔지 그리고 저 파라미터는 꼭 써야하는지 꼭 savedInstanceState를 써야 하는지 궁금합니다.
그리고 두번째로 상위 클래스의 onCreate 를 또 호출하는데 그 이유가 뭔지와 생성자는 무슨 역할을 하는지 궁금합니다.
(저 Activity의 클래스 구조를 볼 수 있으면 이해가 될것 같은데. 어디서 볼 수 있나요?)
마지막으로
protected class TestView extends View {
public TestView(Context context) {
super(context);
}
}
요기서 왜 생성자를 새로 정의하는것인지, Context 타입과 파라미터로 전될되는 context 가 뭔지 궁금합니다.
초보라 너무 엉뚱한 질문을 한것 같지만, 현답 기다리겠습니다.
Bundle은 Object 타입의 객체로 알고있습니다.
검색해보시면 자세히 나올듯..
Object는 최상위 클래스로 모든 클래스가 상속받고있는 클래스라는건 알고계시죠?ㅎ
Bundle을 사용하는 방법 역시 인터넷에 자세히나와있어요.
간단히 Bundle bundle = new Bundle() 후 bundle.putString, putInt 등으로 입력하고 getInt, getString getBoolean 등으로 원하는 타입을 뺴낼수있습니다.
Bundle savedInstanceSate를 왜 쓰는지는 Activity의 onCreate 메서드만이 알수있겠죠?
남의 클래스는 원칙적으로 볼수가없어요.
모든 클래스는 jar화 되어있어서 볼수가 없지만 사용법만 알면 쓸수있게 해놓은겁니다.
님두 클래스를 만들어서 jar화 하면 다른사람이 님 소스를 못보지만 사용법을 알려주면 다른사람이 지원범위내에서 사용을 할수가있는거죠.
사용법은 어찌아냐구요?
안드로이드 개발자 사이트들어가면 라이브러리가 있습니다^^
물론 찾아보면 Activity 원본소스를 볼수있는 곳도 있겠지만 사용법만 알면된다는 의미에서 적은거에요.
onCreate에서 bundle을 받는 이유는 기존의 상태를 받아서 onCreate에서 받아서 복구시키기 위해서 받는거라고 알고있습니다.
어떻게 저장하고 복구시키는건 우리는 Bundle형태의 객체만 넣어주면 알아서 하겠죠?
그뒤론 신경안쓰셔도되요ㅎ
그 바로밑에 super.onCreate(saveInsate)하는 이유는, 클래스에서 젤먼저 하는게 extends Activity를 하는거잖아요.
Activity를 상속만 한다고해서 그안의 모든 메서드나 변수들을 쓸수있는건 아니죠.
상위 클래스를 한번 실행시켜줘야 모든 변수와 메서드들이 초기화되고 그걸 내것처럼 쓸수가있게되는거죠.
그래서 super.onCreate로 똑같은 메서드의 이름을 실행시켜주면 그안에있는 모든 변수와 메서드들을 내것처럼 사용할수가 있게되는거에요.
글구 Bundle savedInstanceSate는 꼭 그대로 써야되냐고 물으셨는데, 변수명은 님 원하는대로 바꾸심되요.
단지 알기쉽게 이름을 적어놓은건데 saveInsatanceState에서 알수있듯이 인스턴트 상태를 저장하는 변수다 라는뜻에서 저리적어놓은것일뿐이지 원하는대로 바꾸심되요.
단지 아래 super.onCreate안에다가도 똑같은 변수명을 넣어주셔야겠죠.
마지막으로
TextView(Context context)를 넣는 이유는, 이또한 TextView 클래스내에서 context를 받아서 어딘가에 쓰고싶다고 달라고하는것에 불과한거에요.
Context 내부에 어떤 메서드나 변수가 있는데 그중에 무엇을 쓰고싶으니 Context 클래스를 넘겨달라고하는겁니다.
Context에는 어떠한 메서드가있는지는 아시나요?
Context context = new Context(); 로 오브젝트만들은뒤에
context. 을 쓴뒤에 컨트롤 스페이스눌러보면 지원가능한 모든 메서드 목록이 나옵니다.
그중에 쓰고싶은 메서드가있을때 통쨰로 컨텍스트를 넘겨달라고하는겁니다.
어디에 쓸려고 넘겨달라고하는걸까요?
그건 만든사람맘이겠죠?ㅎㅎ
어디에 쓰려고 넘겨달라고하는지 알필요가없어요.
단지 텍스트뷰를 만드는데 컨텍스트를 쓸데가있으니 넘겨달라고하는거니 우리는 그냥 넘겨주기만하면 되는겁니다ㅎ
클래스를 직접 여러번 만들어보시면 자연스레 이해가 되실거에요..
Context가 Activity 등의 클래스를 추상화 한 클래스입니다.
즉 Activity 클래스에서 사용되는 함수들을 몇몇 알고 있는것이죠.
TextView등의 View에서 이 Context를 생성자 파라미터로 받는 이유에 대해 설명하기 전에 아 Context파라미터는
자신을(TextView) 생성하는 화면을(Activity) 말하는 것입니다.
그래서 만약 TextView 등의 변경이 일어나 화면을 다시 그려야 할 경우
context.notify() 와 같은(예상) 함수를 통해서 자신을 만든 화면에게 화면을 다시 그려야 한다 등의 패턴이 가능하게 되는 것이죠.
PS : 제가 이해하고 있는 방법이라 위와 같지는 않을 수도 있어요. 하지만 흐름은 비슷할겁니다.
1. 번들
번들은 주로 액티비티간에 데이터를 이동할 때 주로 사용하는 것으로 HashMap 같은 형태로 key-value 로 되어 있습니다.
2 .onCreate 에서 번들
onCreate 에서의 번들의 로컬변수명이 savedInstanceState 입니다. 말그대로 저장되어 있는 상태 값이라는 의미인데 이건 단독으로 쓰여지는게 아니고 화면이 가로 <-> 세로 로 전환되면 액티비티는 사용자가 보기엔 화면은 그대로지만 실상은 액티비티가 Destory 되고 onCreate 되는 일종의 ReCreate 과정을 거치게 됩니다.
이때 액티비티는 Destory 될때 내부적으로 데이터를 저장하고 Create 될 때 저장된 값을 다시 불러오는 로직을 탑니다.
그때 저 번들이 사용이 되는거고요
그럼 왜 이런 걸 두느냐..
나중에 앱을 개발하시다보면 onCreate 될 때 네트워크 동작같은 데이터를 재구성하는 작업을 하는데 화면이 전환 될때마다 그러면 굉장한 버퍼링이 걸리게 되죠
그럴때 바로바로 데이터를 저장했다가 재구성하라는 의도에서 생긴 것입니다.
3. super.onCreate() 는 왜 타는가?
액티비티클래스에는 onCreate 에 화면을 포어그라운드로 올리는 로직이 되어 있습니다.
여기에는 자식 클래스에서는 접근할 수 없는 그러한 변수들에도 접근해야하는 프레임웤의 로직들도 있습니다.
그래서 onCreate 를 탈 때 super.onCreate 를 먼저 타야합니다.
그래서 super.onCreate 를 호출한 다음에 화면 정보를 정의하는 requestWindow 메쏘드를 태우고
최종적으로 ContentView 를 설정하는 로직이 되는거죠.
자세한건 안드로이드 오픈 소스를 보시면 여러 단계로 안드로이드가 돌아간다는걸 아시게 됩니다.
4. 액티비티는 생성자가 의미가 없는가?
네 실질적으로는 의미가 없습니다.
안드로이드는 액티비티를 내부적으로 ActivityManagerProxy 라는 클래스로서 관리하고 있고 ActivityThread, ActivityManager 등과 같은 다양한 단계를 거쳐서 액티비티를 컨트롤 합니다.
따라서 화면을 구성하는 목적으로 사용되는 액티비티는 실질적으로 OS 의 플로우를 따라야만 정상 동작하기 때문에 생성자는 의미가 없다고 봐도 무방합니다.
5. View 는 왜 생성자로 관리하는가?
저기서 사용되는 Context 는 View 가 생성되는 액티비티의 Context 라고 보시면 됩니다.
Context 에는 다양한 정보가 들어있는데...
(사실은 저도 뭔질 아직도 이해못하고 있습니다 -_-;, 근본적으로 Spring 과 같은 타 프레임웤에서 쓰는 Context 라는 개념 자체도 이해못하고 있습니다 ㅠ)
View 는 OS 에서 관리한다기보단 액티비티 단에서 관리를 하는 녀석이라고 생각하시면 됩니다.
나중에 CustomView 를 만드시게 되면 필요한 기본 값들을 설정할 수 있죠.
(이를테면 VerticalSeekBar...)
뷰는 일반 클래스처럼 사용되는 녀석인데 기본적으로 Context 를 가져야만이 액티비티가 뷰를 제어할 수 있다고 보시면 됩니다.
(여기서 Activity 가 View 를 제어하고자 한다면 Activity 의 Context 와 View 의 컨텍스트를 동일한 값을 가져야 합니다.)
Context 는 저도 아직 이해못한 개념이 많으므로 다음으로 토스하겠습니다.