본문 바로가기
개발

[코틀린] context 뜻? 활용 복습

by kks950115 2024. 2. 16.
728x90

화면에 표시되는 작업을 하다보면 유독 context를 자주 접할 수 있다. 

그냥 view를 가리키는건가보다 하고 그냥저냥 이해하고 있었다.

액티비티나 프래그먼트에서 tihs라고 치거나 context라고 치면 왜 되는지느 모르겠지만... 잘 작동하니 말이다.

구글에 context라고 치면 많은 글이 나온다. 문제는 봐도 아하! 이거구나 하고 감이 오지 않는다. 

context라는 class에 들어가면 7000줄이 넘는 엄청난 양의 코드를 볼 수 있다. 이걸 다 읽을 엄두가 나지 않고 딱히 몰라도 여태 사용하는데는 지장이 없어서 미루고 미루었다.

문제는 지겹도록 나오는 context를 어떤 식으로 써야하는지 도통 감이 잡히지 않으니 매개변수로 context가 나올 때마다 뭘 넣어야할지 몰라서 매번 시간을 낭비한다는 게 문제다.

정확히 뭘 하는 놈인지는 모르겠지만 context를 활용하는 방법 쯤은 알아야하지 않나? 싶어서 알아보았다.

 

 

말만 하면 이해가 안되니 내 경우의 예시를 들어보겠다.

//리사이클러뷰 어댑터 코드 중 일부이다.
var contextTest : Context? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchListHolder {
    val binding = RvitemSearchListBinding.inflate(LayoutInflater.from(parent.context),parent,false)
    contextTest = parent.context //ex 3
    return SearchListHolder(binding)
}

   
  override fun onBindViewHolder(holder: SearchListHolder, position: Int) {
        holder.tvUploader.setOnClickListener {
        	//intent에 첫번쨰 매개변수에는 context가 들어가야한다.
            val intent = Intent(it.context,ChannelDetailActivity::class.java) // ex1
            intent.putExtra("data",items[position].channelId)
            contextTest?.startActivity(intent) //ex4
        }

        Glide.with(holder.itemView) //ex2
            .load(items[position].thumbnail)
            .into(holder.ivThumbnail)


    }

}

 

activity나 프래그먼트에서는 context가 들어갈 자리에  this나 context를 넣으면 됐었다. 왜 되는지는 모르겠지만...

그런데 어댑터에서는 context도 안먹히고 this도 안먹힌다. 그런데 기능을 넣으려면 context를 넣어야한다.

 

 

액티비티와 프래그먼트에서 context나 this를 넣어도 되는 이유는 activity와 fragment가 context를 상속받기 때문이다.

액티비티에 있는 AppCompatActivity를 컨트롤 클릭해서 올라올라 가면 Context클래스를 볼 수 있다. 그래서 작동했던 것이다. 

 

그런데 어댑터는 context 클래스를 상속받지 않기 때문에 context 를 입력해도 빨간 글씨로 변한다.

 

ex1의 경우엔 view가 가지고 있는 context를 사용했다. view는 context를 상속받지 않기 때문에 it만 넣어서는 되지 않는다. 대신 view 는 Context 클래스를 멤버변수로 갖고 있기 때문에 it.context를 넣어주면 작동한다. 

 

ex2의 경우 Glide라이브러리이다. with()에 context가 들어가야하는데 어댑터에서는 역시나 context가 안먹힌다.

itemview는 viewholder 클래스이고 viewholder클래스는 view를 상속받기 때문에 뷰에게 있는 context를 상속받아서 쓰는 것이기 때문에 작동하는 것이다. 

 

ex3은 oncreatviewholder에서 viewgroup에 있는 context를 넣은 것이다. viewgroup은 view를 상속받기 떄문에 contextTest를 ex1과 ex2에 넣어도 작동한다.

 

ex4는 context타입을 넣었으므로 당연히 된다. 

 

그럼 ex1의 context와 ex2의 context, ex3의 context,  ex4의 context 는 같은 context일까? 

넷 다 작동하는걸 보면 같은거 같지만.... 같다고 확신할 수는 없다.

 

왜냐하면 context를 매개변수로 넣는데 context의 어떤 부분을 쓰는지 알수가 없다. 그렇기 때문에 완전히 같은 객체라고 확신할수는 없다. 각각의 메소드가 context의 어떤 부분을 쓰는지 정확히 알고 있다면 같은지 다른지 알수 있겠지만 지금의 나로서는 모르겠다.

 

왜 되는지 쉬운 예를 들자면....

examplecalss 의 내용이 a=apple , b=banan 이 2개 뿐이라고 가정해보자. 어떤 함수가 실행될 때 examplecalss 의 a의 apple만 필요로 한다면, 다른 examplecalss 의 b가 banan든 bear든 orange든 a의 값이 apple 이기만 하면 상관없을  것이다. 

함수가 실행될 때 필요한 것은 examplecalss 클래스의 a라는 값이 apple이기만 하면 되니까.

 

그래서 위에 예시코드의 context들을 다 바꿔서 넣어도 작동하는 것이다.

 

이제 화면작업에서 매개변수에 context가 나오더라도 삽질하는 시간을 줄일 수 있을 것이라 기대해본다....

728x90
반응형

댓글