IT Study/Android
[Kotlin] 코틀린 기초 (feat. 함수, 클래스, Null 등...)
three kim
2024. 1. 14. 22:53
728x90
함수
1. 유닛 반환 타입(Unit Return Type): 반환값 없는 함수에 대한 타입 표현, 생략 가능
2. 기본 인수(Default Arguments): 함수 매개변수에 기본값 설정으로 함수 오버로딩 필요성 감소
3. 명명된 인수(Named Arguments): 매개변수 이름을 통한 인수 전달로 인수 순서 자유로움
4. 단일 표현식 함수(Single Expression Functions): 함수 본문 축약 표현으로 코드 간결성 향상
package fastcampus.part0.kotlin
fun main() {
println("Hello")
test1(1, 2)
test1(1, 3)
test2(1)
test2(l = 1, n = 3)
// 2-3. 함수 안에서 선언 값에 대해 작성 가능 (순서 무관)
info1(id = "1three", name = "스리", nickname = "Three")
info2("스리", "Three", "1three")
}
// 2. 함수 : fun
// 2-1. 반환 타입 : 반환 타입이 없을 경우 Unit (생략 가능)
fun test1(n: Int, m: Int) {
println("$n, $m")
}
// 2-2. 오버로딩 필요 X : 매개변수 m의 default value 4로 설정 가능
fun test2(n: Int, m: Int = 4, l: Int = 5): Int {
println("$n, $m, $l")
return n + m
}
fun info1(name: String, nickname: String, id: String) {
println("$name, $nickname, $id")
}
// 2-4. Single Expression (단일 표현식) : 함수 정의 축약
fun info2(name: String, nickname: String, id: String) = println("$name, $nickname, $id")
변수
package fastcampus.part0.kotlin
fun main() {
// 3. 변수
// val 상수
// var 변수
var a: Int = 3
val b: Int = 10
a = 4
val name = "한슬" // 타입 추론
}
클래스
1. 클래스 생성자(Constructor): 클래스 인스턴스를 생성할 때 호출되는 함수, 매개변수에 기본값 설정 가능
2. 접근 제어자(Access Modifiers): 클래스 멤버의 접근 범위를 제한, private 키워드로 비공개 설정
3. 상속(Inheritance): 클래스의 특성을 재사용하고 확장하기 위한 기능, open 키워드로 상속 허용
4. 주 생성자(Primary Constructor): 클래스 헤더에 선언되며, 클래스 인스턴스 생성 시 호출
5. 부 생성자(Secondary Constructor): 클래스 본문에 선언되며, 주 생성자 외의 추가적인 생성자
6. 초기화 블록(Init Block): 클래스 인스턴스 초기화 과정에서 실행되는 코드 블록
7. 오버라이딩(Overriding): 상속받은 멤버의 기능을 자식 클래스에서 재정의, override 키워드 사용
package fastcampus.part0.kotlin
fun main() {
val user = User("한슬", 24)
user.age = 26
// user.name : 접근 불가 (private)
println(user.age)
Kid("아이", 3, "male")
}
// 4. 클래스
// 4-1. () : Constructor(생성자)
// 4-2. Constructor : default value 설정 가능
class User(private val name: String, var age: Int = 24)
// 4-3. 상속 : open 키워드 사용
// Kid 생성 시, User2 상속 받고 싶을 경우
open class User2(open val name: String, open var age: Int = 24)
// 바깥 : 주 생성자
class Kid(override val name: String, override var age: Int) : User2(name, age) {
var gender: String = "female"
// 클래스 내 가장 먼저 호출
init {
// Fragment 초기화 시 사용
println("초기화 중")
}
// 내부 : 부 생성자
constructor(name: String, age: Int, gender: String) : this(name, age) {
this.gender = gender
println("부 생성자 호출")
}
}
조건식
package fastcampus.part0.kotlin
fun main() {
max(10, 3)
min(10, 3)
isHoliday("월")
}
// 5-1. if
fun max(n: Int, m: Int) {
// result : kotlin.Unit
val result = if (n > m) println("큰 수는 $n")
else if (n < m) println("큰 수는 $m")
else println("$n = $m")
println(result)
}
fun min(n: Int, m: Int) {
val result = if (n > m) "작은 수는 $m" else if (n < m) "작은 수는 $n" else "$n = $m"
println(result)
}
// 5-2. when
fun isHoliday(dayOfWeek: Any) {
val result = when (dayOfWeek) {
"토", "일" -> if (dayOfWeek == "토") "토요일 좋아 :)" else "내일 월요일..."
in listOf("월", "화") -> "버티자"
in 2..4 -> "숫자의 경우, 범위 값으로 사용 가능"
else -> false
}
println(result)
}
반복문
package fastcampus.part0.kotlin
fun main() {
// 6-1. for
// 1..10 == IntRange(1, 10) == 1 until 11
for (i in 1..10) {
print("$i ")
}
println()
for (i in IntRange(1, 10)) {
print("$i ")
}
println()
for(i in 1 until 11) {
print("$i ")
}
println()
for(i in 10 downTo 1) {
print("$i ")
}
println()
for(i in 1..10 step 2) {
print("$i ")
}
println()
for(i in 10 downTo 1 step 2) {
print("$i ")
}
println()
// 6-2. while
var j = 1
while(j < 11) {
print("$j ")
j++
}
}
컬렉션
package fastcampus.part0.kotlin
fun main() {
// 7-1. list
// mutableList : 추가, 삭제 등 변경 가능
// list : 변경 불가
val list = mutableListOf(1, 2, 3, 4, 5)
list.add(6)
list.addAll(listOf(7, 8, 9))
val list2 = listOf(1, 2, 3, 4)
// list2.add // Error
println(list)
println(list2.joinToString(" ")) // it 사용
// 특징 1 : 다양한 타입 저장
val diverseList = listOf(1, "hi", 3.14, true)
// 특징 2 : 강력한 확장 함수
// first, map 등
// 7-2. map
val map = mapOf((1 to "안녕"), (2 to "Hello"))
// map.put // Error
val map2 = mutableMapOf((1 to "안녕"), (2 to "Hello"))
// map2.put(3, "Bonjour")
map2[3] = "Bonjour" // Index Operator
}
Null
1. Null 안정성: 코틀린은 기본적으로 모든 타입의 변수가 null을 가질 수 없도록 설계되어, NullPointer 예외 방지
2. Nullable 타입: ?를 타입 뒤에 붙여 null을 가질 수 있는 변수로 선언
3. Elvis 연산자(Elvis Operator?:): 왼쪽 피연산자가 null이 아니면 그 값을, null이면 오른쪽 피연산자의 값을 반환
4. Safe Call Operator(?.): null이 아닌 경우 해당 연산을 수행하고, null인 경우 null을 반환
5. Non-null Assertion Operator(!!.): null이 아님을 확신할 때 사용하며, null인 경우 NullPointer 예외 발생
package fastcampus.part0.kotlin
fun main() {
// 8. null (Kotlin의 null 안정성)
// 타입 선언 : null 불가 명시
// : String
// : Int
var name: String = "한슬"
// name = null // 컴파일 단계 Error
// 타입? 선언 : null 가능 명시
// : String?
// : Int?
var nickname: String? = "three"
/*
* Elvis Operation (?:)
*
* 왼쪽 값이 non-null 경우, 객체 값 리턴
* 왼쪽 값이 null 경우, 오른쪽 값 리턴
*/
// val result = if (nickname == null) "값 X" else nickname
val result = nickname ?: "값 X"
println(result)
nickname = null
// val nicknameLength = nickname.length // Error
// ? : null 경우, null 반환
// !! : null 아님이 확실할 경우
val nicknameLength = nickname?.length
println(nicknameLength)
}
타입 체크와 캐스팅
1. 타입 체크(Type Check): is 키워드를 사용하여 변수의 타입을 확인
2. 캐스팅(Casting): as 키워드를 사용하여 변수의 타입을 변환
3. 세이프 캐스트(Safe Cast): as? 키워드를 사용하여 변환 불가능한 경우 null을 반환
4. 스마트 캐스트(Smart Cast): is 키워드를 사용하여 타입 체크 후, 해당 타입으로 자동 변환되어 사용
5. 엘비스 연산자(Elvis Operator): ?: 키워드를 사용하여 null인 경우 대체 값 제공
package fastcampus.part0.kotlin
fun main() {
// 9-1. 타입 체크 : is
println(checkType("Hi"))
println(checkType(3))
println(checkType(true))
// 9-2. 캐스팅 (형 변환) : as
cast("안녕")
// cast(10) // ClassCastException (Int → 불가 → String)
println(smartCast("안녕"))
println(smartCast(10))
println(smartCast(true))
}
fun checkType(n: Any): String {
return when (n) {
is String -> "문자열"
is Int -> "정수"
else -> "몰라"
}
}
fun cast(m: Any) {
// as? Type : Type으로 변환 불가 시, 자동 null 반환
// val result = m as? String
// val result = (m as? String) ?: "실패"
val result = m as String
println(result)
}
fun smartCast(l: Any): Int {
return when (l) {
is String -> l.length
is Int -> l.dec() // dec = -1
else -> -1
}
}
String template
package fastcampus.part0.kotlin
fun main() {
// 10. string template
val n = 10
val name = "three"
val isTrue = true
println("$n $name ${name.length} $isTrue")
}