어플리케이션, 앱 (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 연산에서는 주로 ||를 사용.
- | vs. ||:
- 예시: 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. 추가 학습 자료
- Kotlin 공식 문서: https://kotlinlang.org/docs/
- Kotlin Koans: https://kotlinlang.org/docs/koans.html