kotlin internal class

2025. 10. 19. 22:42·Tech/Spring

kotlin의 internal은 같은 모듈 내에서만 접근 가능한 가시성 제한자

 

Kotlin의 가시성 제한자

public    // 어디서나 접근 가능 (기본값)
private   // 같은 파일/클래스 내에서만
protected // 같은 클래스와 서브클래스에서만
internal  // 같은 모듈 내에서만

 

1. 모듈 단위 캡슐화

// Module A (core 모듈)
internal class DatabaseHelper {
    internal fun connect() { }
}

internal val config = Config()

// Module A 내 다른 파일에서
val helper = DatabaseHelper() // ✅ OK
helper.connect()              // ✅ OK

// Module B (api 모듈)에서
val helper = DatabaseHelper() // ❌ 컴파일 에러

 

Java와의 차이

Java에는 internal이 없습니다. Java의 package-private(default)과 비슷하지만 더 강력

// 같은 패키지 내에서만 접근 가능
class Helper{}

// 같은 모듈 내에서만 접근 가능
internal calss Helper

 

 

실무 활용 예시

예시 1: 유틸리티 클래스 숨기기

// payment-service 모듈
// StringUtils.kt
internal object StringUtils {
    fun sanitize(input: String): String {
        // 내부 구현
    }
}

// payment-service 모듈
// UserService.kt (같은 모듈)
class UserService {
    fun createUser(name: String) {
        val sanitized = StringUtils.sanitize(name) // ✅ OK
    }
}

// order-service 모듈에서
class OrderService(
    private val paymentService: PaymentService  // ✅ 사용 가능
) {
    fun checkout() {
        paymentService.processPayment("1234-5678", 10000)
        
        // ❌ 직접 암호화 불가 (internal이라 접근 불가)
        // StringUtils.encrypt("1234")
        
        // ❌ 직접 검증 불가 (internal이라 접근 불가)
        // StringUtils().validateCard("1234")
    }
}

 

 

예시 2: 구현체 숨기고 인터페이스만 공개

// 공개 인터페이스
interface PaymentProcessor {
    fun process(amount: Int)
}

// 내부 구현체들
internal class KakaoPayProcessor : PaymentProcessor {
    override fun process(amount: Int) { }
}

internal class NaverPayProcessor : PaymentProcessor {
    override fun process(amount: Int) { }
}

// 팩토리만 공개
object PaymentFactory {
    fun create(type: String): PaymentProcessor {
        return when(type) {
            "kakao" -> KakaoPayProcessor()
            "naver" -> NaverPayProcessor()
            else -> throw IllegalArgumentException()
        }
    }
}

 

 

예시 3: Spring Boot에서 활용

// 도메인 모듈
internal class UserValidator {
    fun validate(user: User): Boolean { }
}

@Service
class UserService(
    private val userValidator: UserValidator // ✅ 같은 모듈이므로 주입 가능
) {
    fun register(user: User) {
        require(userValidator.validate(user))
        // ...
    }
}
```

## 모듈이란?

Gradle/Maven 기준:
- 하나의 **Gradle/Maven 프로젝트** = 하나의 모듈
- IntelliJ 모듈
- 하나의 **JAR** 파일
```
project/
├── core/          # 모듈 1
│   └── build.gradle.kts
├── api/           # 모듈 2
│   └── build.gradle.kts
└── settings.gradle.kts

 

 

언제 사용할까?

internal 사용

- 모듈 내부 구현체를 숨기고 싶을 때

- 유틸리티 클래스를 외부에 노출하고 싶지 않을 때

- 멀티모듈 프로젝트에서 모듈 간 결합도를 낮추고 싶을 때

- 모듈의 공개 API와 내부 구현을 명확히 분리

 

public 사용

- 다른 모듈에서 사용해야 하는 API

- 라이브러리의 공개 인터페이스

 

 

저작자표시 (새창열림)

'Tech > Spring' 카테고리의 다른 글

스프링 부트 3.2에서 docker-compose.yml와 연결하여 TestContainers를 설정하는 방법 (with Mysql)  (0) 2024.07.23
SpringBoot 커스텀 프로퍼티에 대한 문서와 자동완성 ※ Spring Configuration Processor  (1) 2024.04.17
2개 이상의 DB를 사용하는 Spring Boot 환경에서 Spring Data Jpa 사용시 트랜잭션 관련 에러  (1) 2023.01.29
요청으로 들어온 language 값에 따른 GlobalExceptioner에서 다국어 처리 (i18n, yml) + spring validaiton 다국어처리  (1) 2022.05.23
Validation 클래스 단위 제약과 조건부 검사 설정  (0) 2021.12.22
'Tech/Spring' 카테고리의 다른 글
  • 스프링 부트 3.2에서 docker-compose.yml와 연결하여 TestContainers를 설정하는 방법 (with Mysql)
  • SpringBoot 커스텀 프로퍼티에 대한 문서와 자동완성 ※ Spring Configuration Processor
  • 2개 이상의 DB를 사용하는 Spring Boot 환경에서 Spring Data Jpa 사용시 트랜잭션 관련 에러
  • 요청으로 들어온 language 값에 따른 GlobalExceptioner에서 다국어 처리 (i18n, yml) + spring validaiton 다국어처리
소프
소프
  • 소프
    기회는 찬스
    소프
  • 전체
    오늘
    어제
    • 분류 전체보기 (138) N
      • Language (20)
        • Java (19)
        • Design Pattern (1)
      • Tech (27)
        • Spring (19)
        • JPA (3)
        • QueryDSL (1)
        • Gradle (4)
      • 개발 생각 (1)
      • IT Book (0)
        • 자바_스프링 개발자를 위한 실용주의 프로그래밍 (0)
      • Database (4)
        • Mysql (4)
        • Redis (0)
      • 네트워크 (1)
      • 운영체제 (2)
      • IDE (12)
        • Intellij (9)
        • vscode (2)
        • datagrip (1)
      • 인프라 (11)
        • Docker (2)
        • Jenkins (7)
        • Github Actions (1)
        • GCP (1)
      • 형상관리 (2)
        • gitlab (2)
        • git (0)
      • 외부활동 (44)
        • CS 면접 끝장내기 - 데이터베이스 1기 (5)
        • CS 면접 끝장내기 - 컴퓨터 네트워크 2기 (5)
        • CS 면접 끝장내기 - 자바 2기 (0)
        • TDD, 클린 코드 with Java 17기 (7)
        • ATDD, 클린 코드 with Spring 8기 (6)
        • 루퍼스 2기 (21)
      • 프로젝트 (0)
      • 회고 (6)
      • 기타 (1)
        • 제미니의 개발 실무 (0)
  • 블로그 메뉴

    • 홈
    • Github
    • LinkedIn
    • 방명록
  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
소프
kotlin internal class
상단으로

티스토리툴바