Kotlin - Generic

2024. 1. 30. 13:03프로그래밍 언어/Kotlin

안드로이드 스튜디오 개발자 페이지를 기반으로 작성됨.

https://developer.android.com/courses/pathways/android-basics-compose-unit-1-pathway-1?hl=ko

 

Kotlin 프로그래밍 소개  |  Android Basics Compose - First Android app  |  Android Developers

Kotlin에서 Android 앱 빌드를 준비하기 위해 Kotlin의 입문 프로그래밍 개념을 알아봅니다.

developer.android.com

 

Generic이란?

 

자바에서도 쓰이는 개념으로 일반 데이터 유형이라고 하는데, 이는 알 수 없는 데이터 유형을 지정하도록 하는 개념이다.

여기서 "알 수 없는" 이라는 것은 무엇일까?  "아직 정해지지 않은, 나중에 정해지는" 이라는 의미를 가진다.

 

글로만 설명하자니 굉장히 이해하기 어렵다고 느껴진다. 그럼 Generic의 의미 이전에 Generic이라는 개념이 왜 필요한지 먼저 살펴보자.

 

자, 우리는 질문이라는 틀을 가진 클래스를 만들고 싶다. 일반적으로 아래와 같이 만들 수 있을 것이다.

class Question (
    val questionText: String,
    val answer: String,
    val difficulty: String
)

 

다만 질문의 유형에 따라서 대답의 데이터 유형이 String 이외에도 Boolean, Int 등 다른 데이터 유형이 필요할 수 있다.

이런 경우에 가장 간단한 해결 방법은 아래와 같다.

 

class NumericQuestion (
    val questionText: String,
    val answer: Int,
    val difficulty: String
)

class TrueOrFalseQuestion (
    val questionText: String,
    val answer: Boolean,
    val difficulty: String
)

class FillInTheBlankQuestion (
    val questionText: String,
    val answer: String,
    val difficulty: String
)

 

단순히 answer 에 해당하는 데이터 유형을 바꾸어가면서 여러 클래스를 만드는 것이다!

하지만 보기만 해도 너무 비효율적으로 보이지 않는가? questionText, difficulty는 같은 데이터 타입인데도 계속해서 같은 코드가 적혀져 있다. 이 경우엔 변수가 3개이지만, 만약 프로그램이 커져서 100개정도 있다고 치면 위 코드보다 훨씬 보기 좋지 않을 것이다. 

 

위 방법을 말고 상속의 개념을 활용하면 어떨까? questionText, difficulty는 super class로 두고 answer에 따른 sub class를 만드는 것이다. 위 방법보다는 낫겠다만 이 역시 sub class에서 계속해서 answer property를 추가해줘야 하는 문제점이 있다.

 

이를 위해서 등장한 것이 바로 Generic이다.

class Question <T> (
    val questionText: String,
    val answer: T,
    val difficulty: String
)

 

class 선언부에 <generic data type>을 추가해줌으로써 객체를 생성할 때마다 일반 유형의 데이터를 지정해주는 것이다.

예를 들면, 

val numericQuestion = Question<Int>("what is smallest natural number?", 1, "very easy")

 

이런식으로 만드는 것이다. (Int 뿐만 아니라 Boolean, String 그리고 사용자 지정 클래스도 가능하다.)

 

앞서 선언부에 지정한 꺽쇠 안의 T가 인스턴스화 될 때 지정되는 것이다. 마치 앞서 Int로 지정하고 answer에 1이라는 Int형 데이터를 지정해준 것과 같이. T라고 지정한 것은 일반적으로 Type의 약자를 써서 지정한 것이며, T가 있을 경우에는 다른 대문자를 사용하긴 하나 경우에 따라서 좀 더 긴 단어로 작성해도 무방하다.

 

이와 같이 Generic이 의미하는 바, 존재하는 이유를 바탕으로 적절한 상황에 따라서 해당 개념을 적용하면 코드의 가독성 뿐만 아니라 재사용성도 크게 늘릴 수 있는 좋은 문법이다.

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

Kotlin - Singleton Object  (1) 2024.01.31
Kotlin - 특수 클래스(data class, enum class, sealed class)  (1) 2024.01.30
Kotlin - 람다 표현식  (0) 2023.12.18
Kotlin - 클래스  (1) 2023.12.18
Kotlin - nullable variable  (0) 2023.12.15