이번 주 같은 경우 Kotlin에 대해 문법 등을 알아가며 이걸 사용해서 문제를 풀면 되었기에, 전에 비해서 덜 빡셀…줄 알았지만 그렇지 않았다. Kotlin이란 언어를 처음 배웠던 만큼 이것저것 헤매는 시간이 많았기 때문이다.

하지만 문법을 배우면서 다른 언어들 - C/C++, Python, Java - 을 떠올려보니 여기서 더 편하게 느낀 부분들도 제법 있었다. 오늘은 계산기 과제를 Kotlin으로 구현하며 배웠던/느꼈던 부분들을 적어볼까 싶다.

배웠던/느꼈던 점

여러 조건에 따라 달라지는 (반환)값을 표현하는 게 더 편해졌다

조건문을 공부할 때 자주 나왔던 “성적에 따른 등급 매기기” 문제 - 점수가 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 60점 이상이면 D, 그 미만이면 F를 등급으로 매기는 문제 - 를 예시로 들면,

// 아래의 구문은 C와 Java 둘 다 동일하게 들어간다.
int your_score = 85;
char grade = '';
 
if(your_score >= 90) grade = 'A';
else if(your_score >= 80) grade = 'B';
else if(your_score >= 70) grade = 'C';
else if(your_score >= 60) grade = 'D';
else grade = F;
your_score: int = 80
grade: str = 0
 
if your_score >= 90: grade = 'A'
elif your_score >= 80: grade = 'B'
elif your_score >= 70: grade = 'C'
elif your_score >= 60: grade = 'D'
else: grade = 'F'

같이 쓸 수 있다. Python의 경우 CJava에 비해

  • 조건을 소괄호로 씌우지 않아도 된다
  • else ifelif로 짧아졌다

-는 부분에서 조금 더 편하다(세미콜론(;)을 붙이지 않아도 된다는 것도 있다).

Kotlin 같은 경우에도

val yourScore: Int = 95
val grade: Char = ''
 
if(yourScore >= 90) grade = 'A'
else if(yourScore >= 80) grade = 'B'
else if(yourScore >= 70) grade = 'C'
else if(yourScore >= 60) grade = 'D'
else grade = 'F'

비슷한 틀로 작성할 수 있다. 하지만 굳이 이렇게 쓰지 않고 아래처럼 when 문을 작성하면 if - else if - else의 코드를 좀 더 간결하게 쓸 수 있다:

val yourScore: Int = 95
val grade: Char = when(yourScore) {
	in 90..100 -> 'A'
	in 80..89 -> 'B'
	in 70..79 -> 'C'
	in 60..69 -> 'D'
	else -> 'F'
}

-처럼, CJavaswitch 구문처럼 - Python은 3.10 버전을 통해 match - case 구문이 등장하였다고 한다 - 특정 값에 대하여 해당 값이 범위 안에 들어왔을 때 분기를 가르게 할 수도 있고,

val yourScore: Int = 95
val grade: Char = when {
	yourScore >= 90 -> 'A'
	yourScore >= 80 -> 'B'
	yourScore >= 70 -> 'C'
	yourScore >= 60 -> 'D'
	else -> 'F'
}

-처럼 if - else if - else에서 이 셋을 다 없앤 버전으로도 쓸 수 있다!

… 하지만 개인적으로 본인은 이렇게 길게 쓰지 않고 조건 연산자(Ternary conditional operator)를 사용해 위에서처럼 씀으로부터 오는 귀찮음을 더는 편이다.

int yourScore = 85;
char grade = (yourScore >= 90) ? 'A' : ((yourScore >= 80) ? 'B' : ((yourScore >= 70) ? 'C' : ((yourScore >= 60) ? 'D' : 'F')));
your_score: int = 80
grade: str = 'A' if your_score >= 90 else ('B' if your_score >= 80 else ('C' if your_score >= 70 else ('D' if your_score >= 60 else 'F')))

자바나 파이썬 둘 다

// result = <condition> ? <valueIfTrue> : <valueIfFalse>;
# result = <value_if_true> if <condition> else <value_if_false>

