본문 바로가기
코딩과 알고리즘

크레이의 앱개발 도전기 #9. 코틀린!

※ 이 게시글은 크레이의 IT개발 관련 성장기를 다루고 있습니다. 관련지식이 약간 있어야 이해되실 수 있습니다. 가벼운 마음으로 읽어보시면서 흥미가 생기고 의욕이 생긴다면? 개발자의 자질이 있으신 겁니다 :)

크레이가 블렌더로 제작한 이미지. 잘라서 자유롭게 사용하셔도 됩니다.

"앱 개발은 코틀린으로 대세가 바뀌고 있는 것 같습니다."

앱 내에서 카메라로 둘러보다 찰칵, 고화질로 사진 저장하는 걸 시도해 보았는데..
홍드로이드님 강좌도 그렇고 깃허브에 올라온 어떤 코드도 자바로 작성된 코드는
안드로이드 돌핀(2021.3.1패치 버전)에서 제대로 작동되는 소스가 없더군요.

토요일 하루 종일 사투(?)를 벌이다가 가까스로 앱 안에서 카메라로 둘러보는 부분까지는 진행했는데요,
이제는 또 사진이 저장이 안되네요 ㅎ.. TakePicture 라는 메소드를 사용하면서 엔진단 소스에서 오류가 나서,
비트맵을 받아와 저장하는 기술을 사용할 수도 없는 상황이었습니다.

그런데 코틀린 언어로 개발된 GIT 허브 소스를 갖다 쓰니..
어라? 단번에 되버리는거 있지요?!
오! 필승 코틀린!!


사진도 갤러리에 고화질로 보관되고 카메라 전면/후면 전환도 있고 완성된 앱도 쓸만하더라구요.
이 앱 소스를 제 것으로 소화하고 싶어졌습니다.
그러려면 코틀린 언어에 대한 기초를 어느정도 소화해야 겠지요?

코틀린으로 실행한 깃허브 카메라 내장 앱, 책은 코틀린과 무관.

코틀린에 대해 알아보려 구글링을 해보았는데요
현 시점에 구글에서 지원하는 공식 앱개발 언어는 코틀린이라는 것입니다.

코틀린에 대한 여러가지 평가를 읽어보니 다방면에서 자바보다 더 간결하고,
성능도 좋다는 의견이 분분, 자바와 함께 사용할 수 있는 장점이 있더군요.
그래서, 앞으로의 개발 연습은 코우~틀린으로 진행하기로 하였습니다!

( 딱 하나 맘에 안 드는건 코틀린이 러시아 섬 이름이라는거... 전쟁 주범 푸틴 싫어요!! )

역시나 내용을 쉽게 쉽게 알려주는 구름 에듀의 홍드로이드님 강좌를 찾아 진행해보았는데요.

https://edu.goorm.io/learn/lecture/23399/현직-개발자가-알려주는-안드로이드-코틀린-앱-제작/lesson/1120985/textview 

안드로이드쪽 개발이 하도 바뀌다 보니 강좌 영상 그대로 진행하면 막히게 됩니다.
이유인즉 익스텐션이라는 라이브러리가 오류가 잦아 구글에서 더 이상 지원을 안하겠다는 게 이유지요 ㅎ..
( 강의 영상 만드시는 분들이 힘들겠다는 생각이.. )

수소문 끝에 by lazy 라는 새 문법과, 뷰 바인딩이 있는 것으로 확인되었습니다.

2가지 방법 모두 터득은 했는데요. 완전 익숙해지기까지는 시간이 걸릴것 같습니다.
아직은 어떤게 더 좋은 방향인지 감을 못 잡겠네요.

오늘은 간단히 사용할 수 있는 lazy 비법을 소개해 드릴텐데요.
lazy 문법은 코틀린 언어에서 사용가능한 희안한 비법이자 자바에는 없는 개념입니다.

이를테면 아래 자바 소스 코드는 


