로컬에서는 잘 되는데 ☘️

[Java] Generic Class

by youngjun._.

Generic이란?

Generic이란 Class 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법

Java에서 Collection은 List<T>, Set<T>, Map<T,T> 등의 방식으로 활용하였다. <>를 사용해서 안에 들어가야할 TType을 의미한다.

간단한 예시를 살펴보자.

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_DataType를 외부로부터 지정받아 사용하게 된다. 그렇기 때문에 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 의 경우를 보면 T1T2 를 사용하였다.

풀어서 설명하면 Type 를 2개를 사용하였고 T1 에는 StringT2 에는 Int 를 사용한 경우이다.


GenericMethod 에서도 사용할수 있다.

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 을 사용하였고 INPUT1INPUT2 는 해당 Type 을 사용하게 된다.

Test_Method 는 어떠한 값이던 데이터의 Length 를 반환하게 된다.

"ABCD"1234Length 값은 각각 4이므로 결과값은 8이다.

E - Element
K - Key
N - Number
T - Type
V - Value
R - ReturnType

위 내용은 GenericParameter 이다.

위 내용을 따라서 TypeT 를 쓰지 않으면 에러가 발생하지는 않지만 이전의 라이브러리 등의 호환성이나 가독성을 위해서라면 따르는 것이 좋겠다.

Reference

블로그의 프로필 사진

블로그의 정보

개발하는만두

youngjun._.

활동하기