# Generic์ด๋ž€?

img

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

Last Updated: 6/18/2023, 2:13:15 PM