Uknow's Lab.
article thumbnail

 

 

접근 제한자

접근 제한자는 클래스 외부에서 클래스, 프로퍼티, 메소드 등에 접근 권한을 제한 / 관리할 때 쓰입니다.

코틀린에서는 public internal, protected, private 4가지 키워드가 있습니다.

 

public(Default) : 이름처럼 아무나 접근할 수 있는 형태입니다.
private : 프라이빗이라는 이름처럼, 같은 파일(클래스) 내에서만 접근 가능합니다.
internal : 같은 모듈 내에서만 접근 가능합니다.
protected : 같은 클래스와 자식 클래스에서만 접근 가능합니다.

접근 제한자를 명시하지 않았을 경우, public이 디폴트로 지정됩니다.

 

이들간의 역할은 위와 같습니다.

 

 

Private

Private - 클래스와 프로퍼티, 메소드의 경우

class MyClass {
    private var a = 10

    private fun say() {
        println(a)
    }
}

fun main() {
    val myClass = MyClass()
    
    myClass.say() // 에러발생. private 이므로 접근 불가
    myClass.a = 3 // 에러발생. private 이므로 접근 불가
}

 

클래스의 멤버변수와 메소드가 private 일 때,

멤버변수와 클래스에 접근이 불가능 합니다. 클래스 내에서만 접근이 가능하지요.

 

Private - 클래스의 경우

- file1.kt

private class MyClass

private fun test() {
	println("a")
}

- file2.kt
fun main() {
	val myClass = MyClass() // 생성 불가!
	test() // 호출 불가!
}

 

코틀린과 자바에선 import를 통해 다른 파일에 정의된 클래스와 메소드를 가져와 사용할 수 있습니다.

하지만, private로 메소드와 클래스의 접근을 제어하면, 외부 파일에서 사용이 불가합니다.

 

 

Protected

open class MyClass {
    var a = 10
    private var b = 10
    protected var c = 10

    private fun say() {
        println(a)
    }
}

class MyChildClass : MyClass() {
    fun init() {
        a = 100 // public(default)는 외부에서 접근이 가능하며, 자식클래스 역시 접근 가능
        b = 1000 // 에러!!! private는 외부에서도, 자식 클래스에서도 접근이 불가
        c = 10000 // protect는 외부에서 접근이 불가하나, 자식 클래스에서는 접근이 가능함
    }
}

fun main() {
    val myChildClass = MyChildClass()
    myChildClass.a = 10 // public에서는 외부에서 접근 가능
    myChildClass.b = 100 // 에러!!! private는 외부에서 접근 불가
    myChildClass.c = 1000 // 에러!!! protected는 외부에서 접근 불가, 자식 클래스에서 접근 가능
}

 

protect는 자기 자신과 자식 클래스에서만 접근이 가능하도록 제한하는 키워드 입니다.

외부에서는 접근이 불가능 하며, 자기 자신과 상속을 받은 클래스만 접근이 가능하지요.

 

 

internal

internal은 자바에는 없었지만, 코틀린에서 새로 생긴 접근 제한자로싸,

같은 모듈 안이라면 접근이 가능하게 하는 접근 제한자입니다.

코틀린에서 모듈이란,

  • IntelliJ IDEA 모듈
  • Maven / Gradle 프로젝트
  • 하나의 Ant 태스크 내에서 함께 컴파일되는 파일들

로 정의하고 있습니다.

 

 

 

코틀린의 접근 제한자의 범위는 public(default) > protected/internal / private 입니다.

 

 

부록. 외부에서 접근을 막을 필요가 있나?

클래스의 메소드와 프로퍼티는 클래스 고유의 속성입니다.

이들은 외부로 유출되거나 외부에서 접근(사용)이 가능하다면,

보안상의 허점 혹은 시스템의 예기치 못한 동작을 유발할 수 있습니다.

 

객체의 속성과 행위를 하나로 묶고, 이를 감추어 은닉한다.

이는 객체지향 프로그래밍의 핵심 원리 중 하나인

캡슐화(Encapsulation)와 정보 은닉(Infomation Hiding) 입니다.

 

객체지향의 다른 요소들인 모듈화, 응집도, 독립성, 결합도와도 관련이 있습니다.

 

자유롭게 이용할 수 있는 메소드의 경우, 유지보수 할 때 이 메소드가 변경된다면,

외부에서 이 메소드를 이용하고 있는 코드부분도 모두 변경되어야 합니다.

 

하지만, 접근 제한자를 이용해 외부로부터 접근을 막고,

클래스 내부에 종속되어 (캡슐화) 사용된다면?

클래스 내부의 코드만 수정하면 되므로 유지보수가 원활해지게 됩니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.