Kotlin Day04 회고
Kotlin Day04 회고

Kotlin Day04 회고

1️⃣ 오늘의 Keyword

  1. when
  1. 표현식
  1. indices
  1. withIndex
  1. 라벨
  1. 전개연산자
  1. ==, ===
  1. Null Safety

2️⃣ 학습 내용 및 예시

  • 제어문 (조건문, 반복문)
    • 조건문
      • Java : if-else, switch-case, 3항 연산자
      • Kotlin : if-else, when
    • 반복문
      • for, while
  • if (조건 // true or false) { }
    • Kotlin에서는 if문을 표현식으로 사용가능
      • expression - 결과 (data) 양산
      • statement - 결과(x)
      • if를 표현식으로 사용할 때, else를 생략 할 수 없고 return 이 없다.
        if나 else 블록내에 마지막 라인 데이터가 대입된다.
  • when
    • java의 switch 구문과 비슷
    • when은 kotlin에서 표현식
    • switch 구문에서는 분기 조건을 ‘정수’로만 지정할 수 있지만,
      when에서는 정수 이외에도 다양한 타입의 데이터를 지정가능,
      그리고 타입 자체를 지정 가능
      • 여러값을 조건으로 표현
        • when(a1) { 10, 20, 30 -> println("10, 20, 30") //or.. 40, 50 -> println("40, 50") some() -> println("some()") 30 + 30 -> println("60") }
      • 특정 범위를 조건으로 명시
        • when(a1) { in 1..10 -> println("aaa") in 11..20 -> println("bbb") in arrayOf(10, 20, 30) -> println("array") in listOf<Int>(40, 50, 60) -> println("list") }
      • 다양한 타입의 데이터에 대한 조건
        • fun testWhen(data: Any) { when(data) { 1 -> println("data value is 1") "hello" -> println("data value is hello") is Boolean -> println("data type is Boolean") } }
      • if-else 의 대체용
      • val data5 = 15 when { data5 <= 10 -> println("data5 <10") data5 > 10 && data5 <= 20 -> println("10 < data5 <= 20") else -> println("data5 > 20") }
    • when 을 표현식으로 사용 가능
      • if 문과 마찬가지로 else 생략 불가, 블록의 마지막 라인이 when 에 반환
  • for 반복문
    • 반복횟수 지정
      • for (i in 1..10) //10까지 포함
      • for (i in 1 until 10) //10은 포함되지 않음
      • for(i in 1..10 step 2) // 2씩 증가
      • for(i in 10 downTo 1) // 숫자 감소
    • 컬렉션 타입 이용
      • val array = arrayOf("hello", "world") //컬렉션 타입 이용 for (v in array) { print("$v") } //hello world
    • indices - 인덱스 값을 획득할 때
      • for(i in array.indices) { print("$i - ${array[i]} ") } // 0 - hello, 1 - world
    • withIndex() - 인덱스 와 값을 획득 (값, 인덱스 순서가 중요함)
      • for((i, v) in array.withIndex()) { print("$i - $v ") } //0 - hello, 1 - world
    • map을 예로
      • //반복되면서 .. Entry 객체가 item에 대입... val map = mapOf<String, String>("one" to "hello", "two" to "world") for(item in map) { println("key : ${item.key}, value : ${item.value}") } //key : one, value : hello //key : two, value : world
       
  • while 반복문 - 자바와 동일
    • break 와 continue, 그리고 라벨
    • 라벨은 개발자가 특정 위치를 개발자 마음대로 정해 (라벨)
      continue나 break 문에서 해당 라벨로 지정한 반복문을 탈출 가능
 
  • 연산자
    • 연산자는 java와 동일
  • 전개연산자 : 스프레드 연산자 (*)
    • vararg 의 인수로 적용
    • fun some(arg1: Int, vararg arg2: String) { } //배열의 모든 데이터를 넘기고 싶다면... some(10, *array)
    • List에 이용
    • val list = listOf<String>("hello", "world") some(10, *list.toTypedArray())
  • 복합 대입 연산자, 증감 연산자
  • 논리 연산자 ( &&, || , ! )
  • 일치 연산자
    • 값을 비교할 때 (structural equality) : ==
    • 객체를 비교할 때 (referential equality) : ===
    • //일반 객체, ==, === 모두.. 주소비교.. class User val user1 = User() val user2 = User() val user3 = user1 println("${user1 == user2}, ${user1 === user2}, ${user1 == user3}, ${user1 === user3}") //false, false, true, true //기초 타입의 객체... val data1: Int = 1000 val data2 = 1000 val data3 = data1 println("${data1 == data2}, ${data1 === data2}, ${data1 == data3}, ${data1 === data3}") //true, true, true, true
  • 연산자 재정의
    • 클래스의 멤버로 정의할 수 있고, 확장 함수로 추가하여 사용도 가능
    • 연산자 재정의 하려는 함수 앞에 operator 예약어를 추가해야함
 
  • Null Safety
    • type - nullable, non-null
    • operator

❓ 이해 안 된 부분 / 도움 요청

  • val a: Array = Array(3, {0})
    혹시 여기에서 {0} 부분도 표현식인가요??
    ⇒ 호출이 되지 않았기 때문에 표현식x , 람다함수o (조금 더 자세히 이해 필요**)
 

‼️오늘 느낀 점

  • 어떤 값을 구하기 위해서 단순한 알고리즘을 생각해 내는 것도 너무 어렵다.