티스토리 뷰

Programming/Kotlin

1. 프로그래밍 기초

Mongi0417 2023. 6. 16. 18:31

Atom 04. var와 val

var: 변할 수 있는 수(variable)의 약자로, 내용을 재대입할 수 있다.

val: 값(value)의 약자로, 식별자의 값을 단 한 번만 초기화할 수 있다. 값을 초기화하고 나면 내용을 변경할 수 없다.

fun main() {
  var whole = 11
  var fractional = 1.4
  var words = "Twas Brilling"
  println(whole)
  println(fractional)
  println(words)
}

출력

11
1.4
Twas Brilling

변할 수 있는 수라는 이름처럼 var에 저장된 값은 달라질 수 있다. 즉, var에 저장된 데이터를 변경할 수 있다는 뜻이다. 그래서 var 변수를 가변(mutable)이라고 한다.

fun main() {
  var sum = 1
  sum = sum + 2
  sum += 3
  println(sum)
}

출력

6

최초, sum을 1로 초기화하고 sum = sum + 2는 sum의 현재 값을 가져와 2를 더한 결과를 sum에 다시 대입한다. 이후 sum += 3은 sum의 현재 값에 3을 증가시킨 결과를 sum에 다시 대입한다.

 

val 키워드는 값을 의미하고, 이는 변할 수 없는 것을 가리킨다. 그래서 val 변수는 불변(immutable)이다.

fun main() {
  val whole = 11
  // whole = 15 이는 오류를 발생시킨다.
  val fractional = 1.4
  val words = "Twas Brilling"
  println(whole)
  println(fractional)
  println(words)
}

 

Atom 05. 데이터 

자바와 마찬가지로 코틀린에서도 데이터 타입을 지정한다.

var 식별자: 타입 = 초기화

예를 들어, var p = 1.2 대신 var p: Double = 1.2처럼.

예제)

fun main() {
  val whole: Int = 11
  val fractional: Double = 1.4
  val trueOrFalse: Boolean = true
  val words: String = "A value"
  val character: Char = 'z'
  val lines: String = """Triple quotes let
  you have many lines
  in your string"""
  
  println(whole)
  println(fractional)
  println(trueOrFalse)
  println(words)
  println(character)
  println(lines)
}

출력

11
1.4
true
A value
z
Triple quotes left
you have many lines
in your string

# 여러 줄에 걸친 문자열을 만들거나 특수 문자가 들어간 문자열을 만들어야 하는 경우, 큰따옴표 세 개로 문자열을 감싼다.

 

타입을 섞어서 사용한 경우에도 코틀린은 타입 추론을 통해 전체 문장이나 식의 의미를 결정한다.

예제)

fun main() {
  val n = 1 + 1.2
  println(n)
}

출력

2.2

n을 계산할 때 Int와 Double을 더하면 코틀린은 타입 추론을 통해 결괏값의 타입을 Double로 결정하고, 이렇게 생성된 결과가 Double에 대한 모든 규칙을 준수하는지 확인한다.

사용자가 타입을 지정하지 않아도 보통은 코틀린이 타입을 추론한다.

 

Atom 06. 함수

fun 함수이름(p1: 타입1, p2: 타입2, ...): 반환타입 {
  여러 줄의 코드
  return 결과
}

예제)

fun multiplyByTwo(x: Int): Int {
  println("Inside multipleyByTwo")
  return x * 2
}

fun main() {
  val r = multiplyByTwo(5)
  println(r)
}

출력

Inside multiplyByTwo
10

예제)

fun sayHello() {
  println("Hello!")
}

fun sayGoodbye(): Unit {
  println("Auf Wiedersehen!")
}

fun main() {
  sayHello()
  sayGoodbye()
}

출력

Hello!
Auf Wiedersehen!

sayHello()와 sayGoodbye()의 반환 타입은 모두 Unit이지만, 코틀린에서는 Unit을 생략해도 된다.

Unit은 자바의 void와 같은 기능을 한다.

 

함수 본문이 단 하나의 식으로만 이뤄진 경우, 등호(=) 뒤에 해당 식을 넣어서 함수를 짧게 작성할 수도 있다.

fun 함수이름(p1: 타입1, p2: 타입2, ...): 반환타입 = 식

 

함수 본문이 중괄호로 둘러싸인 경우 블록 본문(block body)이라 하고, 등호 뒤에 식이 본문으로 지정된 경우 식 본문(expression body)이라 한다.

예제)

fun multiplyByThree(x: Int): Int = x * 3 // 식 본문

fun main() {
  println(multiplyByThree(5))
}

출력

15

 

코틀린은 식 본문을 사용하는 함수의 반환 타입을 추론한다.

예제)

fun multiplyByFour(x: Int) = x * 4 // 반환 타입 생략

