쟈미로그

[Kotlin] 자바 개발자를 위한 코틀린 입문 - 2 본문

Kotlin

[Kotlin] 자바 개발자를 위한 코틀린 입문 - 2

쟈미 2023. 7. 16. 20:09

<섹션 2 - 코틀린에서 코드를 제어하는 방법>

05. 코틀린에서 조건문을 다루는 방법

1. if문

if-else문은 기본적으로 자바-코틀린 문법이 동일함.

하지만 다른점이 있는데,

자바에서 if-else는 Statement지만 코틀린에선 Expression임!!!

  • Statement : 프로그램의 문장, 하나의 값으로 도출되지 않음
  • Expression : 하나의 값으로 도출되는 문장

그렇기 때문에 마치 자바의 삼항연산자처럼 아래같이 표현이 가능함. (그래서인지 코틀린에는 삼항연산자가 따로 없다)

fun getPassOrFail(score: Int): String {
    return if (score >= 50) {
        "P"	
    } else {
        "F"
    }
}

 

 

2. when

자바의 switch문을 코틀린에선 when으로 표현할 수 있음.

<when의 특징>

  • Expression이라서, 바로 값을 반환할 수 있음
  • 특정값으로만 분기할 수 있는 switch와 달리, when은 조건으로도 분기칠 수 있음

when의 이런 특징들을 이용하면 다양한 형태로 when을 사용할 수 있음!

 

  • 예시 1) expression + 조건 분기 활용
// java
private boolean startsWithA(Object obj) {
	if (obj instanceof String)
		return ((String) obj).startsWith("A");
	else 
		return false;
}
// kotlin
fun startsWithA(obj: Any): Boolean {
	return when(obj) {
		is String -> obj.startsWith("A")
		else -> false
	}
}
  • 예시 2) 조건값이 없는 경우
fun judgeNumber(number: Int) {
	when {
    	number == 0 -> println("주어진 숫자는 0입니다")
        number % 2 == 0 -> println("주어진 숫자는 짝수입니다")
        else -> println("주어진 숫자는 홀수입니다")
    }
}

 

when은 Enum이나 Sealed 클래스와 함께 쓰면 더 진가를 발휘한다!

06. 코틀린에서 반복문을 다루는 방법

1. for-each문

val numbers = listOf(1L, 2L, 3L)
    for (number in numbers) {
        println(number)
	}
}

자바와 거의 동일.

콜론(:) 대신 in을 쓴다는 정도만 다름.

 

 

2. 전통적인 for문

마찬가지로 in을 사용해서 범위를 지정함!

  • n씩 증가
for (i in 1..5 step 2)
	println(i)
  • 감소
for (i in 3 downTo 1)
	println(i)

 

 

3. Progression과 Range

  • .. 연산자

..연산자는 IntRange 객체를 반환함

-> IntRange는 IntProgression을 상속받고 있음

-> IntProgression을 상속받을 때, step값을 디폴트 1로 세팅하고 있음

-> 그래서 ..연산자가 1씩 증가하도록 동작하는 것!

 

  • downTo, step 모두 메소드임 (중위 호출 함수)

 

 

4. while문

while과 do-while문 모두 자바와 동일한 문법.


07. 코틀린에서 예외를 다루는 방법

1. try-catch-finally 구문

자바와 문법은 거의 동일하지만, Expression이라는 차이가 있음.

fun parseIntOrThrow(str: String): Int? {
	return try {
    	str.toInt()
    } catch (e: NumberFormatExpression) {
   		null
    }
}

 

 

2. Checked Exception, Unchecked Exception

코틀린에선 checked exception과 unchecked exception을 구분하지 않는다!!!

모두 unchecked exception임!!

 

 

3. try-with-resources

// java
public boid readFile(String path) throws IOException {
	try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
    	System.out.println(reader.readLine());
    }
}

try-with-resources 구문은 JDK7부터 추가됐음.

그러나 코틀린엔 이 구문이 없다!

 

대신, 코틀린의 특성을 이용해서 만든 use라는 inline 확장함수를 사용하면 위 구문과 같은 결과를 낼 수 있음.

// kotlin
fun readFile(path: String) {
	BufferedReader(FileReader(path)).use {
    	reader -> println(reader.readLine())
    }
}

08. 코틀린에서 함수를 다루는 방법

1. 함수 선언 문법

코틀린의 expression 특성과, = 키워드를 결합해서 메소드를 표현할 수 있음.

-> 함수가 하나의 결과값을 도출한다면 block대신 =을 바로 사용할 수 있음!

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

: a, b모두 Int니 타입추론 가능으로 반환타입을 제거할 수 있고, 코드블락대신 =을 사용하는 등 극한으로 코드를 줄일 수 있음

 

 

2. default parameter

자바에선 오버로딩으로 아래와 같은 코딩이 가능함.

public void repeat(String str, int num, boolean useNewLine) {
	// 반복 수행 로직
}

public void repeat(String str, int num) {
	repeat(str, num, ture);
}

public void repeat(String str) {
	repeat(str, 3, true);
}

그런데 이런 코드가 메소드 중복처럼 느껴진다면??

-> 코틀린에선 이 문제를 default parameter로 해결할 수 있음!!

 

fun repeat(
	str: String,
    num: Int = 3,
    useNewLine: Boolean = true
) {
	// 반복 수행 로직
}

위와 같이 파라미터에 디폴트 값을 넣어줄 수 있음.

 

 

3. named argument

바로 위의 코틀린 repeat메소드를 호출할 때

num은 디폴트값(3)을 쓰고, useNewLine은 다른 값을 지정해서 넣어주고 싶다면 어떻게 해야할까?

-> repeat("a", useNewLine = false) 처럼 매개변수 이름을 통해 직접 값을 지정할 수 있음!

-> 이 장점은 Builder를 만들지 않고도 Builder의 효과를 가질 수 있다는 것!!!

 

자바 코드와 혼용할 땐 named argument를 사용할 수 없음..

 

 

4. 같은 타입의 여러 파라미터 받기 (가변인자)

N개의 동일한 타입을 같는 여러개의 파라미터를 받는 경우,

  • 자바) 선언과 사용
// 1. 선언
public static void printAll(String... Str) {
	// 로직
}

// 2-1. 사용 예시
String[] array = new String[]("a", "b");
printAll(array)
// 2-2. 사용 예시
printAll("a", "b")

 

  • 코틀린) 선언과 사용
// 1. 선언
fun printAll(vararg str: String) {
	// 로직
}

// 2-1. 사용 예시
val array = arrayOf("a", "b")
printAll(*array)
// 2-2. 사용 예시
printAll("a", "b")

코틀린의 경우 이렇게 선언 시에는 vararg 키워드를 사용하고,

사용 시엔 스프레드 연산자(*)을 사용해야함.

'Kotlin' 카테고리의 다른 글

코루틴 입문 - 1. 코루틴 기초  (1) 2023.09.10
[Kotlin] 자바 개발자를 위한 코틀린 입문 - 1  (0) 2023.07.02
Comments