티스토리 뷰
Generic: 클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능
class A와 A를 상속받은 class B가 있다고 해보자.
이때 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 파라미터로 받으려면 어떻게 해야할까?
물론 다형성의 개념을 활용하여 캐스팅한 변수를 함수의 인자로 넣어줄 수 있는 방법이 존재하지만, 이는 프로그램의 속도를 저하시킬 수 있는 문제점을 앉고 있다.
그래서 Generic이라는 개념이 나왔다.
Generic이라는 개념을 다시 이야기하자면, 함수나 클래스를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 패러미터를 받아서 사용하는 방법이다. 다음과 같이 할 수 있다.
fun <Int> genericFunc(Param: T): T
class GenericClass <Int> (var pref: T)
T는 type을 의미하는데, 여기서는 Int로 지정했으니 알아서 Int로 모두 변환되어 컴파일된다. 따라서 casting 연산없이도 자료형을 사용할 수 있다.
Generic을 특정한 super class를 상속받은 클래스 타입으로만 제한하려면, <T: SuperClass>로 사용 가능하다. 실제로 Generic을 사용해보자.
📝 Generic을 클래스에서 사용하는 방법
fun main(args: Array<String>) {
UsingGeneric(A()).sleeping() // A가 잡니다
UsingGeneric(B()).sleeping() // B가 잡니다
UsingGeneric(B()).sleeping() // C가 잡니다
}
open class A {
open fun sleep() {
println("A가 잡니다")
}
}
class B: A() {
override fun sleep() {
println("B가 잡니다")
}
}
class C: A() {
override fun sleep() {
println("C가 잡니다")
}
}
class UsingGeneric<T: A> (val t: T) { // 제네릭 class임 T로 특정 클래스 타입을 지정하지 않았음
fun sleeping() {
t.sleep()
}
}
물론 위 코드에서 Generic을 사용하지 않고 UsingGeneric의 생성자에서 class UsingGeneric(val t: A)로 호출하여도 동작은 같겠지만, 위와 같이 Generic을 사용하면, 사용할 때 UsingGeneric이 자료형을 대체하게 되어 캐스팅을 방지할 수 있다. 그렇기 때문에 성능을 더 높일 수 있다.
📝 Generic을 함수에서 사용하는 방법
fun main(args: Array<String>) {
sleeping(A()) // A가 접니다.
sleeping(B()) // B가 접니다.
sleeping(C()) // C가 접니다.
}
fun <T:A> sleeping(t: T) {
t.sleep()
}
open class A {
open fun sleep() {
println("A가 잡니다")
}
}
class B: A() {
override fun sleep() {
println("B가 잡니다")
}
}
class C: A() {
override fun sleep() {
println("C가 잡니다")
}
}
이 역시 캐스팅 없이 함수에서 그대로 사용하는 것을 알 수 있다
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] null 값을 처리하는 방법과 변수의 동일성 체크 방법 (0) | 2021.12.08 |
---|---|
[Kotlin] List (0) | 2021.12.08 |
[Kotlin] 클래스의 다형성 (0) | 2021.12.07 |
[kotlin] 변수, 함수, 클래스의 접근범위와 접근제한자 (0) | 2021.12.06 |
[Kotlin] Kotlin의 기본 프로젝트 구조 (0) | 2021.12.06 |
- Total
- Today
- Yesterday
- 프로젝트구조
- 보조생성자
- 생성자
- Python
- 싸피5기
- 일반파라미터
- Java
- Programmers #알고리즘 #Python #KAKAOINTERNSHIP #비전공개발자 #불량사용자
- 백준 #숨박꼭질3 #다익스트라 #알고리즘 #비전공개발자 #풀스택 #웹개발 #앱개발 #안드로이드 #python
- 프로그래머스
- 앱개발
- 기본생성자
- 비전공개발자
- 백준알고리즘 #BFS #델타이동 #알고리즘풀이 #개발 #안전영역 #풀스택개발자가되고싶습니다. #노력할래요 # 꾸준히 # 화이팅! #비전공개발자
- 비전공싸피합격
- 중첩클래스와 내부클래스
- DP
- kotlin문법
- 안드로이드 #안드로이드스튜디오 #Kotlin #앱개발 #안드로이드기초 #비전공개발자 #풀스택개발자 #앱개발자
- Java #객체지향 #상속 #생성자 #개념 #비전공개발자 #FullStack을 #향해
- 구간 합 구하기 4
- 알고리즘
- 참조연산자
- 백준
- 코틀린
- Class
- 카카오
- Kotlin
- 추가합격후기
- 안드로이드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |