본문 바로가기

Android

Kotlin 기초 1편

Kotlin을 처음 시작했을때 기초를 잘 다지고 가야 나중에 개발할 때 햇갈리지 않을 것 같아서 다시 정리해봅니다.

 

Kotlin ↔ Java

1) 안정성 확보: NPE(Null Pointer Exception 안정화)

2) 상호운용성

3) 실용성

4) 간결성

 

 

Kotlin 코드를 보고 내용이 이해가 되지 않는다면 아래 그림처럼 선택하여 Java로 변경한 코드를 확인하면 됩니다.

Tools -> Kotlin -> Show Kotlin Bytecode

 

 

Kotlin에서 알면 유용한 것들에 대해 먼저 알려드리겠습니다.

 

1) 함수의 오버로딩을 인자로 처리할 수 있다?

fun main(){
    val greet: String = GreetClass().Greeting(name = "성호", dayOfWeek = "월")
    val greet2: String = GreetClass().Greeting(name = "성호")
    println(greet)
    println(greet2)
}
class GreetClass {
   fun Greeting(name: String, dayOfWeek: String = "금"): String {
      return "안녕하세요! ${name}님 오늘은 ${dayOfWeek} 입니다."
   }
}

 

이렇게 클래스 안에 있는 함수를 셋팅할 때 인자의 기본 값을 설정할 수 있습니다. 

dayOfWeek = "금" 으로 셋팅할 수 있고 이는 greet2가 호출할 때 처럼 name에 대한 파라미터만 넣어줄 경우,

기본 값으로 금요일을 설정해 셋팅할 수 있습니다. 

반대로 greet는 dayOfWeek 값을 월요일로 설정했기 때문에 설정한대로 값이 들어가 구성됩니다.

여기서 중요한 부분은 1) 기본값을 셋팅한 함수는 오버로딩 효과를 나타낼 수 있다.

2) 클래스 안의 함수로 구현할 지 아니면 호출되는 부분보다 먼저 정의가 될 것인지 정하면 됩니다.

 

2번에 대해서만 한 번 더 설명하자면 Greeting 함수를 GreetClass에서 빼서 따로 구현할 경우

main 보다는 먼저 선언이 되어야 합니다.

코틀린은 함수 언어이기 때문에 컴파일이 진행될 때 순차적으로 진행될텐데 main 보다 앞서 선언이 되는 경우

Greeting을 먼저 체크하고ㅜ넘어가기 때문에 원활하게 결과값이 나올 것입니다.

 

더불어 클래스 내에서 선언된 Greeting은 main과 비교하여 순서 상관없이 잘 되는 이유는 

main에서 GreetClass를 호출할 때 클래스 인스턴스가 생성되면서 초기화되고 그 인스턴스 하에 있는 함수이므로 접근이 가능한 것입니다.

 


 

2. 상속 개념

코틀린은 기본적으로 함수형 언어이므로 상속에 대해서 닫혀있습니다.

상속을 하기 위해서는 open이라는 키워드를 이용해야 합니다.

open class User(open val name: String, open var age: Int)

class Kid(override val name: String, override var age: Int): User(name, age){
   var address: String = "주소"
   
   init {
     println("초기화 먼저")
   }
   
   // Secondary 생성자
   constructor(name: String, age: Int, address: String): this(name, age) {
     this.address = address
   }
}

 

User라는 클래스를 선언할 때 open 키워드를 넣고 인자들도 모두 open을 넣어서 셋팅했습니다.

Kid라는 클래스가 User 클래스를 상속받는데, 앞서 인자로 name과 age는 open 키워드로 셋팅했으므로 

상속의 override 키워드와 함께 정의되고 User 클래스를 상속받는다는 내용으로 :User(name, age)로 셋팅합니다.

 

여기서 초기화 함수가 먼저 수행되고 부생성자가 호출되는데 address라는 주소값을 추가하여

현재 인자로 받는 name, age는 그대로 들어오되, (this라는 키워드를 통해 Kid 인자로 받는 값을 정의)

address는 따로 셋팅한 값으로 들어가게 합니다.

단! 여기서 만약 Kid 클래스를 인스턴스로 선언하는 과정에서 address 부분을 채워준다면 "주소"가 아닌 채워준 값으로 정의될 것입니다.

 

Kid("수호", 3, "서울")

 

이렇게 말이다.  그러면 "서울"이 잘 정의되어 Kid 인스턴스를 구성합니다. 

 

 


 

3. 조건식과 when구문 

조건식은 코틀린에선 표현식이기 때문에 다음처럼 변수에 곧장 조건식을 담을 수 있습니다.

// 함수에서 마지막 : Int는 출력값
// 클래스에서 마지막 : ~~는 상속
fun max(a: Int, b: Int): Int {
   val result = if(a > b) a else b
   return result
}

 

when 구문은 ","를 통해 케이스를 묶을 수 있고 여러 타입을 넣을 수 있습니다.

fun isHoliday(dayOfWeek: Any){
   when(val day = dayOfWeek){
      "토",
      "일" -> if(day == "토") "better" else "good"
      in 2..4 -> {}
      in listOf("월", "화") -> {}
      else -> "bad"
   }
}

 

 

4. List, Map ↔ MutableListOf, MutableMapOf

List와 Map은 우리가 알고 있는 개념이다.  그렇지만 다른 점은 이 List와 Map은 Immutable 값이다.

따라서 add나 put과 같은 속성이 적용되지 않습니다.  변경이 되지 않는 것입니다.

mutableListOf와 mutableMapOf는 변경 가능한 리스트와 맵이기 때문에 add와 put이 가능합니다.

또한 List안에 있는 값을 구분자와 함께 보기 위해서는 joinToString(separator = "") 구문을 활용하면 됩니다.

 

fun main(){
    val list = mutableListOf<Int>(1, 2, 3, 4, 5)
    list.add(6)
    list.add(7)
    list.addAll(listOf(8, 9, 10))
    println(list[3]) 

    // list 내 요소들 확인하는 방법
    println(list.joinToString(separator = ","))

    var map1 = mapOf((1 to "안녕"), (2 to "Hello")) // immutable
    var map2 = mutableMapOf((1 to "안녕"), (2 to "Hello"))
    map2.put(3 , "Hi")
    map2[4] = "good"
}

 

 

이상 Kotlin 기초 1편을 다루어봤습니다.

Kotlin 기초 2편에서는 1) 반복문 & 엘비스 연산자 & NPE 조치,  2) 람다함수 - SAM Interface, 

3) 확장함수,  4) Scope Function에 대해서 설명드리겠습니다.

Kotlin 기초는 총 3편까지 있으며 1~3편 모두 정리가 되면 좀 더 접근하기 쉬울 것이라 생각합니다.   감사합니다.

반응형

'Android' 카테고리의 다른 글

Kotiln 기초 3편  (3) 2024.07.16
Kotlin 기초 2편  (0) 2024.07.11
BottomNavigationView  (0) 2024.07.07
Jetpack Compose란..?  (2) 2024.06.30
FCM 메시지가 최신화가 되지 않을때  (0) 2024.06.27