본문 바로가기
일상생활 이야기/안드로이드 스튜디오 독학하기

안드로이드 스튜디오 독학하기 36일-part2

by 인터넷떠돌이 2017. 4. 21.
반응형

안녕하세요?


지난번 part1에서는 parcelable을 이용해서 데이터를 전달하는 방법을 다 설명하지 못했는데, 좀 헤메고 나서야 어느정도 이해가 되었고, 그 내용을 포스팅 하고자 합니다.



지난번 part1에서 마지막으로 끝낸 부분입니다. 일단 위 스크린샷에서 붉은 박스로 쳐진 부분은 다른 의미도 없이, parcel에다가 쓴다는 의미입니다. 당연 구조는 다음과 같이 됩니다.


public void writeToParcel(Parcel 임의의 이름, int flags){

임의의 이름.writeInt(정수 변수);

임의의 이름.writeString(문자 변수);

}


여기서 flags라는 것은 변경이 가능한지 아닌지 여부는 잘 모르겠습니다. 하지만 여기에 들어가는 임의의 이름은 어떻게 짓든 간에 큰 문제는 없어 보입니다. 당연 여기서 언급하는 정수 변수와 문자 변수는 위에서 SimpleData에 들어가는 내용으로 정의를 내린 변수명입니다.



다음은 activity_main.xml의 design탭으로 가서, 버튼을 하나 추가하는 화면입니다. 여기서 onClick속성은 미리 지정을 하여서 나중에 있을 작업을 편하게 합니다. 그리고 여기는 제약 레이아웃이기 때문에 옆에 있는 청사진에서 버튼의 사방을 끌어서 화면의 모서리에 연결시켜 주는 작업을 해야 제대로 버튼이 화면의 중앙에 위치할 수 있게 됩니다.



public void onClick속성(View v){}로 버튼을 누르면 메인 액티비티에서는 인텐트가 실행이 되도록 코딩을 시작합니다. 그리고 당연하다면 여기서 SimpleData라는 메서드는 원래는 처음에 없는 것입니다. 단지 새로운 class로 SimpleData를 생성하면서 만들어 주어서 에러가 뜨지 않고 이렇게 값을 입력하라는 메세지도 나오게 된느 것입니다.


당연 처음에는 정수 변수인 num을 입력했기 때문에 정수를 입력하라고 뜨고, 그 다음으로는 msg라는 문자열 변수를 SimpleData.java에서 입력했기 때문에 위 스크린샷과 같은 메세지가 뜨는 것입니다.



그리고 이어서 인텐트에 변수로 code1을 위 스크린샷에 주었기 때문에, parcel로 보내기 위한 절차에 들어가야 합니다. 제가 알아낸 바로는 다음과 같은 구성으로 되어 있다는 것을 알았습니다.


인텐트를 의미하는 변수.putExtra("입력될 데이터의 이름",parcel로 보낼 데이터);


[Do it 안드로이드 앱 프로그래밍]이라는 책에서는 일단 이름과 parcel로 보낼 데이터를 모두 data라고 선언을 했는데, 이러면 공부하는 사람이 헷갈릴 수 있으니, 저렇게 KEY_SIMPLE_DATA="data"; 라는 변수선언을 미리 한 것으로 보입니다. 그리고 당연 데이터를 주고 받기 위해서 startActivityForResult를 사용했으며, request code란에는 원래 숫자가 들어가야 하는데 여기서는 숫자를 대용한 코드가 들어갔습니다.



다음은 activity_menu.xml을 디자인 한 것입니다. 여기서는 선형(Linear) 레이아웃이기에 제약 레이아웃처럼 컴포넌트를 청사진에서 이리저리 선으로 연결할 필요는 없습니다.


일단 여기서는 버튼 한개와 텍스트 박스 한개를 추가하고 다음으로는 MenuActivity.java로 가서 코딩을 시작합니다.



