본문 바로가기
기초 개념

제네릭<Generic>

by 시니성 2023. 11. 22.

제네릭은 프로그래밍에서 타입(Type)의 안전성을 높이고 코드의 재사용성을 향상시키는 강력한 도구입니다. 제네릭을 사용함으로써, 개발자는 타입을 보다 유연하게 처리할 수 있으며, 동시에 컴파일 시간에 타입 체크를 강화할 수 있습니다.

제네릭이란 무엇인가?

제네릭은 클래스, 인터페이스, 또는 메소드가 다양한 타입의 객체들을 처리할 수 있도록 해줍니다. 이것은 코드를 작성할 때 구체적인 타입을 명시하지 않고, 타입 파라미터를 사용하여 나중에 해당 타입을 지정할 수 있게 해줍니다.

제네릭의 장점:

  1. 타입 안전성: 제네릭은 잘못된 타입의 객체가 사용되는 것을 컴파일 시점에서 방지합니다. 이는 런타임 오류를 줄여줍니다.
  2. 코드 재사용성: 동일한 코드를 다양한 타입에 대해 사용할 수 있어, 중복을 줄이고 재사용성을 높입니다.
  3. 리팩토링 용이성: 타입을 변경해야 할 경우, 제네릭을 사용하면 해당 타입이 사용되는 모든 장소를 찾아 수정하는 대신, 제네릭 타입의 정의만 변경하면 됩니다.

제네릭의 사용 예시

예시 상황: 데이터 저장소 클래스

데이터를 저장하고 검색하는 범용 데이터 저장소를 구현한다고 가정해 봅시다. 이 저장소는 다양한 타입의 데이터를 처리할 수 있어야 하며, 각 데이터 타입에 대해 동일한 인터페이스를 제공해야 합니다.

class DataStorage<T> {
    private val data = mutableListOf<T>()

    fun add(item: T) {
        data.add(item)
    }

    fun retrieve(index: Int): T? {
        return if (index in data.indices) data[index] else null
    }
}

fun main() {
    val stringStorage = DataStorage<String>()
    stringStorage.add("Hello")
    stringStorage.add("World")

    val intStorage = DataStorage<Int>()
    intStorage.add(1)
    intStorage.add(2)

    println(stringStorage.retrieve(0)) // 출력: Hello
    println(intStorage.retrieve(1)) // 출력: 2
}

이 예제에서 DataStorage 클래스는 제네릭 타입 T를 사용합니다. 이를 통해 String, Int 등 어떤 타입의 데이터도 저장하고 검색할 수 있는 범용적인 저장소를 구현할 수 있습니다.

결론

제네릭은 타입 안전성을 보장하고 코드의 재사용성을 높이는 효율적인 방법입니다. 다양한 타입에 대해 동일한 작업을 수행해야 하는 경우, 제네릭을 사용하면 코드를 더 깔끔하고 유지보수하기 쉽게 만들 수 있습니다. 프로그래밍에서 제네릭의 사용은 타입에 대한 유연성과 타입 안전성 사이의 균형을 제공합니다.

'기초 개념' 카테고리의 다른 글

`withCredentials`에 대한 설명  (0) 2023.09.12
Eval 함수와 보안 문제  (0) 2023.08.29
개발 시 사이드 이펙트(Side Effect)란?  (0) 2023.08.24