[Kotlin] 접근제어

백현균·2023년 4월 16일

1. 자바와 코틀린의 가시성 제어

1) 자바에서의 접근제어

public: 모든 곳에서 접근
protected: 같은 패키지 혹은 하위클래스에서만 접근
default: 같은 패키지에서만 접근
private: 선언된 클래스내에서만 접근

2) 코틀린에서의 접근제어

public: 모든 곳에서 접근
protected: 선언된클래스, 하위클래스에서만 접근
	* 코틀린에서의 패키지는 namespace를 관리하기 위한 용도로만 사용
	  -> 영역만 나눔
internal: 같은 모듈에서만 접근
private: 선언된 클래스내에서만 접근

3) 자바에서는 기본접근제어지시어 default 코틀린에서는 public

2. 코틀린 파일의 접근제어

1) 코틀린 kt파일에 변수, 함수, 클래스 여러개를 바로 생성할 수 있음

* 즉, 한 파일안에 여러가지를 생성할 수 있음

// default로 public이 선언됨
val a = 3
fun add(a:Int, b:Int){
	return a+b
}

class Cat()

2) kt파일에서의 접근제어

public: 기본 값 어디서든 접근 
protected: kt파일에서는 사용 불가능, 클래스단위로만 사용가능
internal: 같은 모듈에서만 접근
private: 하나의 파일 내에서 접근 가능

3. 다양한 구성요소의 접근 제어

1) 클래스안의 멤버

public: 모든 곳에서 접근
protected: 선언된클래스, 하위클래스에서만 접근
	* 코틀린에서의 패키지는 namespace를 관리하기 위한 용도로만 사용
	  -> 영역만 나눔
internal: 같은 모듈에서만 접근
private: 선언된 클래스내에서만 접근

2) 생성자

* 생성자에 접근지시어를 사용하려면 constructor키워드 필요

open class Cat protected constructor(){
}

* 유틸형 클래스를 자바에 비해 쉽게 생성 가능

- 자바에서는 abstract + private키워드를 이용해, 유틸 클래스를 생성
- 코틀린에서는 유틸 kt파일을 만들어 그 안에 함수들만 생성
  -> 아래 예시 참조
// StringUtils.kt 생성 후 함수 작성
fun isDirectoryPayh(path:String):Boolean{
	return path.endsWith("/")
}

fun main(){
	// StringUtils파일을 컴파일하게 되면 StringUtilsKt 이름으로 
	사용 가능 -> 정적메소드처럼 사용가능
	StringUtilsKt.isDirectoryPayh("경로")
}

3. 프로퍼티

* val, var앞에 접근지시어를 한번에 명시 가능

private val name:String
internal val age:Int

* 프로퍼티 별로 접근지시어 명시 가능

var price = _price
	private set
-> get만 가능하며, set은 불가능함

4. 자바와 코틀린을 함께 사용할 경우 주의점

1) 자바코드에서는 코틀린 모듈의 internal코드를 가져올 수 있음

internal키워드는 컴파일 후 바이트코드상 public이 되므로 자바에서
코틀린모듈의 internal타입의 코드 접근이 가능

2) 코틀린의 protected와 자바의 protected는 다름

자바에서의 protected는 패키지 단위이기 때문에 같은 패키지에 있는 
kotlin proteced타입에 접근할 수 있음

5. 정리

1) 코틀린에서 패키지는 namespace관리용이므로 protected의 의미가 달라짐

2) 코틀린에서 default타입이 사라지고, 모듈간의 접근을 통제하는 internal이 생김

3) 생성자에 접근 지시어를 붙일 때 constructor를 명시해야됨

4) 유틸성 함수를 만들때는 파일 최상단을 사용하면 편함

5) 프로퍼티의 custom setter에 접근지시어를 쓸 수 있음

6) 자바에서 코틀린 코드를 사용할 때 internal과 protected는 사용에 주의해야됨

0개의 댓글