[Kotlin] 2. 코틀린 기초

hansol_kim·2021년 7월 25일
0

kotlin 적응기

목록 보기
1/5
post-thumbnail

Kotlin 1일차

코틀린 기초

다루는 내용

* 함수, 변수, 클래스, enum, 프로퍼티를 선언하는 방법
* 제어 구조
* 스마트 캐스트
* 예외 던지기와 예외 잡기

함수와 변수

코틀린에서는 타입 선언을 생략해도 되고 변경 가능한 데이터보다는 불변한 데이터 사용을 장려한다

Hello World

모든 언어의 필수 입문 코스 "Hello World"를 출력해보자

fun main() {
	println("Hello World")
}
  • 함수 선언시 fun 키워드를 사용한다. fun을 만드는 것은 재미있는 일이다
  • 함수를 최상위 수준에서 정의할 수 있다
  • System.out.printlnprintln
  • 세미콜론 생략

함수

함수는 문(statement)이 아닌 식(expression)이다

또한 코틀린에서는 루프를 제외한 대부분의 제어구조가 식(expression)이다

fun max(a: Int, b: Int): Int {
	return if (a > b) a else b
}

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

Tip) 인텔리제이에서 위 함수 모양을 아래의 모양으로 바꾸려면 option+enter를 사용하면 된다

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

위의 모양과 같이 return type을 생략할 수도 있다. 이는 컴파일러가 타입을 분석해 정해주는 기능인 타입 추론(type inference)이 있기 때문이다(식이 본문인 함수에서만 생략이 가능하다)

블록이 본문인 함수에서는 return type을 명시하고 return 문을 사용해 반환 값을 명시해야 한다.

변수

자바와는 달리 변수이름 뒤에 타입을 명시하거나 생략하여 사용한다(생략을 할 수 있기 때문에 타입을 먼저 쓰지 않도록 설계되었다)

식이 본문인 함수와 마찬가지로 타입을 생략하면 컴파일러가 초기화 식을 분석해서 초기화 식의 타입을 변수 타입으로 지정한다

  • val : immutable 변수(자바로 치면 final 변수와 같다)
  • var : mutable변수(자바의 일반변수와 같다)

코틀린에서는 기본적으로 val변수를 사용한다.

변경 불가능한 참조와 변경 불가능한 객체를 사용하면 코드가 함수형 코드에 가까워진다. → 함수형 프로그래밍 경험이 부족하여 이 부분을 직접적으로 느껴본 적이 없는데 느껴보고 싶다

문자열 템플릿

fun printName(name: String) = "Hello, $name"

문자열에서 변수를 사용할 때 $ 를 앞에 추가하면 된다 단, 한글이나 복잡한 값을 사용할 때는 ${name} 으로 사용해야한다.

클래스와 프로퍼티

/////////  Java  /////////
public class Person{
	private String name;

	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		  return name;
	}
}

/////////  Kotlin  /////////
class Person(val name: String)

자바와 코틀린의 차이를 보라. 코틀린 클래스 코드 양을 보니 자바 개발자로서 어질어질하다.

코틀린의 기본 가시성은 public이므로 따로 접근 제어자를 작성하지 않아도 된다

프로퍼티

클래스에서 프로퍼티 선언시

  • val로 선언한 경우 : read-only → Java에서 getter만 제공
  • var로 선언한 경우 : read-write → Java에서 getter, setter 제공
fun main() {
    val person = Person("gildong", false)
    person.isMarried = true ---> ⭕️
    person.name = "chulsoo" --->}

class Person(val name: String, var isMarried: Boolean)

커스텀 접근자

코틀린 소스코드 구조 : 디렉토리와 패키지

코틀린은 자바에 비해 여러 클래스를 한 파일에 넣을 수 있고, 파일의 이름을 마음대로 정할 수 있다. 하지만, 대부분의 경우 자바와 같이 패키지별로 구성하는 것이 좋다. 자바 클래스를 코틀린 클래스로 마이그레이션할 때 생기는 문제를 방지하기 위해서다.

enum과 when

enum 클래스 정의

enum class CommonException(val code: Int, val message: String) {
    OK(200, "OK"),
    CREATED(201, "CREATED"),
    NOT_FOUND(404, "NOT FOUND DATA"),
    INTERNAL_ERROR(500, "INTERNAL ERROR");
    
    fun getExceptionMessage() = "$code : $message"
}

code, message라는 상수의 프로퍼티를 정의한다. 각 상수를 생성할 때 프로퍼티 값을 지정한다.

코틀린에서 유일하게 세미콜론이 필수인 부분을 볼 수 있다. enum 상수와 메서드 사이에는 세미콜론이 필요하다.

when으로 enum클래스 다루기

fun getMessage(commonException: CommonException) = when(commonException) {
    OK, CREATED -> "SUCCESS"
    NOT_FOUND -> "INPUT ARGUMENT ERROR"
    INTERNAL_ERROR -> "SERVER ERROR"
}

comma로 조건을 묶을 수 있고 break문이 필요가 없다

또한, when에서 is를 사용하면 스마트 캐스트가 된다는 것을 알아두자

이터레이션 : while, for

while은 자바에서의 사용법과 같다

for-loop또한 그리 어렵지 않다

for(i in 1..100) {
	println(i)
}

for(i in 100 downTo 1 step 3) {
	println(i)
}

map에서의 iteration을 확인해보자. 직관적으로 와닿기 때문에 더 이상의 설명은 생략한다

val map = mutableMapOf<String, String>()
map.put("hansol", "hansol@naver.com")
map.put("jisoo", "jisoo@naver.com")
map.put("sungjae", "sungjae@naver.com")
map.put("jongyeon", "jongyeon@naver.com")

for((key, value) in map) {
    println("$key : $value")
}

in으로 컬렉션이나 범위의 원소 검사

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'

추가적으로 when에서도 in을 사용할 수 있다

코틀린의 예외 처리

try, catch, finally

자바와 가장 큰 차이는 throws절이 코드에 없다는 점이다. 자바에서는 함수 선언 뒤에 throws IOException을 붙여야 한다.

백준이나 SWExpert 풀때 BufferedReader를 사용하면 자동으로 throws절이 따라옴을 알 수 있다. 이유는 IOException체크 예외이고 자바는 체크 예외를 명시적으로 작성해야한다.

하지만, 코틀린은 체크 예외에서도 명시적으로 작성하지 않아도 된다

profile
1주 1글 실천하자

0개의 댓글