어플리케이션, 앱 (Application)/안드로이드 (Android)

안드로이드 jetpack compose 공부 정리 2일차 (코틀린, android 14 이후 버전)

sobal 2025. 3. 12. 17:53

2일차는 코틀린의 기본 문법에 대한 내용이다.


1. 변수 (Variables)

  • 정의: 프로그램이 실행되는 동안 데이터를 저장하는 데 사용되는 수단.
  • 역할: 특정 데이터 종류(숫자, 문자열, 리스트 등)를 저장하기 위한 메모리 공간을 할당받음.
  • 값 할당: 데이터를 특정 메모리 위치에 저장하는 것을 의미.
  • 소멸: 앱이 종료되면 변수에 할당된 값은 소멸됨.
  • 가변성:
    • var: 읽기 및 쓰기 가능 (Mutable). 값이 변경될 수 있는 변수를 선언할 때 사용. 예: var counter = 0; counter = 1 (카운터, 사용자 입력에 따라 업데이트되는 값)
    • val: 읽기 전용 (Immutable). 한 번 값이 할당되면 변경할 수 없는 변수(상수)를 선언할 때 사용. 예: val pi = 3.14 (상수, 변경되지 않아야 할 속성)

2. 자료형 (Data Types)

  • 객체 지향: Kotlin의 모든 것은 객체(Object)이므로, 변수에서 멤버 함수나 속성을 호출할 수 있음. 참고로 JVM 상에서는 성능 최적화를 위해 Int, Double 등의 숫자 타입이 기본 자료형(primitive type)으로 처리될 수도 있음.
  • 원시 타입 표현: 숫자, 문자, Boolean 값은 실행 시 원시값(Primitive Value)으로 표현될 수 있어 메모리 사용 및 성능 최적화에 유리.
  • 자료형 선언:
    • 명시적 선언: var age: Int = 30
    • 타입 추론: var name = "Alice" (컴파일러가 자동으로 타입을 추론)

2.1. 숫자형 (Numbers)

  • 정수형:
    • Byte, Short, Int, Long: 정수 값을 저장.
    • Int가 기본 정수형.
    • Long은 숫자 뒤에 L을 붙여 표시 (예: val population: Long = 7000000000L).
  • 실수형:
    • Float, Double: 소수점 이하 값을 저장.
    • Double이 기본 실수형.
    • Float은 숫자 뒤에 f 또는 F를 붙여 표시 (예: var temperature: Float = 25.5f).
  • 부호 없는 정수형:
    • UByte, UShort, UInt, ULong: 음수 값을 가질 수 없는 정수형. 참고로 코틀린 1.5부터 실험적 기능이었다가 이후 안정화 되었지만 프로젝트 환경에 따라 사용시 유의 필요.
    • 숫자 뒤에 u를 붙여 표현 (예: var age: UShort = 35u).

