반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- java
- express
- script
- node
- php변수
- 조건문
- php
- 스나이퍼팩토리
- Flow
- Coroutine
- 코틀린
- 정보처리기사
- php개발
- 변수
- ios
- jquery
- node.js
- Flutter
- kotlin2.0
- 서버
- 그림으로 배우는 서버구조
- SwiftUI
- 플러터
- kotlininaction
- android
- Eclipse
- 설치
- Kotlin
- 스터디
- 이클립스
Archives
- Today
- Total
mygomii
[Kotlin] 4.1 클래스 계층 정의 본문
반응형
- 코틀린 가시성/접근 변경자는 자바와 비슷하지만 아무것도 지정하지 않을 경우의 기본 가시성은 다름
- 코틀린에 새로 도입한 sealed 변경자를 설명할거임
- sealed 는 클래스 상속이나 인터페이스 구현을 제한함
4.1.1 코틀린 인터페이스
- 코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있음
- 다만, 인터페이스에는 아무런 상태도 들어갈 수 없음
interface Clickable {
fun click()
}
- 이 코드는 click 이라는 추상 메서드가 있는 인터페이스를 정의
- 예를 들어 버튼을 클릭할 . 수있게 만들려면 클래스 선언에서 클래스 이름 뒤에 콜론을 표시하고 그 뒤에 인터페이스 이름을 넣고 click 함수의 구현을 제공해야함
class Button: Clickable {
override fun click() = println("I was clicked")
}
fun main() {
Button().click()
// I was clicked
}
4.1.2 open, final, abstract 변경자: 기본적으로 final
- 기본적으로 코틀린 클래스에 대해 하위 클래스를 만들수 없고, 기반 클래스의 메서드를 하위 클래스가 오버라이드할 수도 없음 → 즉 코틀린에서 모든 클래스와 메서드는 기본적으로 final 임
- 자바는 final 로 명시적으로 지정하지 않는 . 한모든 클래스를 다른 클래스가 상속할 수 있고, 오버라이드도 가능 → 코틀린은 자바 방식이 편리할 수도 있지만 문제가 될수 있기에 이런 접근 방법을 사용하지 않음
- **취약한 기반 클래스**라는 문제는 기반 클래스 구현을 변경함으로써 하위 클래스가 잘못된 동작을 하게되는 경우를 뜻함
- 어떤 클래스가 자신을 상속하는 방법에 대해 정확한 규직을 제공하지 않는다면 그 클래스의 클라이언트는 기반 클래스를 작성한 사람의 의도와 다른 방식으로 메서드를 오버라이드할 위험이 있음
- 유명한 책인 이펙티브 자바에서는 “상속을 위한 설계와 문서를 갖춰라 그럴 수 없다면 상속을 금지하라” 라는 조언이 있음 ⇒ 이는 특별히 하위 클래스에서 오버라이드하도록 의도된 클래스와 메서드가 아니라면 모두 final 로 만들라는 뜻
⇒ 코틀린도 마찬가지로 철학을 따르면서, 클래스와 메서드는 기본적으로 final 임
- 어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야함
- 클래스를 abstract 로 선언할 수도 있음, abstract 로 선언한 추상 클래스는 인스턴스화 할 수 없음
- 추상 클래스에는 구현이 없어 하위 클래스에서 오버라이드해야만하는 추상 멤버가 있는 것이 보통, 추상 멤버는 항상 열려있음, 따라서 추상 멤버 앞에 open 변경자를 명시할 필요 없음
4.1.3 가시성 변경자: 기본적으로 공개
- 가시성 변경자 는 코드 기반에 있는 선언에 대한 클래스 외부 접근을 제어함
- 코틀린은. public protected private 변경자를 제공
- 코틀린에서 아무 변경자도 없는 선언은 모두 공개, 즉 public 임
- 모듈안으로만 한정된 가시성을 위해 코틀린은 internal 이라는 가시성을 제공, 모듈은 함께 컴파일되는 코틀린 파일의 집합
- 코틀린에서는 최상위 선언에 대해 private 가시성을 허용
4.1.4 내부 클래스와 내포된 클래스: 기본적으로 내포 클래스
- 자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있음
- 클래스안에 다른 클래스를 선언하면 도우미 클래스를 캡슐화하거나 코드 정의를 그 코드를 사용하는 곳 가까이에 두고 싶을때 유용
- 하지만 자바와 달리 nested class(내포 클래스) 는 명시적으로 요청하지 않는 한 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없음
4.1.5 봉인된 클래스: 확장이 제한된 클래스 계층 정의
- sealed class(봉인된 클래스) 는 코틀린에서 클래스 계층의 확장을 제한하기 위해 사용되는 특수한 클래스
- 제한된 상속 : sealed class(봉인된 클래스)는 같은 파일 내에서만 하위 클래스를 정의할 수 있으므로, 미리 정해진 클래스 계층만 존재하게 됨
- 안전한 when 표현식 : 상속 계층이 제한되어 있기 때문에, when 식을 사용할 때 모든 경우를 쉽게 확인할 수 있어 컴파일러가 exhaustive(모든 경우를 처리함을 보장)검사를 수행할 수 있음
- 추상 클래스와 유사 : sealed class(봉인된 클래스)는 기본적으로 추상 클래스로 동작하며, 인스턴스를 직접 생성할 수 없음
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
fun handleResult(result: Result) {
when (result) {
is Success -> println("성공: ${result.data}")
is Error -> println("오류: ${result.message}")
}
}
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] 4.3 컴파일러가 생성한 메서드: 데이터 클래스와 클래스 위임 (0) | 2025.04.07 |
---|---|
[Kotlin] 4.2 뻔하지 않은 생성자나 프로퍼티를 갖는 클래스 선언 (0) | 2025.04.03 |
[Kotlin] 3.5 문자열과 정규식 다루기 (0) | 2025.04.01 |
[Kotlin] 3.6 코드 깔끔하게 다듬기: 로컬 함수와 확장 (0) | 2025.04.01 |
[Kotlin] 3.4 컬렉션 처리: 가변 길이 인자, 중위 함수 호출, 라이브러리 지원 (0) | 2025.03.26 |