Kotlin Programming

์ฝ”ํ‹€๋ฆฐ ์ ‘๊ทผ์ œ์–ด์ž์™€ ์ž๋ฐ” ์ ‘๊ทผ ์ œ์–ด์ž ์ฐจ์ด

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2024. 11. 27.

์ฝ”ํ‹€๋ฆฐ๊ณผ ์ž๋ฐ”์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์Šทํ•œ ๊ฐœ๋…์„ ๊ณต์œ ํ•˜์ง€๋งŒ, ์„ธ๋ถ€์ ์œผ๋กœ๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

Kotlin ๊ณผ Java ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ๋‹น์—ฐํžˆ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์œผ๋ฉด ์ด ๊ธ€์„ ๋ณด๊ณ  ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด์ž

 

์ ‘๊ทผ ์ œ์–ด์ž ์ฝ”ํ‹€๋ฆฐ ์ž๋ฐ”
public ๊ธฐ๋ณธ ์ ‘๊ทผ ์ œ์–ด์ž (๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด public)
๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
internal ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (internal์€ ์ฝ”ํ‹€๋ฆฐ ๊ณ ์œ ) ์—†์Œ
protected ์„ ์–ธ๋œ ํด๋ž˜์Šค ๋ฐ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋™์ผํ•œ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ  (ํ•˜์œ„ ํด๋ž˜์Šค๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
default ์—†์Œ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ œ์–ด์ž (๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด default
๋™์ผํ•œ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
private ์„ ์–ธ๋œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์„ ์–ธ๋œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

1. ์ฝ”ํ‹€๋ฆฐ์˜ internal

internal (์ฝ”ํ‹€๋ฆฐ ์ „์šฉ)

  • ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“ˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ปดํŒŒ์ผ๋œ ๋‹จ์œ„(์˜ˆ: ํ•œ ๊ฐœ์˜ Gradle ๋ชจ๋“ˆ)๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ์—†์œผ๋ฉฐ, ๋Œ€์‹  internal์ด ๊ทธ ์—ญํ• ์„ ํ•œ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ internal ์ ‘๊ทผ ์ˆ˜์ค€์„ JVM ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ  public์œผ๋กœ ๋ณ€ํ™˜๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ํŠน์ˆ˜ํ•œ ์ด๋ฆ„ ๋ณ€ํ™˜( Name Mangling)์„ ํ†ตํ•ด ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์•ˆ ๋œ๋‹ค๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. ์ž๋ฐ”์—์„œ ์ ‘๊ทผ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋ฆ„์ด ๋งน๊ธ€๋ง๋˜์–ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ์‹œ

internal class Internal {
    val publicField = "public field"
    internal val internalField = "internal field"

    fun publicMethod() {
        println("public method")
    }

    internal fun internalMethod() {
        println("internal method")
    }
}

callee ๋ชจ๋“ˆ์— ์œ„์™€ ๊ฐ™์€ ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

 

์ถœ์ฒ˜: https://wanjuuuuu.tistory.com/entry/Kotlin-internal-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90

 

๋‹ค๋ฅธ ๋ชจ๋“ˆ(caller)์—์„œ, ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์—์„œ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ชจ๋“ˆ์ด ๋‹ค๋ฅด๋‹ค๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค.

๋˜‘๊ฐ™์ด ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ์ฝ”ํ‹€๋ฆฐ ํด๋ž˜์Šค๋ฅผ ์ ‘๊ทผํ•˜๊ฒŒ๋˜๋ฉด ๊ฐ™์€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

 

 

ํ•˜์ง€๋งŒ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋นŒ๋“œ๋œ๋‹ค. ๋นŒ๋“œ์‹œ internal ํด๋ž˜์Šค๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋  ๋•Œ public ํด๋ž˜์Šค๋กœ ๋ฐ”๋€Œ์–ด ๋นŒ๋“œ๋˜๊ธฐ์— ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

public ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ ๋˜ํ•œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

internal field์™€ internal method์„ ์ ‘๊ทผํ•˜๋ ค๊ณ ํ•˜๋ฉด ์ด๋ฆ„์ด ๋ฐ”๋€Œ์–ด์ ธ์žˆ๋‹ค. ์œ„์—์„œ ๋งํ•œ Name Mangling ๋•Œ๋ฌธ์ด๋‹ค. internalMethod$callee()๋“  getInernalField$callee()๋“  ๋ถ€๋ฅด๋”๋ผ๋„ ๋นŒ๋“œ๋Š” ๋œ๋‹ค.

 

2. ์ฝ”ํ‹€๋ฆฐ์—์„œ protected ์™€ ์ž๋ฐ”์—์„œ protected

 

์ฝ”ํ‹€๋ฆฐ protected : ์„ ์–ธ๋œ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

์ž๋ฐ” protected   : ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , ์„œ๋ธŒ ํด๋ž˜์Šค๋ผ๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Kotlin

open class Parent {
    protected fun greet() {
        println("Hello from Parent")
    }
}

class Child : Parent() {
    fun childGreet() {
        greet() // ๊ฐ€๋Šฅ
    }
}

// greet()์€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

 

Java

package com.example;

public class Parent {
    protected void greet() {
        System.out.println("Hello from Parent");
    }
}

package com.example;

public class Child extends Parent {
    public void childGreet() {
        greet(); // ๊ฐ€๋Šฅ
    }
}

package com.example;

public class AnotherClass {
    public void test() {
        Parent parent = new Parent();
        parent.greet(); // ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅ
    }
}

 

 

'Kotlin Programming' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ฝ”ํ‹€๋ฆฐ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ...  (0) 2024.09.17

๋Œ“๊ธ€