-와 같이 특정 조건에 대하여 참일 경우와 거짓일 경우 가질 값들을 표현할 수 있기 때문에 else if 같이 초기 - 혹은 그 아래의 - 조건에 걸리지 않았지만 다른 조건을 만족할 때 주고 싶은 값을 표현하기 위해선 거짓일 때 주는 값을 또 중첩으로 조건 연산자로 표현해야 했었다. 하지만 Kotlin은…

val yourScore: Int = 95
val grade: Char = if (yourScore >= 90) 'A' else if (yourScore >= 80) 'B' else if (yourScore >= 70) 'C' else if (yourScore >= 60) 'D' else 'F'

처럼 표현하면 된다! 이렇게 if - else if - else가 묶여서 쓰여도 문제가 없다(근데 이렇게 쓰는 게 조건 연산자를 썼다고 하는 건 아니다. 존재하지 않는다고 한다). 그리고 나중에 Python에서 조건 연산자를 사용할 때 저렇게 괄호를 중간중간에 씌우지 않아도 된다는 것을 알았다. 하지만 괄호를 없애면 뭔가 가독성이 떨어지는 느낌이다.

파일 이름과 클래스명을 맞추지 않아도 된다

이건 Java에 대한 이야기인데, 파일명을 정해 놓으면 반드시 그 이름으로 된 public class가 있어야 한다. 가령 Calculator.java가 있다면 그 안에 반드시 public class Calculator가 있어야 한다는 것이다.

근데 Kotlin에선 그런 게 문제가 되지 않는 것으로 보인다. 아예 Operation.kt 파일 아래에

class AddOperation {}
class SubtractOperation {}
class MultiplyOperation {}
class DivideOperation {}
class RemainderOperation {}

처럼 Operation 이름의 class가 없어도 된다!

값 출력이 어렵지 않고 직관적이다

C/C++Java를 쓰다 보면 변수 값을 포함하여 문자가 일부 섞인 채로 출력할 때 번거로움이 있다. 예를 들어

당신의 성적은 <점수>점이고 등급은 <등급> 입니다.

를 출력하고 싶다면…

printf("당신의 성적은 %d점이고 등급은 %c입니다.\n", your_score, grade);
cout << "당신의 성적은" << your_score << "점이고 등급은 " << grade << "입니다." << endl;
System.out.println("당신의 성적은 " + yourScore + "점이고 등급은 " + grade + "입니다.");
// System.out.printf("당신의 성적은 %d점이고 등급은 %c입니다.\n", your_score, grade);

처럼 써야 하는데,

  • C는 문장 중간에 포맷을 넣어줘야 한다.
  • C++는 문장들을 여러 개 이을 때 <<을 붙여줘야 한다.
  • Java는 문장들을 여러 개 이을 때 +을 붙여줘야 한다(C++보단 좀 더 직관적이다)(아래처럼 Cprintf를 사용할 수도 있다).

-의 이유로 뭔가 쓰기가 좀 귀찮았다. Python

print(f"당신의 성적은 {your_score}점이고 등급은 {grade}입니다.")

-처럼 f-string을 사용하여 C++Java보다는 더 간단하게, C보다는 더 직관적으로 문장을 표현할 수 있었기에 Python으로 코드를 짤 때 애용했었다.

KotlinPython과 비슷하게

println("당신의 성적은 ${yourScore}이며 등급은 ${grade}입니다.")

-처럼 String template를 사용하여 출력할 수 있다! 게다가 자동으로 템플릿 안에 들어간 값들을 String으로 바꿔주기까지 한다(.toString()을 불러서).


한 사이트에서 Spring 코드를 만듦에 있어 같은 내용에 대한 JavaKotlin 간의 길이 차이를 본 적이 있었는데, 엄청나게 간결해지는 걸 보고 Kotlin을 배워보고 싶단 생각을 하게 되었고, 이번 기회에 그 소망을 이룰 수 있게 되었다. 아직은 알아가보는 단계라 손에 익지 않아 코드를 짜는 속도가 느리고, 조금 어색한 개념들 - Null Safety 등 - 도 있다. 근데 좀 쓰다 보면… 괜찮아지지 않을까?