본문 바로가기
IT/android

#4 나만 헷갈렸나? Jackpot Compose > 코틀린 문법

by 내일은교양왕 2025. 5. 17.

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