클리엘
CLIEL LAB
클리엘
전체 방문자
오늘
어제
  • 분류 전체보기 (514)
    • Mobile (47)
      • Kotlin (47)
    • Web (84)
      • NestJS (9)
      • HTML5 & CSS3 (38)
      • Javascript (20)
      • TypeScript (6)
      • JQuery (11)
    • .NET (301)
      • C# (84)
      • ASP.NET (67)
      • Windows API for .NET (128)
    • Server (53)
      • SQL Server (10)
      • MariaDB (18)
      • Windows Server (6)
      • node.js (19)
    • System (12)
      • 작업LOG (12)
    • Review (11)
    • ETC (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 블로그 정리

인기 글

태그

  • node.js
  • CSS3
  • 변수
  • android
  • LINQ
  • JavaScript
  • c#
  • asp.net core web api
  • HTML5
  • Windows API
  • ASP.NET
  • MariaDB
  • android studio
  • asp.net core
  • NestJS
  • Kotlin
  • .NET
  • Entity Framework
  • jQuery
  • exception

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
클리엘

CLIEL LAB

[Kotlin] 제네릭(Generics)
Mobile/Kotlin

[Kotlin] 제네릭(Generics)

2020. 12. 10. 14:10
728x90

제네릭은 데이터 타입을 자유롭게 지정할 수 있도록 해주는 형태를 말합니다. 예를 들어 좀 억지스럽지만 정수형 데이터를 받는 아래 클래스가 있다고 가정해 보겠습니다.

class myCal(param1: Int, param2: Int) {
    var value1 = param1
    var value2 = param2

    fun Plus(): Int {
        return value1 + value2
    }

    fun Minus(): Int {
        return value1 - value2
    }
}

위와 같이 클래스를 생성하고 나면 다음과 같이 클래스를 호출하여 원하는 동작을 수행할 수 있습니다.

var mc = myCal(10, 20)
Log.d("test", "결과값: ${mc.Plus()}")

그런데 클래스를 호출할 때 정수가 아닌 소수에 대한 값이 들어가야 한다면

var mc = myCal(12.24, 8.9)

위와 같은 동작은 수행할 수 없습니다. myCal 클래스는 Int형만 받도록 데이터 타입이 정해져 있기 때문입니다. 그래서 오류가 없이 진행하려면 Double과 같은 소수를 받을 수 있는 동일한 클래스를 새로 만들어야 합니다.

 

하지만 클래스를 새롭게 만드는 대신 제네릭을 활용하면 새롭게 클래스를 정의하지 않아도 일부 원하는 방향으로 구현할 수 있습니다.

class myCal<T: Number>(param1: T, param2: T) {
    var value1 = param1
    var value2 = param2

    fun Plus(): T {
        if (value1 is Int) {
            return (value1.toInt() + value2.toInt()) as T
        }
        else {
            return (value1.toDouble() + value2.toDouble()) as T
        }
    }

    fun Minus(): T {
        if (value1 is Int) {
            return (value1.toInt() - value2.toInt()) as T
        }
        else {
            return (value1.toDouble() - value2.toDouble()) as T
        }
    }
}

예제에서 T는 타입입니다. myCal클래스를 호출할 때 T에 해당하는 타입만 맞춰주면 주어진 타입에 따른 값을 처리할 수 있습니다.

 

다만 예제에서는 사칙연산을 수행하는 클래스다 보니 T: Number로 값을 숫자로만 받을 수 있도록 제약을 걸었으며 주어진 타입에 따라 계산과정을 분리했습니다. 하지만 이러한 처리보다는 T가 타입을 대체한다는 제네릭의 특성에 주목해야 합니다.

 

이제 클래스를 호출할때 다음과 같이 타입을 지정해 호출할 수 있습니다.

var mc = myCal<Double>(12.24, 8.9)
Log.d("test", "결과값: ${mc.Plus()}")

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'Mobile > Kotlin' 카테고리의 다른 글

[Kotlin] 레이아웃(Layout) - 리니어  (0) 2020.12.11
[Kotlin] 레이아웃(Layout) - 컨스트런트  (0) 2020.12.11
[Kotlin] 추상 클래스와 인터페이스  (0) 2020.12.10
[Kotlin] 데이터 클래스  (0) 2020.12.09
[Kotlin] 클래스(Class)  (0) 2020.12.09
    'Mobile/Kotlin' 카테고리의 다른 글
    • [Kotlin] 레이아웃(Layout) - 리니어
    • [Kotlin] 레이아웃(Layout) - 컨스트런트
    • [Kotlin] 추상 클래스와 인터페이스
    • [Kotlin] 데이터 클래스
    클리엘
    클리엘
    누구냐 넌?

    티스토리툴바