로컬에서는 잘 되는데 ☘️

[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._.

활동하기