[Java] Generic Class
by youngjun._.Generic이란?
Generic이란 Class 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법
Java에서 Collection은 List<T>
, Set<T>
, Map<T,T>
등의 방식으로 활용하였다. <>
를 사용해서 안에 들어가야할 T
는 Type
을 의미한다.
간단한 예시를 살펴보자.
class Generic_Test<T> {
var Generic_Data : T? = null
}
// main
class TestCode {
@Test
fun Test1(){
var test1 = Generic_Test<String>()
test1.Generic_Data = "testdata"
println(test1.Generic_Data)
var test2 = Generic_Test<Int>()
test2.Generic_Data = 1234
println(test2.Generic_Data.toString())
}
}
// 결과
testdata
1234
Process finished with exit code 0
위 Code를 보면 Generic_Test
클래스의 타입은 로 설정되어있다.
그러므로 Generic_Test
를 사용할때는 외부에서 Type을 지정해주고 사용해야 한다!
변수 Generic_Data
는 Type
를 외부로부터 지정받아 사용하게 된다. 그렇기 때문에 test1
에서는 String을 지정받아 사용하였고test2
는 Int를 지정받아 사용하였다.
현재는 Type
을 1개를 지정해서 사용하였는데. 2개를 지정해서 사용하고 싶을 때에는 <T, T>
를 사용하면 된다.
Java의 Collection 에서는 Map<T, T>
이 2개의 타입을 지정해서 사용하는 경우이다.
class Generic_Test2<T1, T2> {
var Data_1 : T1? = null
var Data_2 : T2? = null
}
class TestCode {
@Test
fun Test2(){
val test3 = Generic_Test2<String, Int>()
test3.Data_1 = "Testdata2"
test3.Data_2 = 12345
println("${test3.Data_1}, ${test3.Data_2}")
}
}
// 결과
Testdata2, 12345
Process finished with exit code 0
위 Code 의 경우를 보면 T1
과 T2
를 사용하였다.
풀어서 설명하면 Type
를 2개를 사용하였고 T1
에는 String
을 T2
에는 Int
를 사용한 경우이다.
Generic
은 Method
에서도 사용할수 있다.
class TestCode{
@Test
fun Test3(){
println(Test3_Method("ABCD", 1234))
}
fun <T1, T2> Test3_Method(INPUT1 : T1, INPUT2 : T2) : Int = ( INPUT1.toString().length + INPUT2.toString().length )
}
// 결과
8
Process finished with exit code 0
위 Code를 보면 Test3_Method
라는 Method
를 사용할때 받아오는 Type
을 지정해주지 않았다. 그리고 Method
명을 선언하기 전에 <T1, T2>
라는 Generic
을 사용하였고 INPUT1
과 INPUT2
는 해당 Type
을 사용하게 된다.
Test_Method
는 어떠한 값이던 데이터의 Length
를 반환하게 된다.
"ABCD"
와 1234
의 Length
값은 각각 4
이므로 결과값은 8
이다.
E - Element
K - Key
N - Number
T - Type
V - Value
R - ReturnType
위 내용은 Generic
의 Parameter
이다.
위 내용을 따라서 Type
은 T
를 쓰지 않으면 에러가 발생하지는 않지만 이전의 라이브러리 등의 호환성이나 가독성을 위해서라면 따르는 것이 좋겠다.
Reference
'Back-End > Java' 카테고리의 다른 글
Java : Stream 문자열 배열 정렬(내림차순, compareTo 재구현) (0) | 2022.03.26 |
---|---|
[Java8] 인터페이스는 어떻게 변화했을까 (0) | 2021.11.19 |
[Java] Scanner 정리 (0) | 2020.10.28 |
[Maven] Nexus란? (0) | 2020.10.17 |
Maven이란? (설치 + IntelliJ 연동) (0) | 2020.10.15 |
블로그의 정보
개발하는만두
youngjun._.