fun main() {
  val result: Int = multiplyByFour(5)
  println(result)
}

출력

20

 

Atom 07. if 식

코틀린에서 일반 if 문은 자바와 동일하지만, 변수에 if 식의 결과를 저장할 수 있다.

예제)

fun main() {
    val num = 10
    val result = if (num > 100) 4 else 42
    println(result)
}

출력

42

 

Atom 08. 문자열 템플릿

식별자 이름 앞에 $를 붙이면, 문자열 템플릿이 그 식별자의 내용을 String에 넣어준다.

예제)

fun main() {
    val answer = 42
    println("Found $answer")
    println("printing a $1")
}

출력

Found 42
printing a $1

[1] $answer는 answer의 값으로 치환된다.

[2] $ 다음에 오는 대상이 프로그램 식별자로 인식되지 않으면 아무 일도 일어나지 않는다.

 

${}의 중괄호 안에 식을 넣으면 그 식을 평가한다. 그리고 평가한 결괏값을 String으로 변환해 결과 String에 삽입한다.

fun main() {
    val condition = true
    println("${if (condition) 'a' else 'b'}")
    val x = 11
    println("$x + 4 = ${x + 4}")
}

출력

a
11 + 4 = 15

 

String 안에 큰따옴표 등의 특수 문자를 넣어야 하는 경우에는 역슬래시(\)를 사용해 이스케이프(escape)하거나 큰따옴표를 연달아 세 개 쓰는 String 리터럴을 사용해야 한다.

fun main() {
    val s = "value"
    println("s = \"$s\".")
    println("""s = "$s".""")
}

출력

s = "value".
s = "value".

 

Atom 09. 수 타입

예제) BMI 계산

fun bmiMetric(
    weight: Double,
    height: Double
): String {
    val bmi = weight / (height * height)
    return if (bmi < 18.5) "Underweight"
        else if (bmi < 25) "Normal weight"
        else "Oerweight"
}

fun main() {
    val weight = 72.57
    val height = 1.727
    val status = bmiMetric(weight, height)
    println(status)
}

출력

Normal weight

해당 예제는 함수 파라미터를 한 줄에 쓸 수 없을 때 코드를 작성하는 형식을 보여주기도 한다.

 

Atom 10. 불리언

예제) 가게 운영 여부

fun isOpen(hour: Int) {
    val open = 9
    val closed = 20
    println("Operating hours: $open - $closed")
    val status =
        if (hour >= open && hour <= closed)
            true
        else
            false
    println("Open: $status")
}

fun main() = isOpen(6)

출력

Operating hours: 9 - 20
Open: false

main()은 함수 호출 하나로만 구성되기 때문에 식 본문 함수를 사용하였다.

 

예제) 가게 운영 여부 if 식 단순화

fun isOpen(hour: Int) {
    val open = 9
    val closed = 20
    println("Operating hours: $open - $closed")
    val status = hour >= open && hour <= closed
    println("Open: $status")
}

fun main() = isOpen(6)

 

예제) ForWithRanges

fun showRange(r: IntProgression) {
    for (i in r)
        print("$i ")
    print(" // $r")
    println()
}

fun main() {
    showRange(1..5)
    showRange(0 until 5)
    showRange(5 downTo 1)
    showRange(0..9 step 2)
    showRange(0 until 10 step 3)
    showRange(9 downTo 2 step 3)
}

출력

1 2 3 4 5  // 1..5
0 1 2 3 4  // 0..4
5 4 3 2 1  // 5 downTo 1 step 1
0 2 4 6 8  // 0..8 step 2
0 3 6 9  // 0..9 step 3
9 6 3  // 9 downTo 3 step 3

showRange()는 파라미터로 IntProgression을 받는데, 이는 Int 범위를 포함하고 코틀린이 기본 제공하는 타입이다.

IntProgression은 우리가 입력한 값을 표준적인 형태로 변환해 표현한다.

 

예제) Repeat

fun main() {
    repeat(2) {
        println("hi!")
    }
}

출력

hi!
hi!

이처럼 어떤 동작을 단순히 정해진 횟수만큼 반복하고 싶다면 repeat()를 사용해도 된다.

 

Atom 13. in 키워드

in 키워드는 어떤 값이 주어진 범위 안에 들어 있는지 검사한다.

예제)

fun main() {
    val percent = 35
    println(percent in 1..100)
}

출력

true

 

Atom 14. 식과 문

문(statement)과 식(expression) 사이에는 근본적인 차이가 있다.

[1] 문은 효과를 발생시키지만 결과를 내놓지 않는다.

[2] 식은 항상 결과를 만들어낸다.

'Programming > Kotlin' 카테고리의 다른 글

2. 객체 소개  (1) 2023.06.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함