안드로이드 개발자의 창고
[14일차 Kotlin] 접근제한자 본문
출처 : 안드로이드 앱스쿨 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) <<< 오류 발생
}
}
'Computer > Kotlin' 카테고리의 다른 글
[14일차 Kotlin] 지연 초기화 - lateinit과 lazy (0) | 2023.05.17 |
---|---|
[14일차 Kotlin] 캡슐화와 Property(프로퍼티) (0) | 2023.05.17 |
[14일차 Kotlin] 패키지(Package)와 모듈(Module) (0) | 2023.05.16 |
[14일차 Kotlin] 상속 (0) | 2023.05.16 |
[13일차 kotlin] init과 생성자(constructor) (0) | 2023.05.14 |