본문 바로가기
언어/Kotlin

Java와 비교하는 Kotlin - 변수와 함수

by 개발짜 2022. 11. 5.

변수 선언하기

// val과 var 변수의 차이
val data1 = 10
var data2 = 10


fun function() {
    data1 = 20 // 오류
    data2 = 20
}

// 초깃값 할당
val data3:Int // 오류

// 변수 타입 지정과 타입 추론
val data4: Int = 10 // 타입 지정
val data5 = 10 // 타입 추론
  • val 또는 var 키워드를 사용하여 변수를 선언
  • 초깃값 할당을 해주지 않으면 컴파일 오류
  • 초기화를 미루기 위해서는 lateinit, lazy 키워드 이후에 초깃값을 할당할 것임으로 명시적으로 선언해야 한다.

 

 

lateinit 키워드 규칙 2가지
  • lateinit 은 var 키워드로 선언된 변수에만 사용할 수 있다.
  • Int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용할 수 없다.

 

lazy 키워드
val data: Int by lazy {
    println("in lazy....")
    10
}

fun mainKotlinFunction() {
    println("in main....")
    println(data + 10)
    println(data + 10)
}

[실행 결과]
in main....
in lazy....
20
20
  • lazy 키워드는 변수 선언문 뒤에 by lazy { } 형식으로 선언
  • 소스에서 변수가 최초로 이용되는 순간 중괄호로 묶는 부분이 자동으로 실행됨

자바와 차이점

// 변수 초깃값 할당
int data1 = 10;
int data2;

void mainJavaFunction() {
    data1 = 20;
    data2 = 20;
}

// 변수 타입 지정
Integer data3 = 10;
String data4 = "10";
  • 변수 선언시 변수 타입을 반드시 지정을 해야 한다
  • 변수 선언시 초기값 할당을 하지 않아도 컴파일 오류가 안 난다
  • lateinit이나 lazy 같은 초깃값 할당 할 때 사용하는 키워드 없음

데이터 타입

// Int 타입에 null 대입과 메서드 이용
fun someFun() {
    var data1: Int = 10
    var data2: Int? = null // null 대입 가능
    
    data1 = data1 + 10
    data1 = data1.plus(10) // 객체의 메서드 이용 가능
}
  • 코틀린의 모든 변수는 객체이다. 따라서 Int는 기초 데이터 타입이 아니라 클래스이다.
  • 코틀린에 최상위 클래스는 Any이다. 자바의 Object 클래스와 유사하다.
  • 코틀린의 Unit은 반환문이 없는 함수 타입으로 자바의 void 타입과 유사하다.

 

Nothing - null이나 예외를 반환하는 함수

// Nothing 사용 예
val data1: Nothing? = null
  • Nothing으로 선언한 변수에는 null만 대입할 수 있음 => 따라서 Nothing으로 선언한 변수는 데이터로서 의미가 X
// null 반환 함수와 예외를 던지는 함수
fun some1(): Nothing? {
    return null
}

fun some2(): Nothing {
    throw Exception()
}

자바와 차이점

  • 자바와 가장 다른 차이점은 코틀린은 타입에 Null 허용(자바도 초깃값에는 null이 허용)
  • Null 허용은 타입 뒤에 물음표를 추가하면 널 허용으로 선언한다.

함수 선언하기

// 함수 선언하기
fun 함수명(매개변수명: 타입): 반환타입 { // 반환타입 명시적으로 선언 안해도 됨
	... 
}
  • 함수의 매개변수에는 기본값을 선언할 수 있다.
  • 매개변수에 기본값을 선언했다면 호출할 때 인자를 전달하지 않아도 명시한 기본값이 적용된다.

 

// 매개변숫값 변경 오류
fun some(data1: Int) {
    data1 = 20 // 오류
}
  • 함수의 매개변수에는 var나 val 키워드를 사용할 수 없음
  • val이 자동으로 적용되며 함수 안에서 매개변숫값을 변경할 수 없다.

 

// 기본값 활용
fun some(data1: Int, data2: Int = 10): Int {
    return data1 * data2
}
println(some(10))
println(some(10, 20))

[실행 결과]
100
200

// 매개변수명을 지정하여 호출
println(some(data2 = 20, data1 = 10))

[실행 결과]
200

 

  • 함수의 매개변수에는 기본값을 선언할 수 있다.
  • 매개변수에 기본값을 선언했다면 호출할 때 인자를 전달하지 않아도 명시한 기본값이 적용된다.
  • 매개변수 명을 지정할 수 있음 => data1에 10, data2 20

자바와 차이점

// 매개변수 값 변경 가능
void some(int data) {
    data = 10;
}

// 기본값 지정 불가
String some2(String data, String data2 = "data2") { // 오류
    data = "str";
    return data;
}

// 매개변수명을 지정하여 호출 불가
String some2(data2 = "data1", data1 = "data2") // 오류
  • 함수 선언 시 함수 타입을 명시해주어야 한다.
  • 매개변수 값 변경 가능
  • 매개변수 값의 기본값은 없고, 매개변수 명을 지정하여 호출 불가능

컬렉션 타입

Array

선언 

val data1:Array<Int> = Array(3, {1})

선언과 동시에 값 할당 

val str = arrayOf<String>("a", "b", "c")

 

컬렉션의 가변 타입과 불변 타입성

구분 타입 함수 특징
List List listOf() 불변
MutableList mutableListOf() 가변
Set Set setOf() 불변
MutableSet mutableSetOf() 가변
Map Map mapOf() 불변
MutableMap mutableMapOf() 가변

 

 

댓글