2.2. 문자 (Characters)

  • Char: 단일 유니코드 문자를 저장.
  • 작은따옴표(')로 묶어 표현 (예: val initial: Char = 'K').
  • 유니코드 이스케이프 시퀀스 (\u00AE)를 사용하여 유니코드 문자 표현 가능.
  • 백슬래시 이스케이프 문자 (\n, \t 등)를 사용하여 특수 문자 표현 가능 (예: val newline: Char = '\n').

2.3. 문자열 (Strings)

  • String: 문자열을 저장.
  • 큰따옴표(")로 묶어 표현 (예: val message: String = "Hello, world!").
  • 문자열 연산:
    • message.uppercase(): 문자열을 대문자로 변환.
    • message.lowercase(): 문자열을 소문자로 변환.
    • message + "panjuta": 문자열 연결(Concatenation).
  • 여러 줄 문자열(raw string): """를 사용하여 표현 (예: val multilineString = """This is a multiline string."""").
  • trimIndent() 또는 trimMargin() 등을 사용하면 들여쓰기를 깔끔하게 정리 가능.
val multilineString = """
    This is a 
    multiline 
    string.
""".trimIndent()

2.4. 부울형 (Booleans)

  • Boolean: 참(true) 또는 거짓(false) 값을 가짐.
  • 논리 연산자: || (OR), && (AND), ! (NOT)
    • | vs. ||:
      • |: 양쪽 피연산자를 모두 평가. 비트 연산 또는 논리 연산에 사용.
      • ||: 단락 평가(short-circuit evaluation)를 수행. 왼쪽 피연산자가 true이면 오른쪽 피연산자를 평가하지 않음. 논리 연산에만 사용. 효율성을 위해 논리 OR 연산에서는 주로 ||를 사용.
  • 예시: val isAdult: Boolean = age >= 18

3. 타입 변환 (Type Conversion)

  • 서로 다른 타입의 변수 간에 값을 변환하는 과정, 주로 호환되지 않는 타입들을 함께 사용할 때 사용.
  • 숫자 간 변환: .toDouble(),.toInt(),.toLong()등을 사용하여 숫자 타입간 변환
  • 숫자를 문자열로 변환: .toString() 함수를 사용하여 숫자 타입을 문자열로 변환
  • 문자열을 숫자로 변환: .toInt(),.toDouble()등을 사용하여 문자열을 숫자로 변환, 이 경우 NumberFormatException 예외 처리가 필요함

4. 함수 (Functions)

  • fun 키워드를 사용하여 정의.
  • main() 함수는 프로그램의 시작점.
  • println() 함수는 콘솔에 텍스트를 출력.
  • 함수 정의 예시:
fun greet(name: String) {
    println("Hello, $name!")
}

fun main() {
    greet("Kotlin")
}

5. 조건문 (Conditional Statements)

5.1. if 문

  • 특정 조건이 참일 때 코드 블록을 실행.
 
val age = 26
if (age >= 18) {
    println("Adult") // age가 18 이상이면 "Adult" 출력
}

5.2. else 문

  • if 문의 조건이 거짓일 때 코드 블록을 실행.
 
val age = 11
if (age >= 18) {
    println("Adult")
} else {
    println("Minor") // age가 18 미만이면 "Minor" 출력
}

5.3. else if 문

  • if 문의 조건이 거짓이고, else if 문의 조건이 참일 때 코드 블록을 실행. 여러 조건을 순차적으로 검사할 때 사용.
 
val score = 82
if (score >= 90) {
    println("A")
} else if (score >= 80) {
    println("B") // score가 90 미만 80 이상이면 "B" 출력
} else {
    println("C")
}

5.4. when 문

  • 여러 조건을 간결하게 처리. if-else if 체인을 대체하여 가독성을 높임.
  • 값 매칭:
 
val day = 3
val dayType = when (day) {
    1 -> "Monday"
    2 -> "Tuesday"
    3 -> "Wednesday" // day가 3이면 "Wednesday"를 dayType에 할당
    4 -> "Thursday"
    5 -> "Friday"
    else -> "Weekend"
}
  • 범위 매칭:
 
val temperature = 25
val weather = when (temperature) {
    in 0..10 -> "Cold"
    in 11..20 -> "Cool"
    in 21..30 -> "Warm" // temperature가 21 이상 30 이하이면 "Warm"을 weather에 할당
    else -> "Hot"
}
  • 여러 조건 매칭:
 
val fruit = "Apple"
val color = when (fruit) {
    "Apple", "Cherry" -> "Red" // fruit이 "Apple" 또는 "Cherry"이면 "Red"를 color에 할당
    "Banana", "Lemon" -> "Yellow"
    else -> "Unknown"
}
  • 조건식 활용:
 
val fruit = "Apple"
val color = when {
	fruit == "Apple" || fruit == "Cherry" -> "Red"
	fruit == "Banana" || fruit == "Lemon" -> "Yellow"
    else -> "Unknown"
}

5.5. in 연산자

  • 값이 특정 범위에 포함되는지 확인.
 
if (age in 18..39) {
    println("Young adult") // age가 18 이상 39 이하이면 "Young adult" 출력
}

6. 반복문 (Loops)

6.1. while 문

  • 조건이 참인 동안 코드 블록을 반복 실행.
  • 무한 루프 주의: 조건이 항상 참이 되지 않도록 주의해야 함.
var i = 0
while (i < 5) {
    println(i)
    i++ // i를 증가시켜 무한 루프 방지
}

6.2. for 문

  • 범위, 배열, 컬렉션 등의 요소를 순회하며 코드 블록을 실행.
 
for (i in 1..10) {
    println(i) // 1부터 10까지 출력
}

6.3. break 문

  • 반복문을 중간에 종료.
 
for (i in 1..10) {
    if (i > 5) {
        break // i가 5보다 커지면 반복문 종료
    }
    println(i)
}

6.4. continue

  • continue 키워드는 현재의 반복을 중단하고 다음 반복으로 넘어가도록 하는 역할을 함
for (i in 1..10) {
    if (i % 2 == 0) {
        continue  // 짝수면 바로 다음 반복으로 넘어감
    }
    println(i)   // 홀수만 출력
}

 

7. 사용자 입력 (User Input)

  • readln(): 콘솔에서 사용자 입력을 문자열로 읽음. 참고로 코틀린 1.6부터 추가된 readln() 함수는 널을 반환하지 않고 입력 스트림이 종료되면 예외를 던짐. 반면 기존 readLine() 함수는 널이 반환될 수 있어서 그에 대한 처리가 필요했음.
  • toInt(), toDouble() 등: 입력받은 문자열을 숫자형으로 변환.
  • NumberFormatException: 잘못된 숫자 형식 입력에 대한 예외. try-catch 블록을 사용하여 예외 처리.
 
print("Enter your age: ")
val ageString = readln()
try {
    val age = ageString.toInt() // 문자열을 Int로 변환
    println("Your age is $age")
} catch (e: NumberFormatException) {
    println("Invalid age format") // 숫자 변환 실패 시 메시지 출력
}

8. 연산자(Operators)

Kotlin에서 사용되는 주요 연산자

  • 산술 연산자: + (더하기), - (빼기), * (곱하기), / (나누기), % (나머지)
  • 비교 연산자: == (같음), != (같지 않음), > (큼), < (작음), >= (크거나 같음), <= (작거나 같음)
  • 할당 연산자: = (할당), += (더하고 할당), -= (빼고 할당), *= (곱하고 할당), /= (나누고 할당)
  • 논리 연산자: && (AND), || (OR), ! (NOT)

9. 추가 학습 자료