Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[14일차 Kotlin] 접근제한자 본문

Computer/Kotlin

[14일차 Kotlin] 접근제한자

Wise-99 2023. 5. 16. 08:57

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 접근제한자란?

  • 객체가 가지고 있는 변수는 연산자를 통해 자유롭게 접근이 가능하다.
  • 만약 변수에 담기는 값이 어떠한 조건이 있을 경우 외부에서 자유롭게 접근할 수 있다면 엉뚱한 값이 저장될 가능성이 있다.
  • 이에 변수나 메서드의 접근 권한을 설정할 수 있는 접근 제한자를 제공하고 있으며 클래스를 설계하는 개발자가 각 변수나 메서드의 접근 권한을 설정해 오동작 하는 것을 사전에 막을 수 있게 한다.

동작원리

  • Kotlin에서는 클래스의 정의한 모든 변수는 Java코드로 변경될 때 private가 설정된다.
  • 접근 제한자의 종류에 따라 Java 코드로 변경될 때 getter 메서드 추가 여부가 결정된다.

 


 

📖 클래스의 접근제한자

  • private : 외부에서 객체를 생성할 수 없다.
  • public : 외부에서 객체를 생성할 수 있다(기본).
  • protected : 클래스에 지정할 수 없다.
  • internal  : 모듈 같을 경우에만 객체를 생성할 수 있다.

 

✔️ 예제 코드

같은 파일에 있는 클래스

fun main() {
    val a1 = PrivateClass1()
    val a2 = PublicClass1()
    val a3 = InternalClass1()
    println("a1 : $a1")
    println("a2 : $a2")
    println("a3 : $a3")
}

private class PrivateClass1

public class PublicClass1

protected class ProtectedClass1 <<< 오류 발생

internal class InternalClass1

✔️코드 해석

  • 같은 파일에 있는 클래스들은 제약없이 사용이 가능하다.
  • 클래스에는 protected 설정이 불가능하다.

같은 패키지 다른 파일

kotlin/TestFile1.kt

private class PrivateClass2
public class PublicClass2
internal class InternalClass2

 

kotlin/Main.kt

fun main(){
    val b1 = PrivateClass2() <<< 오류 발생
    val b2 = PublicClass2()
    val b3 = InternalClass2()

    println("b2 : $b2")
    println("b3 : $b3")
}

✔️ 코드 해석

  • private 클래스는 외부에서 사용이 불가능하여 오류가 발생한다.

다른 패키지 다른 파일

kotlin/com.test.pkg1/TestFile2.kt

package com.test.pkg1

private class PrivateClass3
public class PublicClass3
internal class InternalClass3

 

kotlin/Main.kt

import com.test.pkg1.InternalClass3
import com.test.pkg1.PublicClass3

fun main(){
    val c1 = PrivateClass3() <<< 오류 발생
    val c2 = PublicClass3()
    val c3 = InternalClass3()
    println("c2 : $c2")
    println("c3 : $c3")
}

모듈이 다른 경우

TestModule/com.test.pkg2/TestFile2.kt

package com.test.pkg2

private class PrivateClass4
public class PublicClass4
internal class InternalClass4

 

kotlin/Main.kt

import com.test.pkg2.PublicClass4

fun main(){
    val d1 = PrivateClass4() <<< 오류 발생
    val d2 = PublicClass4()
    val d3 = InternalClass4() <<< 오류 발생
    print("d2 : $d2")
}

✔️ 코드 해석

  • internal 클래스는 모듈이 다르면 사용이 불가능하다.

 


 

📖 변수, 메서드의 접근제한자

  • private : 외부에서 접근할 수 없다.
  • public : 외부에서 접근이 자유롭다(기본).
  • protected : 상속관계일 경우에만 접근이 가능하다.
  • internal  : 모듈 같을 경우에만 접근이 가능하다.

 

📖 예제 코드

같은 모듈, 같은 패키지, 같은 파일의 객체를 생성하여 사용하는 경우

fun main(){
    val super1 = SuperClass1()
    println(super1.a1) <<< 오류 발생
    println(super1.a2)
    println(super1.a3) <<< 오류 발생
    println(super1.a4)
}

open class SuperClass1{
    private var a1 = 100
    public var a2 = 200
    protected var a3 = 300
    internal var a4 = 400
}

✔️ 코드 해석

  • kotlin에서는 자바로 변경될 때 모든 맴버 변수가 private 변수이다.
  • kotlin 에서 접근 제한자를 설정하면 Java로 변환될 때 setter/getter 생성에 대한 설정이 된다.
  • private 변수는 외부에서 접근할 수 없어 오류가 발생한다.
  • protected 변수는 상속관계에서만 접근할 수 있기 때문에 오류가 발생한다.

같은 모듈, 다른 패키지의 객체를 생성하여 사용하는 경우

kotlin/com.test.pkg1/TestFile2.kt

package com.test.pkg1

open class SuperClass2{
    private var b1 = 100
    public var b2 = 200
    protected var b3 = 300
    internal var b4 = 400
}

 

kotlin/Main.kt

import com.test.pkg1.SuperClass2

fun main(){
    val super2 = SuperClass2()
    println(super2.b1) <<< 오류 발생
    println(super2.b2)
    println(super2.b3) <<< 오류 발생
    println(super2.b4)
}

다른 모듈의 객체를 생성하는 경우

TestModule/com.test.pkg2/TestFile2.kt

package com.test.pkg2

open class SuperClass3{
    private var c1 = 100
    public var c2 = 200
    protected var c3 = 300
    internal var c4 = 400
}

 

kotlin/Main.kt

import com.test.pkg2.SuperClass3

fun main(){
    val super3 = SuperClass3()
    println(super3.c1) <<< 오류 발생
    println(super3.c2)
    println(super3.c3) <<< 오류 발생
    println(super3.c4) <<< 오류 발생
}

 


 

📖 상속 관계

같은 모듈, 같은 패키지, 같은 파일, 상속 하는 경우

open class SuperClass1{
    private var a1 = 100
    public var a2 = 200
    protected var a3 = 300
    internal var a4 = 400
}

class SubClass1 : SuperClass1(){

    fun subMethod1(){
        print(a1) <<< 오류 발생
        print(a2)
        print(a3)
        print(a4)
    }
}

같은 모듈, 다른 패키지를 상속하는 경우

kotlin/com.test.pkg1/TestFile2.kt

package com.test.pkg1

open class SuperClass2{
    private var b1 = 100
    public var b2 = 200
    protected var b3 = 300
    internal var b4 = 400
}

 

kotlin/Main.kt

import com.test.pkg1.SuperClass2

class SubClass2 : SuperClass2(){
    fun subMethod2(){
        print(b1) <<< 오류 발생
        print(b2)
        print(b3)
        print(b4)
    }
}

다른 모듈을 상속하는 경우

TestModule/com.test.pkg2/TestFile2.kt

package com.test.pkg2

open class SuperClass3{
    private var c1 = 100
    public var c2 = 200
    protected var c3 = 300
    internal var c4 = 400
}

 

kotlin/Main.kt

import com.test.pkg2.SuperClass3

class SubClass3 : SuperClass3(){
    fun subMethod3(){
        println(c1) <<< 오류 발생
        println(c2)
        println(c3)
        println(c4) <<< 오류 발생
    }
}