Kotlin의 가시성 수정자
Kotlin에서 가시성 수정자(visibility modifiers)는 코드의 캡슐화와 접근 제어를 위한 핵심 기능입니다.
이 가이드에서는 Kotlin의 가시성 수정자에 대해 상세히 알아보겠습니다.
가시성 수정자 기본 (Visibility Modifiers Basics)
Kotlin에는 네 가지 가시성 수정자가 있습니다: private
, protected
, internal
, public
. 기본 가시성은 public
입니다.
이 수정자들은 클래스, 객체, 인터페이스, 생성자, 함수, 프로퍼티 및 그 세터에 적용될 수 있습니다. 게터는 항상 해당 프로퍼티와 동일한 가시성을 가집니다.
패키지 레벨 선언 (Package-Level Declarations)
함수, 프로퍼티, 클래스, 객체, 인터페이스는 패키지 내에서 "최상위 레벨"로 직접 선언될 수 있습니다:
// 파일 이름: example.kt
package foo
fun baz() { ... }
class Bar { ... }
패키지 레벨 선언에 대한 가시성 규칙:
public
(기본): 어디서나 볼 수 있음private
: 선언을 포함하는 파일 내에서만 볼 수 있음internal
: 같은 모듈 내에서 볼 수 있음protected
: 패키지 레벨 선언에는 사용 불가
예시:
// 파일 이름: example.kt
package foo
private fun foo() { ... } // example.kt 내에서만 볼 수 있음
public var bar: Int = 5 // 프로퍼티는 어디서나 볼 수 있음
private set // 세터는 example.kt 내에서만 볼 수 있음
internal val baz = 6 // 같은 모듈 내에서 볼 수 있음
클래스 멤버 (Class Members)
클래스 내에서 선언된 멤버에 대한 가시성 규칙:
private
: 해당 클래스 내에서만 볼 수 있음protected
:private
와 동일하지만 하위 클래스에서도 볼 수 있음internal
: 같은 모듈 내에서 선언 클래스를 볼 수 있는 모든 클라이언트가internal
멤버를 볼 수 있음public
: 선언 클래스를 볼 수 있는 모든 클라이언트가public
멤버를 볼 수 있음
주의할 점은 Kotlin에서 외부 클래스가 내부 클래스의 private 멤버를 볼 수 없다는 것입니다.
예시:
open class Outer {
private val a = 1
protected open val b = 2
internal open val c = 3
val d = 4 // 기본적으로 public
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a는 보이지 않음
// b, c, d는 보임
// Nested와 e는 보임
override val b = 5 // 'b'는 protected
override val c = 7 // 'c'는 internal
}
class Unrelated(o: Outer) {
// o.a, o.b는 보이지 않음
// o.c와 o.d는 보임 (같은 모듈)
// Outer.Nested는 보이지 않고, Nested::e도 보이지 않음
}
생성자 (Constructors)
클래스의 주 생성자 가시성을 지정하려면 다음 구문을 사용합니다:
class C private constructor(a: Int) { ... }
여기서 생성자는 private
입니다. 기본적으로 모든 생성자는 public
입니다.
로컬 선언 (Local Declarations)
로컬 변수, 함수, 클래스는 가시성 수정자를 가질 수 없습니다.
모듈 (Modules)
internal
가시성 수정자는 멤버가 같은 모듈 내에서 볼 수 있음을 의미합니다. 모듈은 함께 컴파일되는 Kotlin 파일의 집합입니다. 예를 들어:
- IntelliJ IDEA 모듈
- Maven 프로젝트
- Gradle 소스 셋 (단,
test
소스 셋은main
의 internal 선언에 접근 가능) - 하나의
<kotlinc>
Ant 태스크 호출로 컴파일된 파일 집합
Kotlin의 가시성 수정자는 코드의 캡슐화와 접근 제어를 세밀하게 관리할 수 있게 해줍니다. 이를 통해 코드의 안정성을 높이고, 불필요한 의존성을 줄일 수 있습니다. 특히 internal
수정자는 모듈 내부 구현을 숨기면서도 필요한 경우 접근할 수 있게 해주어, 대규모 프로젝트에서 매우 유용합니다.
가시성 수정자를 적절히 사용하면 코드의 구조를 더 명확히 하고, 유지보수성을 향상시킬 수 있습니다. 그러나 과도한 제한은 코드의 유연성
이 블로그의 다른 글 :
2024.08.10 - [개발&프로그래밍] - [Kotlin] 조건문과 반복문
[Kotlin] 조건문과 반복문
Kotlin의 조건문과 반복문Kotlin은 다양한 조건문과 반복문을 제공하여 프로그래머가 효율적이고 읽기 쉬운 코드를 작성할 수 있게 합니다. 이 가이드에서는 Kotlin의 주요 제어 흐름 구조를 살펴보
observerlife.tistory.com
2024.08.10 - [개발&프로그래밍] - [kotlin] 타입 체크와 캐스팅
[kotlin] 타입 체크와 캐스팅
Kotlin의 타입 체크와 캐스팅Kotlin에서 타입 체크와 캐스팅은 객체 지향 프로그래밍의 핵심 기능입니다. 이 가이드에서는 Kotlin의 타입 체크와 캐스팅 기능을 모든 코드 예제와 함께 상세히 살펴보
observerlife.tistory.com
2024.08.10 - [개발&프로그래밍] - [Kotlin] 숫자 타입과 연산 가이드
[Kotlin] 숫자 타입과 연산 가이드
Kotlin의 숫자 타입과 연산 가이드Kotlin에서 숫자를 다루는 방법과 관련된 다양한 개념을 살펴봅니다. 정수 타입 (Integer types)Kotlin은 숫자를 표현하기 위한 내장 타입 세트를 제공합니다. 정수의
observerlife.tistory.com
2024.08.10 - [개발&프로그래밍] - [kotlin] 코딩 컨벤션 - lambdas, Trailing commas
[kotlin] 코딩 컨벤션 - lambdas, Trailing commas
Kotlin 코딩 컨벤션 가이드Kotlin을 사용하여 더 깔끔하고 일관된 코드를 작성하기 위한 고급 코딩 컨벤션을 소개합니다.아래글은 공식 홈페이지를 참고하였습니다.https://kotlinlang.org/docs/coding-convent
observerlife.tistory.com
2024.08.09 - [개발&프로그래밍] - [kotlin] 자주 사용되는 관용구(idiom) 모음
[kotlin] 자주 사용되는 관용구(idiom) 모음
이 글은 Kotlin 프로그래밍 언어에서 자주 사용되는 관용구(idiom)들의 모음입니다.각 관용구에 대한 설명과 예제 코드를 함께 설명합니다.공식 홈페이지 kotlinlang.org의 내용을 참고합
observerlife.tistory.com
2024.08.07 - [개발&프로그래밍] - [kotlin] 입문시 알아야 할 8가지 핵심 문법
[kotlin] 입문시 알아야 할 8가지 핵심 문법
Kotlin의 주요 문법 특징들을 간략히 정리한 것입니다.각 항목은 Kotlin의 간결하고 표현력 있는 코드 작성을 지원하는 특징들을 보여줍니다. 아래 문서는 kotlinlang.org 공식 홈페이지를 참조합니다.
observerlife.tistory.com
2024.08.07 - [개발&프로그래밍] - [kotlin] 입문시 알아야 할 7가지 핵심 문법
[kotlin] 입문시 알아야 할 7가지 핵심 문법
Kotlin의 기본적인 문법 요소들을 간략하게 설명하고 있습니다.각 항목은 Kotlin 프로그래밍의 기초를 이해하는 데 중요한 개념들을 포함하고 있습니다. 아래 문서는 kotlinlang.org 공식 홈페이지를
observerlife.tistory.com
Kotlin, 가시성수정자, 접근제어, 캡슐화, private, protected, internal, public, 패키지레벨선언, 클래스멤버, 생성자가시성, 모듈, 안드로이드개발, 서버개발, 코드구조화
'개발&프로그래밍' 카테고리의 다른 글
[kotlin] 데이터 클래스(Data classes) (0) | 2024.08.14 |
---|---|
[kotlin] 확장 기능(Extensions) (0) | 2024.08.14 |
[kotlin] 인터페이스(interface) (0) | 2024.08.13 |
[kotlin] 프로퍼티(Properties) (0) | 2024.08.13 |
[kotlin] 상속(inheritance) (0) | 2024.08.13 |
댓글