일단 버튼을 누르면 돌아가기 위해서 MenuActivity를 종료하라는 finish();만 있어도 충분할 것 같기는 합니다만, 왜 여기다가 인텐트를 의미하는 코드를 사용했는지는 아직은 모르겠습니다. 아마도 버튼을 눌렀을 때 MainActivity로 보낼 데이터를 만들기 위함이 아닌가 하는 추측은 합니다만, 아직까지는 잘 모르겠습니다.



그리고 다음은 인텐트를 전달받아서 이를 실행시키는 과정입니다. 일단 여기서 processIntent라는 메서드는 원래 없었는데, 아래에서 새로 정의하여서 나온 것입니다.


private void processIntent(Intent 인텐트를 의미하는 코드){ 유저가 정의한 코드 }


여기서 if조건의 안쪽은 이런 의미가 됩니다. code3라는 인텐트가 null이라고 빈 값이 아닐 경우 getExtras()라는 메서드로 인텐트의 값을 받아서 와라는 의미가 됩니다. 그리고 여기서는 많은 데이터를 parcel을 통해서 묶었기 때문에 getExtras()라는 명령어만 가지고는 부족한지, 이어서 여기서는 SimpleData라는 메서드의 값을 이 MenuActivity에서 설정하는데 getParcelable이라는 메서드로 parcel안에 들어가 있는 값을 가지고 오라는 의미가 됩니다.


다시 말하지만, SimpleData안에는 그 어떠한 값도 들어가 있지 않습니다. 단지 먼저 숫자가 나오고, 그 다음에는 문자열이 오는 메소드일 뿐입니다. 이 메소드를 여기 MenuActivity에서 구현하는데, 들어가는 값은 MainActivity에서 지정한 값을 계산하라는 의미가 됩니다.


다만 여기서 이후 setText()라는 메소드로 텍스트 박스안에 있는 값을 변경시키려고 했습니다만, 여기서 getNumber와 getMessage가 원래 안드로이드 스튜디오에 없는 메서드라서 구현하는데 어려움이 있었습니다.



다시 SimpleData.java로 돌아와서 위 스크린샷에 보이는 빨간색 박스에 들어간 코드를 입력해야 합니다. 일단 저로서는 더는 깊게 들어갈 수 없어서, 여기서 필요한 것만 이야기를 하자면 다음과 같은 형식이라는 것을 발견했습니다.


public 변수타입 get임의의 메소드명(){

   return 변수타입에 맞는 변수명;

}


public void set임의의 메소드명(변수타입 변수명){

   this.변수명 = 변수명;

}


더 들어가려고 하면 들어갈 여지가 얼마든지 있겠습니다만, 언제까지고 이걸 붙들고서 있을 수만은 없습니다. 일단 제가 이해한 것은 여기까지 입니다. 이런 식으로 getNumber()와 getMessage()가 위에서 처럼 저런식으로 구현이 되었으며, 이런 메서드는 특정 클래스나 메소드안에 정의된 변수를 따로 지징하는데 사용된다는 것을 알 수 있었습니다.



그래서 USB에 스마트폰을 연결한 다음 실행시켰을 때, 맨 처음 뜨는 메인 액티비티에서는 저렇게 버튼이 하나만 나와 있는  것을 볼 수 있었습니다. 저 버튼을 누르면.............



메인 액티비티에서 정의한 SimpleData의 내용이 이렇게 메뉴 액티비티(MenuActivity)로 전달되는 것을 볼 수 있었습니다. 여기서 왜 이렇게 복잡하게 parcel을 쓰느냐고 할 수 있겠습니다만, 일단 이와 같은 형식은 ID와 Password를 입력받아서 전달하는 경우에는 이런 parcel이 유용하게 사용될 수 있다고 합니다.


이것으로 parcelable이라는 부분에서 몇 일간의 길고도 길었던 씨름을 이제서야 끝낼 수 있었다는 생각이 듭니다.

반응형