[TIL]Kotlin 기본 문법 : 유용한 기능

지혜·2023년 12월 1일

Android_TIL

목록 보기
9/70

✏231201 금요일 TIL(Today I learned) 오늘 배운 것

📖 람다식 (Lambda expression)

  • 이름이 없는 익명함수를 말한다.
  • 보통 재사용 되지 않고, 한 번 사용되는 함수를 만들 때 사용한다.
  • 코틀린의 람다식 구조
{매개변수1, 매개변수2... -> 코드  }//중괄호로 감싼다.
//매개변수와 본문은 -> 로 구분한다. (화살표 표기법 사용)
//매개변수는 ( )괄호로 감싸지 않는다.
//매개변수로 타입추론이 가능하기 때문에, 반환형 타입 생략이 가능하다.
//변수에 람다식을 담을 경우, 매개변수 타입은 생략이 불가능하다.
people.maxBy ({p: Person -> p.age}) //기본 람다 함수

//함수의 맨 마지막 인자가 람다라면, ()괄호 안에서 빼서, 밖에 람다를 표현할 수 있다.
people.maxBy () {p: Person -> p.age}

//인자가 하나이면서, 그 인자가 람다 타입이라면 ()괄호를 생략할 수 있다.
people.maxBy {p: Person -> p.age}

//인자가 하나일 때, 람다식 내부에서 인자를 it으로 받을 수 있다.
people.maxBy {it.age}

📖 단일 표현식 함수 (Single-expression function)

  • 단일 표현식 : 함수가 하나의 표현식으로만 구성 되어 있을 때, 중괄호{ }와 return을 생략하고, = 을 통해 값을 할당하는 것처럼 함수를 정의할 수 있다. (Unit타입을 반환할 경우는 안 됨)
  • 람다식을 바탕으로 사용한다.

=>하나의 메소드를 간결하게 표현하는 방법. 혹은, 메소드를 선언하지 않아도 로직을 저장할 수 있다.

//숫자 3개의 평균을 리턴해주는 함수
fun add(num1:Int, num2:Int, num3:Int) = (num1+num2+num3)/3
//매개변수 Int끼리의 계산은 어차피 결과값이 Int라는 것을 추론하기 때문에 반환형 생략이 가능하다.
//메소드 없이 변수에 로직을 저장한 방법.
var add = {num1: Int, num2: Int, num3: Int -> (num1+num2+num3) / 3}
println("평균값은 ${add(10,20,30)}입니다")

📖 자료형 변환

  • 기본 타입 변환 : 각 타입에 맞는 확장 함수를 사용할 수 있다.
    • toInt( ) : Int타입으로 변환 (내부적으로 java.lang.Integer.parseInt 를 사용한다.)
      +물론 그냥 Integer.parseInt( )를 사용하는 것도 가능하다.
    • toIntOrNull( ) : Int로 변환, 변환하지 못하는 경우 에러 대신 Null 반환
    • toDouble( ) : Double타입으로 변환,
    • toDoubleOrNull( ) : Double로 변환, 환하지 못하는 경우 에러 대신 Null 반환
    • toLong( ) : Long타입으로 변환
    • toFloat( ) : Float타입으로 변환
    • toByte( ) : Byte타입으로 변환
    • toShort( ) : Short타입으로 변환
    • toChar( ) : Char타입으로 변환
  • 문자열 타입 변환 : 마찬가지로 확장함수를 사용하여 변환가능하다.
    • toString( ) : 문자열로 변환
  • is 키워드를 사용하여 자료형의 타입을 확인할 수 있다.
if(name is String) {//boolean반환
    println("name은 String 타입입니다")
} else {
    println("name은 String 타입이 아닙니다")
}

📖 업캐스팅과 다운캐스팅

1. 업캐스팅 (UpCasting)

  • 하위 클래스가 상위 클래스화 되는 것을 말한다.
var A: Drinks = Cola()
//Cola 클래스가 상위클래스인 Drinks클래스가 되는 것.

2. 다운캐스팅(DownCasting)

  • 업캐스팅된 인스턴스를 다시 하위 자료형으로 변환하는 것을 말한다.
var B: Cola = Drinks() // 이렇게 바로 연결하면 error: type mismatch 발생한다.
//별도의 연산자가 필요하다.
  • 다운캐스팅은 별도의 연산자가 필요하다.

    • is : 변수가 자료형에 호환되는지를 먼저 체크한 후 변환해주는 캐스팅 연산자. if문 안에서만 사용 된다. 자동캐스팅을 해주기도 한다.

      var A = Drinks()
      var B = Cola() 
      if (A is Cola) { //이 if문 안에서 Cola로서 동작.} //빠져나가면 다시 Drinks 클래스로 동작한다. 
      fun castMethod(a: Any) {
      	if (a is String) {
             println(a.length) // a가 String 타입으로 자동 캐스팅
         }
      }
    • as : 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자. 해당 타입으로 변환이 안되면 오류가 뜨지만, as? 를 하용하면 에러 대신 null을 반환한다.

      //업캐스팅
      var A: Drinks = Cola()
      
      //이후로는 a는 cola로 작동, 반환도 가능
      A as Cola
      var B = a as Cola

[예시 코드]

open class Drinks{
    var name :String = "음료수"
    open fun Drink(){
        println("${name}을 마십니다.")
    }    
}

class Cola : Drinks(){
    var type :String = "콜라"
    override fun Drink(){
        println("${name}${type}을 마십니다.")
    }
    fun Taste(){
        println("${type}향이 납니다.")
    }
}

✏오늘 발생 문제 및 해결

📖오늘의 새로운 내용 및 복습

  • 람다식에 대해 간단하지만, 한번 정리하는 시간을 가졌다. 프로그래머스를 풀면서 자연스럽게 사용하던 단일 표현식 함수에 대해서도 그렇게 작성이 가능한 이유를 제대로 이해할 수 있는 시간이였다.
  • 자료형 변환에 대해서는 toInt, toString 쓰는게 자연스럽고 어렵지 않았는데, toInt()가 결국 확장함수였고, 또 자바를 바탕으로 한단계 편의가 생긴 코틀린의 장점이라는 것을 알게 되었다. 코틀린은 정말 알수록 쓰기 좋은 언어라는 것을 깨닫게 된다.

📖오늘의 문제 발생 및 해결

  • 오늘의 문제는 업캐스팅과 다운캐스팅이였다. 다형성 구현에 중요한 역할을 한다고 하는데 예시만 봐서는 쉽게 감이 오지 않았다. 계산기 만들었을 때 추상메서드 연결했을 때랑 비슷한 모양이라서 오히려 이번엔 생긴건 딱히 낯설지 않은데 막상 그 안에 내용을 이해하려니까 까다롭게 느껴졌다. 어쩄든 다형성이라는 키워드를 상기하면서 실무에서 많이 적용해보고 한 번 더 정리하는 시간을 가져야겠다.

profile
파이팅!

0개의 댓글