data class
- 데이터만 포함.
- 작업을 실행하는 메서드는 없다.
- Kotlin 컴파일러에서 특정 가정을 하고 일부 메서드를 자동으로 구현
- equals()
- hashCode(): 특정 컬렉션 유형을 사용할 때 이 메서드가 표시됩니다.
- toString()
- componentN(): 함수 호출 시 결과 값을 2개를 가져오려 할 때 (Pair<left, right>를 써도 되지만, 네이밍만 잘 명시하면 이게 더 좋음)
- copy()
Object
싱글턴 객체
컴패니언 객체
- Kotlin에서는 static 키워드가 없음.
- 대신 companion object를 사용해서 클래스 이름으로 접근할 수 있는 정적 멤버를 만들 수 있음.
- 해당 클래스의 동반 객체(=companion) 라는 의미고, 하나의 클래스에 하나만 존재
- 왜 필요해?
- 클래스 인스턴스를 만들지 않고도 메서드나 변수를 사용하고 싶을 때!
- Java의 static 함수나 변수처럼 사용하고 싶을 때
- 팩토리 메서드 패턴 (객체를 생성하는 역할) 만들 때
class MyUtils {
companion object {
const val TAG = "MyUtils"
fun printHello() {
println("안녕하세요!")
}
}
}
fun main() {
// 객체 생성 없이 바로 접근 가능!
println(MyUtils.TAG)
MyUtils.printHello()
}
object vs compainion object
항목 | object | companion object |
정의 | 클래스 바깥에 선언된 싱글톤 객체 | 클래스 안에 정의된 정적 멤버용 객체 |
사용 목적 | 전역 유틸, 싱글톤 패턴 | 클래스의 정적 멤버처럼 동작 |
접근 방식 | 객체 이름으로 직접 접근 | 클래스 이름으로 접근 |
클래스와 관계 | 클래스와 독립적 | 클래스와 강하게 연결됨 (동반 객체) |
Java에서 접근 | 객체 이름으로 접근 | 클래스의 static 멤버처럼 접근 가능 |
확장 속성
기존 클래스에 새로운 프로퍼티를 "외부에서" 추가하는 기능 단, 실제로 필드를 추가하는 것은 아니고, getter/setter 형식으로 동작. (자바스크립트의 prototype하고 비슷)
특징
- 실제 속성처럼 보이지만, Backing field(진짜 저장공간) 은 없다.
- 무조건 계산 기반 (get() 혹은 set())으로 동작.
- Java에서는 확장 속성 사용이 불가능. Kotlin에서만 가능.
문법
var 클래스이름.프로퍼티이름: 타입
get() = ...
set(value) { ... }
예제
val String.firstChar: Char
get() = this[0]
val name = "안드로이드"
println(name.firstChar) // '안'
확장 함수
기존 클래스에 새로운 함수를 "외부에서" 추가할 수 있게 해주는 기능이에요.
클래스 내부 코드를 수정하지 않고도 마치 원래 있던 함수처럼 사용 가능하죠!
- 내가 수정할 수 없는 라이브러리 클래스에 기능을 추가하고 싶을 때
- 유틸성 함수를 보기 좋게 확장 형태로 만들고 싶을 때
문법
fun 클래스이름.함수이름(매개변수): 반환타입 {
// this 키워드는 클래스의 인스턴스를 가리킴
return ...
}
예제
fun String.addSmile(): String {
return this + " 😊"
}
fun main() {
val msg = "안녕하세요"
println(msg.addSmile()) // 출력: 안녕하세요 😊
}
let
어떤 객체에 작업을 수행하고, 결과를 리턴하거나, null 체크와 함께 안전하게 실행하고 싶을 때 사용
val name = "Android"
name.let {
println(it.uppercase()) //ANDROID
}
언제 쓰면 좋은가?
상황 | 설명 |
null 이 아닐 때만 무언가 하고 싶을 때 | ?.let { ... } |
변수의 가공 결과를 연달아 처리할 때 | 체이닝 가능 |
임시로 특정 객체에 이름 붙이고 작업할 때 | it 사용 |
apply
자기 자신(this) 에 대해 여러 작업을 하고, 자기 자신을 반환하는 함수
예제
data class Person(var name: String, var age: Int)
val person = Person("unknown", 0).apply {
name = "chuck"
age = 30
}
println(person) // Person(name=chuck, age=30)
---
// TextView를 만들고 속성 설정까지 한 번에!
val textView = TextView(context).apply {
text = "Hello"
textSize = 20f
setTextColor(Color.BLACK)
}
fold
javascript 의 reduce
'IT > android' 카테고리의 다른 글
#6 나만 헷갈렸나? Jackpot Compose 테마 적용 (0) | 2025.05.20 |
---|---|
#5 나만 헷갈렸나? Jackpot Compose > LazyColumn, Icon (0) | 2025.05.19 |
#3 나만 헷갈렸나? Jackpot Compose > 스크롤, 여백, 키보드, 계측 테스트 (0) | 2025.05.16 |
#2 나만 헷갈렸나? Jackpot Compose > 재구성, wrapContentSize (0) | 2025.05.15 |
#1 나만 헷갈렸나? Jackpot Compose > Column, Row, Arragement, Alignment, Text 정렬 (0) | 2025.05.14 |