[자바 개발자를 위한 코틀린 입문] 접근 제어 다루기
by dev.hardy코틀린에서 접근 제어를 다루는 방법
인프런에서 최태현 지식 공유자
님의자바 개발자를 위한 코틀린 입문
을 수강하며 정리한 내용 입니다.
하단에 강의 링크 있습니다.
자바와 코틀린의 가시성 제어
자바
- public : 모든 곳에서 접근 가능
- protected: 같은 패키지 또는 하위 클래스
- default: 같은 패키지
- private: 선언된 클래스내에서만
코틀린
- public: 모든 곳에서 접근 가능
- protected:
선언된
클래스 또는 하위 클래스에서만 접근 가능 internal
: 같은모듈
에서만 접근 가능- 모듈: 한 번에 컴파일 되는 코틀린 코드
- IDEA Module
- Maven Project
- Gradle Source Set
- Ant Task 의 호출로 컴파일 파일의 집합
- 모듈: 한 번에 컴파일 되는 코틀린 코드
- private: 선언된 클래스내에서만
😎 코틀린에서는 패키지를 namespace를 관리하기위한 용도이지 가시성 제어에는 사용되지 않음
자바 vs 코틀린
자바의 기본 접근 지시어: default
코틀린의 기본 접근 지시어: public
코틀린 파일의 접근 제어
코틀린 파일에는 여러개의 변수, 함수, 클래스등이 정의될 수 있다.
Kotlin 파일의 접근 제어
- public: 어디서든 접근할 수 있다.
- protected: 파일에는
사용 불가능
- internal: 같은 모듈에서만 접근 가능
- private: 같은 파일내에서만 접근 가능
다양한 구성요소의 접근 제어
- 클래스 안의 멤버
- public: 모든 곳에서 접근 가능
- protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능
- internal: 같은 모듈에서만 접근 가능
- private: 선언된 클래스 내에서만 접근 가능
- 생성자도 가시성 범위는 동일하다.
단, 생성자에 접근 지시어를 붙이려면, constructor를 써주어야 한다.
class Hardy internal constructor(
val name: String,
var age: Int
)
- 코틀린에서는 직접 파일에 유틸성 코드를 작성해서 사용하는게 편하다. (StringUtils.kt)
fun isDirectoryPath(path: String): Boolean {
return path.endsWith("/")
}
→ 바이트코드를 확인해보면 StringUtilsKt 라는 클래스 안에 isDirectoryPath가 정적메소드로 돼있는 것을 확인할 수 있다. 이렇게 되면 자바에서 사용을 할때 마치 정적 메소드가 있는 것처럼 사용할 수 있다.
public class AppMain {
public static void main(String[] args) {
StringUtilsKt.isDirectoryPath("///");
}
}
- 프로퍼티도 가시성 범위는 동일하다.
단, 프로퍼티의 가시성을 설정하는 방법은 두 가지가 있다.
internal val name: String // (1)
var age: Int? = 0
private set // (2)
(1) getter, setter 한 번에 접근 지시어를 정하는 것
(2) setter에만 추가로 가시성을 부여할 수 있다.
자바와 코틀린을 함께 사용할 때 주의할 점
- internal은 바이트 코드 상 public이 된다.
- 자바 코드에서는 코틀린 모듈의 internal 코드를 가져올 수 있다.
- 코틀린과 자바의 protected는 다르다.
- 자바는 같은 패키지의 코틀린 protected에 접근 가능하다.
Reference:
자바 개발자를 위한 코틀린 입문
블로그의 정보
개발자 하디 : 기록저장소
dev.hardy