오늘은 어제 공부하다 포기한 registerForActivityResult에 대하여 공부를 진행했다.
들어가기에 앞서 오늘 풀이한 코드카타에 대해 설명하고 시작하겠다.
오늘은 입력받은 수의 최대공약수와 최소공배수를 구하는 코드를 작성했다. else의 코드는 if의 코드와 n과m의 차이 이외는 똑같기 때문에 if문 안에 있는 것만 설명하도록 하겠다.
먼저 m과n으로 숫자를 입력을 받는다. 먼저 if문으로 m과n중 누가 더 큰지를 확인한다. 그 이유는 내가 코드를 작성할 때 작은수에 기준을 두어 코드를 작성했기 때문에 분리를 먼저 했다.먼저 if문안에 for문을 넣는데 이때 작은수인m만큼 반복하게 만들어 최대공약수를 구하도록 한다. m을 넣는 이유는 n과 m의 최대공약수를 구하는데 최대공약수가 최소인 m을 넘어갈 수가 없기 때문에 m까지만 반복한다. 그렇게 해서 i에 1부터 m까지 넣고 n%i와 m%i가 0일 때가 공통약수이기 때문에 이때 A에 저장한다. 그리고 i가 계속해서 커지기 때문에 마지막에 A에 저장되는 값은 약수중에 가장 큰 최대공약수가 되게 된다. 다음으로 최소공배수를 구하는데 이때는 while문을 사용한다. 이때 사용하는 변수는 B, C, count1, count2이다. count는 곱한 숫자를 나타내주고 B와C는 곱한 값을 저장한다. 이때 B의 값이 크면 C의 count를 늘려 C의 값이 커지게 하고 만약 C가 크면 B의 count를 높여 B의 값을 커지게 한다. 이때 B와C가 처음으로 동일해지게 된다면 m과n의 최소공배수가 되게 된다.
다음으로는 오늘 학습한 것에 대해 정리하겠다. 들어가기전에 registerForActivityResult을 이용해 원하는 코드를 작성했지만 거기에 사용되는 코드가 어떤 역할을 하고 또 왜 그렇게 되는지에 대해서는 아직도 이해하지 못하여서 registerForActivityResult에 대한 상세한 설명은 하지 않았다. 최대한 빠른 시일내에 상세한 설명을 담아 TIL을 작성하도록 하겠다.
★ ★ ★ 아래의 설명에는 코드 작성법에 대한 이해를 시키기 위해 변수명 옆에 A,B,C의 함수명을 설정하여 추가 설명을 덧붙였으니 참고하면서 읽으면 도움이 될 것이다.(Ex에 A, B, C를 이용한 코드를 작성하는 법이 들어가 있다.) ★ ★ ★
먼저 registerForActivityResult를 사용하기 위해서는 launcher를 필요로 한다. 따라서 정보를 받아올 파일의 onCreate가 실행되기 전에 private lateinit var 변수명(A) : ActivityResultLauncher<Intent>를 정의해 코드를 초기화 함과 동시에 후에 사용할 수 있도록 한다. 추가로 내가 받아와야할 정보들 또한 함께 정의해 놓는다
(Ex. EditText를 받아와야하면 private lateinit var 변수명(B) : EditText 로 정의해 놓는다).
그리고 정보를 전달할 파일의 onCreate안에 Intent를 통해 넘길 정보를 putExtra로 저장해 놓은 후 setResult(RESULT_OK, intent)를 작성한다(intent사용법은 이전에 작성한 TIL을 참고하기 바란다.).
이제부터 데이터를 받아와야하는데 이걸 위해선 정보를 받아올 파일에서 registerForActivityResult를 실행할 함수를 정의해야한다. 이때 코드의 기본틀은 아래와 같다.
fun 함수명(){
A = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
result ->
if( result.resultCode == RESULT_OK){
var 변수명(C) = result.data?.getStringExtra(가져올 데이터 이름)
}
}
}
(이때 if안에 들어있는 resultCode는 정보를 보낼 파일에서 정보를 보낸 후 RESULT_OK로 정보를 보냈다는 표시를 하는 것처럼 보인다.)
그리고 이를 실행하기 위해서 oncreate안에 함수를 불러 작동시키도록 하고 버튼 등의 이벤트가 발생했을 때 그 안에 A.launch(intent)를 넣어 데이터를 가져올 파일을 실행시킨다.
(Ex. 버튼을 클릭했을 때 작동하려면 setxxOnClickListener안에 작성하면 된다.)
이렇게 하면 데이터를 가져올 수 있다. 이렇게 가져온 데이터를 이용해 TextView등에 집어넣어 앱을 더 편리하게 만들 수 있다.
(Ex. 함수 안에서 C로 데이터를 받아왔기 때문에 다음줄에 B.setText(C)를 입력하면 EditText에 정보를 바로 입력시켜놓을 수 있다.)
오늘은 registerForActivityResult의 사용법을 작성해봤는데 작성해보면서 왜 코드를 저렇게 사용했는지 코드의 기능을 몰라도 약간씩 이해가 됐지만 정확하게 어떤 역할을 수행하는지 알진 못했다. 추가로 더 공부하고 해설영상에서도 어떻게 사용하는지 학습해서 다음에 registerForActivityResult에 대해 설명할 때에는 더 완벽하고 더 이해하기 쉽도록 작성하겠다.