# 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