코틀린 제어문, 반복문, 예외, 함수

de_sj_awa·2023년 4월 15일
0
post-custom-banner

1. 제어문

1) if문, Expression과 Statement

  • Java와 Kotlin의 if-else문의 사용법은 동일하지만, Java에서 if-else는 Statement이지만, Kotlin에서는 Expression이다.
  • Statement : 프로그램의 문장, 하나의 값으로 도출되지 않는다.(ex) 30 + 40, Java의 3항연산자)
  • Expression : 하나의 값으로 도출되는 문장
  • Kotlin에서는 if-else를 expression으로 사용할 수 있기 때문에 3항 연산자가 없다.
  • Kotlin에서는 if~else if~else 문도 하나의 statement로 사용할 수 있기 때문에 return을 가장 앞에 붙이고 전체를 하나로 취급할 수도 있다.
fun getGrade(score: Int):String {
	return if (score >= 90) {
    	"A"
    } else if (score >= 80) {
    	"B"
    } else if (score >= 70) {
    	"C"
    } else {
    	"D"
    }
}
  • Kotlin에서 어떤 값이 특정 범위에 포함되어 있는지, 포함되어 있지 않은지 다음과 같이 작성할 수 있다.
if (score in 0..100) {

2) switch와 when

  • Java에서 switch를 사용하고 Kotlin에서는 when을 사용한다.
  • 코틀린에서 when 문법은 아래와 같다.
when() {
	조건부 -> 어떠한 구문
    조건부 -> 어떠한 구문
    else -> 어떠한 구문
}
  • 조건부에는 어떠한 expression이라도 들어갈 수 있다.
fun getGradeWithSwitch(score: Int): String {
	return when (score / 10) {
    	9 -> "A"
        8 -> "B"
        7 -> "C"
        else -> "D"
    }
}
fun getGradeWithSwitch(score: Int): String {
	return when (score) {
    	in 90..99 -> "A"
        in 80..89 -> "B"
        in 70..79 -> "C"
        else -> "D"
    }
}
fun judgeNumber(number: Int) {
	when (number) {
    	1, 0, -1 -> println("1, 0, -1입니다.")
        else -> println("1, 0, -1이 아닙니다.")
    }
}
fun judgeNumber2(number: Int) {
	when {
    	number == 0 -> println("주어진 숫자는 0입니다.")
        number % 2 -> println("주어진 숫자는 짝수입니다")
        else -> println("주어지는 숫자는 홀수입니다")
    }
}
  • Kotlin에서는 주어지는 값 없이 ealry return처럼 활용할 수 있다.
  • Kotlin의 when은 Enum class 혹은 Sealed Class와 함께 사용할 경우, 더욱 유용하게 사용할 수 있다.

2. 반복문

1) for-each문(향상된 for문)

val numbers = listOf(1L, 2L, 3L)
for (number in numbers) {
	println(number)
}
  • Java에서는 :을, Kotlin에서는 in을 사용한다.

2) 전통적인 for문

for (i in 1..3) {
	println(3)
}
for (i in 3 downTo 1) {
	println(i)
}
for (i in 1..5 step 2) {
	println(i)
}
  • Koltin에서 전통적인 for문은 등차수열을 이용한다.

3) Progression과 Range

  • .. 연산자 : 범위를 만들어 내는 연산자
  • IntRange 클래스는 IntProgression 클래스를 상속받고 있다.
  • downTo, step도 함수이다. (중위 호출 함수 : 변수.함수이름(argument) 대신 변수 함수이름 argument)

4) while문

  • Java와 Kotlin이 동일하다.
var i = 1
while (i <= 3) {
	println(i)
    i++
}

3. 예외

1) try~catch~finally 구문

  • Java와 Kotlin의 사용법이 동일하다.