public class MainActivity extends AppCompatActivity {

 
TextView tv_result;
 
Button btn_set;

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

 
// 현재 화면에 보여줄 액티비티 뷰 설정
 
setContentView(R.layout.activity_main);

 
// 현재 액티비티의 컴포넌트 연결
 
tv_result = (TextView) findViewById(R.id.tv_result);
 
btn_set = (Button) findViewById(R.id.btn_set);

 
// 버튼 클릭시 처리
 
btn_set.setOnClickListener(new View.OnClickListener() {
  
@Override
   
public void onClick(View v) {
   
tv_result.setText("크레이의 스터디");
   }
  });
 }
}


코틀린에서 아래처럼 사용할 수 있는데요.


class MainActivity : AppCompatActivity() {

   
lateinit var tv_result: TextView
   
lateinit var btn_set: Button

   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView(
R.layout.activity_main)
       
tv_result = findViewById(R.id.tv_result)
       
btn_set = findViewById<Button>(R.id.btn_set)
       
btn_set.setOnClickListener {
           
tv_result.text = "크레이의 스터티";
        }

    }
}


소스가 간결하긴 하나 홍드님 강좌처럼 쉽지는 않습니다.
findViewById 를 사용하지 않아도 된다는 편리함을 쓸 수 없기 때문이지요.
그래서 알아본 결과 위보다는 조금 더 간결한 방법을 알아냈습니다.


class MainActivity : AppCompatActivity() {

   
val tv_result: TextView by lazy { findViewById(R.id.tv_result) }
   
val btn_set: Button by lazy { findViewById(R.id.btn_set
) }

   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView(
R.layout.activity_main)
       
btn_set.setOnClickListener {
           
tv_result.text = "크레이의 스터티";
        }
   
}
}


이 방법은 비록 findViewById 를 사용해야 하는 것은 어쩔수 없으나,
종전처럼 변수 선언부와, findViewById 매칭 부분을 2군데로 나누어 코딩할 필요가 없습니다.
변수를 선언하면서 by lazy { ... } 코드블록안에 findViewById(R.id.이름) 을 넣어주면 끝인데요.
아래 코드는 텍스트뷰 tv_result 와 버튼 btn_set 을 각각 알아서 필요한 순간에 매칭해 줍니다.

val tv_resultTextView by lazy findViewById(R.id.tv_result) }
val btn_setButton by lazy findViewById(R.id.btn_set
}

필요한 순간에 매칭이 된다니 정말 와우~가 아닐수 없네요.
뷰 바인딩 방법도 쓸만하긴 하나 영상과 달라서 한동안은 이 방법으로 진행하려고 합니다.

참고로 홍드님의 강좌#1 에서는,

https://edu.goorm.io/learn/lecture/23399/현직-개발자가-알려주는-안드로이드-코틀린-앱-제작/lesson/1120985/textview 

밑줄친 부분만 추가하면 무난하게 진행됩니다.


class MainActivity : AppCompatActivity() {

   
val tv_title: TextView by lazy { findViewById(R.id.tv_title) }

   
override fun onCreate(savedInstanceState: Bundle?) {


홍드님의 #2 강좌에서도 밑줄친 부분을 추가하시면 역시 무난합니다

https://edu.goorm.io/learn/lecture/23399/현직-개발자가-알려주는-안드로이드-코틀린-앱-제작/lesson/1121041/edittext-button 


class MainActivity : AppCompatActivity() {

   
val tv_result: TextView by lazy { findViewById(R.id.tv_result) }
   
val ed_id: EditText by lazy { findViewById(R.id.ed_id) }
   
val btn_getText: Button by lazy { findViewById(R.id.btn_getText) }

   
override fun onCreate(savedInstanceState: Bundle?) {


필요하신 분께 도움이 되셨을지 모르겠습니다:)
오늘도 방문해주신 모든 분들께 감사드립니다.