본문 바로가기
스프링 부트/코틀린

[코틀린] 코틀린 기초 함수 변수 선언법

by illlilillil 2022. 3. 9.

Hello World!!


fun main(args: Array<String>) {
    println("Hello, world!!!")
}
  • 함수 선언 시: fun을 사용
  • 자바와 달리 이름 뒤에 파라미터 타입 사용
  • 함수를 정의할 수 있다.
  • 배열 처리를 위한 문법은 없다.
  • System.out.println 대신 println으로 간결해졌다.
  • 줄 끝에 ;(세미 콜론)을 붙이지 않아도 된다.

 

함수를 만들어 보자


fun max(a: Int, b: Int): Int {
		return if (a > b) a else b
}

더 간결하게 만들어 보자

fun max(a: Int, b: Int): Int = if (a > b) a else b
인텔리J 

인텔리제이에선 반환 타입을 생략해도 된다. 코틀린이 정적 타입 지정 언어지만 컴파일러가 본문을 해석해 반환 타입을 알아서  지정해준다.

fun max(a: Int, b: Int) = if (a > b) a else b

 

 

변수


코틀린은 타입 지정을 생략하는 것이 일반적이다.

val result = 42 // 타입 생략
val result: Int = 42 // 타입 지정

초기화 식을 사용하지 않고 변수 선언 시에는 반드시 타입을 명시해야 한다.

val result: Int
result = 42

 

코틀린의 변수 타입은 두 가지가 있다.

  • val - 변경 불가능한 참조 변수이다. 자바로 따지면 final 변수로 생각하면 된다.
  • var - 변경 가능한 참조 변수이다.
기본적으로 모든 변수를 val 키워드로 선언하고 필요할 때만 var로 변경한다.
val는 정확히 한 번만 초기화 해야 한다.

val의 참조 자체는 불편이라도 참조가 가리키는 객체의 내부 값은 변경될 수 있다.

val languages = arrayListOf("Java")
languages.add("Kotlin")

var 키워드를 사용하면 변수의 값을 변경할 수 있지만 변수의 타입은 고정돼 바뀌지 않는다.

var result = 42
result = "no result" // 컴파일 오류 발생

 

문자열 형식 지정법

필요한 곳에 앞에 $만 넣고 변수를 넣으면 된다.

fun main() {
    val hello= "frank"
    println("hello $hello")
}

 

클래스 및 프로퍼티


기존 자바 클래스

public class Person {
		private final String name;

		public Person(String name) {
				this.name = name;
		}

		public String getName() {
				return name;
		}
}

코틀린으로 변환 

코틀린의 기본 가시성은 public 으로 변경자를 생략해도 된다. val type으로 final 변수를 대체한다.

class Person(val name: String)

프로퍼티

class Person(
// 읽기 전용 프로퍼티로, 코틀린은 (비공개) 필드와 필드를 읽는 단순한 (공개) 게터를 만들어 낸다. 
		val name: String, //private final String name
// 쓸 수 있는 프로퍼티로, 코틀린은 (비공개)필드, (공개) 게터/세터를 만들어 낸다. 
		var isMarried: Boolean //private Boolean isMarried
)

 

Enum과 when


when은 자바에서 switc문을 대체할 수 있다.

Enum 또한 똑같이 사용 가능하다.

enum class Color(
        val r: Int, val g: Int, val b: Int
) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
    INDIGO(75, 0, 130), VIOLET(238, 130, 238);

    fun rgb() = (r * 256 + g) * 256 + b
}

 

when으로 enum 타입 다뤄보기

fun main() {
    println(getMnemonic(Color.ORANGE))
}
fun getMnemonic(color: Color) =
  when (color) {
      Color.RED -> "Richard"
      Color.ORANGE -> "Of"
      Color.YELLOW -> "York"
      Color.GREEN -> "Gave"
      Color.BLUE -> "Battle"
      Color.INDIGO -> "In"
      Color.VIOLET -> "Vain"
}
enum class Color(
        val r: Int, val g: Int, val b: Int
) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
    INDIGO(75, 0, 130), VIOLET(238, 130, 238);

    fun rgb() = (r * 256 + g) * 256 + b
}

Of 출력 됌

 

when에 객체 사용해보기

fun main() {
    println(mix(Color.BLUE,Color.INDIGO))
}
fun mix(c1: Color, c2: Color) =
		when (setOf(c1, c2)) {
		    setOf(Color.RED, Color.YELLOW) -> Color.ORANGE
		    setOf(Color.YELLOW, Color.BLUE) -> Color.GREEN
		    setOf(Color.BLUE, Color.VIOLET) -> Color.INDIGO
		    else -> throw Exception("Dirty color")
		}

 

스마트 캐스트: 타입 검사와 타입 캐스트를 동시에

코틀린에선 is로 타입 검사를 한다. 자바에선 instanceof이지만 is를 사용하면 캐스팅을 하지 않아도 자동으로 캐스팅해준다.

 

fun eval(e: Expr): Int {
    if (e is Num) {
        val n = e as Num
        return n.value
    }
    if (e is Sum) {
        return eval(e.right) + eval(e.left)
    }
    throw IllegalArgumentException("Unknown expression")
}

 

for문


fun main(args: Array<String>) {
    for (i in 100 downTo 1 step 2) {
        print(fizzBuzz(i))
    }
}

 

In으로 컬렉션이나 원소 검사하기

fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's a digit!"
    in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    else -> "I don't know…"
}

 

예외 처리


// 조건이 참이면 number의 값이 초기화되고 거짓이면 초기화되지 않고 throw를 호출한다. 
val number = try {
    Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
    return // 예외가 발생한 경우 catch 블록 다음의 코드는 실행되지 않는다. 
}

댓글