fun parseIntOrThrow(str: String): Int {
	try {
    	return str.toInt()
    } catch (e: NumberFormatException) {
    	throw IllegalArgumentException("주어진 ${str}는 숫자가 아닙니다")
    }
}
fun parseIntOrThrowV2(str: String): Int? {
	return try {
    	str.toInt()
    } catch (e: NumberFormatException) {
    	null
    }
}
  • Kotlin에서는 try~catch 문도 하나의 Expression으로 간주된다.

2) Checked Exception과 Unchecked Exception

  • Java에서 Checked Exception의 경우 반드시 이 메소드를 사용할 경우에는 메소드 시그니처에 체크 예외가 날 수 있다는 표시를 해줘야 한다. 그러나 Kotlin에서는 throws 구문이 없다.
  • Kotlin에서는 Checked Exception과 Unchecked Exception을 구분하지 않는다. 모두 Unchecked Exception이다.

3) try with resources

  • Java에서 try ()로 괄호 안에 외부 자원을 만들어주고 try가 끝나면 자동으로 이 외부 자원을 닫아준다.
  • Kotlin에서는 try~with~resources 구문 자체가 사라지고 .use라는 inline 확장함수를 사용한다.
public void readFile(String path) throw IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
        System.out.println(reader.readLine());
    }
}
fun readFile(path: String) {
	BufferedReader(FileReader(path)).use{ reader -> 
    	println(reader.readLine())
    }
}

4. 함수

1) 함수 선언 문법

fun max(a: Int, b: Int) = if (a > b) a else b
  • fun은 함수를 의미하는 키워드이다.
  • 접근 제한자 public은 생략 가능하다.
  • 함수의 매개변수는 매개명수명: 타입으로 구분된다.
  • 함수의 반환타입은 Kotlin의 Unit은 생략 가능하다.
  • 함수가 하나의 결과값이면 block 대신 = 사용 가능하다. 이때는 반환 타입 생략이 가능하다.
  • Block을 사용하는 경우에 반환 타입이 Unit이 아니면 명시적으로 작성해야 한다.
  • 함수는 클래스 파일 안에 있을 수도 있고, 파일 최상단에 있을 수도 있다.

2) default parameter

fun repeat(
	str: String,
    num: Int = 3,
    useNewLine: Boolean = true
) {
	for (i in 1..num) {
    	if (useNewLine) {
        	println(str)
        else {
        	print(str)
        }
    }
}
  • Kotlin에서는 밖에서 파라미터를 넣어주지 않으면 기본값을 사용한다.
  • Kotlin에서도 Java와 동일하게 오버로드 기능이 있다.

3) named argument(parameter)

repeat("Hello World", useNewLine = false)
  • 함수를 호출하는 쪽에서 매개변수에 이름을 직접 지정해 줄 수 있다. 지정되지 않은 매개변수는 기본값을 사용한다.
  • 이 기능의 장점은 builder를 직접 만들지 않고 builder의 장점을 가지게 된다.
  • Kotlin에서 Java 함수를 가져다 사용할 때는 named argument를 사용할 수 없다.

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

  • Java에서는 가변인자를 쓸 때 타입... 과 같이 작성한다. 또한 호출한 쪽에서는 배열을 직접 넣거나 comma를 이용해 여러 파라미터를 넣는다.
public static void printAll(String... strings) {
	for (String str : strings) {
    	System.out.println(str);
    }
}

String[] array = new String[]{"A", "B", "C};
printAll(array);

printAll("A, "B, "C);
  • Kotlin에서는 가변인자를 쓸 때 vararg를 써준다. 그리고 사용하는 쪽에서는 배열을 쓰거나 comma로 구분한다. 배열을 사용해 넣어줄 때는 *(spread 연산자 : 배열 안에 있는 요소를 ,를 쓰는 것처럼 꺼내준다.)를 배열 앞에 붙여줘야 한다.
fun printAll(vararg strings: String) {
	for (str in strings) {
    	println(str)
    }
}

printAll("A", "B", "C)

val array = arrayOf("A", "B", "C")
printAll(*array)

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글