쟈미로그
[Kotlin] 자바 개발자를 위한 코틀린 입문 - 2 본문
<섹션 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 |