본문 바로가기

코틀린

(34)
코틀린(Kotlin) - 클래스 계층 정의 코틀린 인터페이스 코틀린 인터페이스 안에는 추상 메소드뿐 아니라, 구현이 있는 메소드도 정의할 수 있습니다. /** 간단한 인터페이스 구현 */ interface Clickable { fun click() } class Button : Clickable { override fun click() = println("클릭") } >>> Button().click() 클릭 자바에서는 extends와 implements를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스를 명시하는 것으로 상속과 인터페이스 구현을 처리합니다. 오버라이드 하는 경우, 자바의 @Override 어노테이션과 비슷하게 코틀린에서는 override라는 키워드를 사용합니다. /** 인터페이스 안에, 구현이 ..
코틀린(Kotlin) - 리팩토링 : 로컬 함수와 확장 함수로 코드 중복 없애기 우리가 생각하는 좋은 코드의 중요한 특징 중 하나가 "중복이 없는 것" 이라고 생각합니다. 흔히 "두번 이상 반복적으로 사용되는 로직은 따로 빼서 재활용할 수 있도록 해라."라는 말도 있죠 ㅎㅎ 그래서 리팩토링을 통해, 긴 메소드를 부분 부분 기능을 나눠서 따로 떼어내는 작업을 하게 되는데, 하지만 그렇게 코드를 리팩토링 하게 되면, 클래스 안에 작은 메소드들이 너무 많아지게 되고, 각 메소드 사이의 관계를 파악하기가 쉽지가 않아서, 오히려 코드를 이해하기 더 어려워지는 상황이 발생하게 됩니다... 그렇다고, 따로 떼어낸 메소드들을 모아서 내부 클래스(inner class) 안에 넣자니, 코드는 깔끔해지긴 하는데 그에 따른 불필요한 작업들이 늘어나게 됩니다. 하지만 우리에겐 코틀린이 있고, 코틀린에는 더..
코틀린(Kotlin) - 확장 함수 만들기 자바 컬렉션에는 디폴트 toString()이 구현되어 있습니다. 하지만, 그 디폴트 toString()의 출력 형식은 고정되어 있기 때문에, 우리에게 필요한 형식이 아닐 수도 있습니다. val list = listOf(1, 2, 3) >>> println(list) //디폴트 toString() 호출 [1, 2, 3] 위의 디폴트 구현과 달리, 우리 입맛대로 toString()을 커스텀 하고 싶다면 어떻게 해야 할까요? 코틀린에는 이런 요구 사항을 처리할 수 있는 함수가 표준 라이브러리에 이미 탑재 되어 있습니다! 확장함수(Extension Function) 라고 하며, 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 기능입니다. 우선 먼저, 알고가야할 개념으로는 "코틀린에서는 함수를 클..
코틀린(Kotlin) - 컬렉션 만들기 코틀린에서는 단순하게 컬렉션을 만들 수가 있습니다. val set = hashSetOf(1, 2, 3) val list = arrayListOf(1, 2, 3) val map = hashMapOf(1 to "one", 2 to "two", 3 to "three") 코틀린은 자신만의 컬렉션 기능을 제공하지 않는다는 것이 특징인데, 이유는 표준 자바 컬렉션을 활용하면 자바 코드와 상호작용 하기가 훨씬 더 쉽기 때문에, 서로 변환할 필요가 없어서 코틀린 컬렉션은 자바 컬렉션과 똑같은 동일 클래스를 사용합니다. 하지만, 코틀린에서는 자바보다 더 많은 기능을 쓸 수 있습니다. 예를 들어, 리스트의 마지막 원소(last)를 가져오거나, 수로 이뤄진 컬렉션에서 최댓값(max)을 찾을 수 있습니다. val list =..
코틀린(Kotlin) - 예외 처리 코틀린의 예외처리(exception)는 자바의 예외처리와 비슷합니다. 함수는 정상적으로 종료할 수 있지만, 오류가 발생하면 예외를 던질 수(throw) 있고, 함수를 호출하는 쪽에서는 그 예외를 잡아 처리할 수 있습니다. 발생한 예외를 함수 호출 단에서 처리(catch)하지 않으면, 함수 호출 스택을 거슬러 올라가면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던지게(rethrow) 됩니다. if (number in 0..100) { number } else { throw IllegalArgumentException("0~100사이의 숫자가 아닙니다.") } >> number = 200 java.lang.IllegalArgumentException: 0~100사이의 숫자가 아닙니다. try, cat..
코틀린(Kotlin) - 이터레이션 : while과 for 루프 코틀린의 특성 중, 자바와 가장 비슷한 것이 이터레이션이라고 할 수 있습니다. 코틀린 while루프는 자바와 동일하므로 간단하게만 알아보고, for 루프는 자바의 for-each루프에 해당하는 형태만! 존재합니다. 결과적으로, for in 이런 형태를 취하고 있습니다. while 루프 코틀린에는 자바와 동일하게, while과 do-while이 있고, 문법은 자바와 동일하며, 코틀린에서 추가한 새로운 기능도 없으니 빠르게 보고 넘어가도록 하겠습니다 ㅎㅎ //while 루프 while(조건) { /*...*/ } //do-while 루프 do { /*...*/ } while(조건) for 루프 수에 대한 이터레이션 앞에서 설명했지만, 코틀린에는 자바의 for 루프(어떤 변수를 초기화하고, 그 변수를 루프를 ..
코틀린(Kotlin) - when과 스마트 캐스트 이번에는, 코틀린의 구성요소 중 when과 스마트 캐스트에 대해 설명하고자 합니다. when은 자바의 switch문을 대치하되, 훨씬 더 강력하며, 앞으로 자주 사용하게 될 프로그래밍 요소라고 생각합니다. 일반적인 when문 fun getNumber(value: Int) { when (value) { 1 -> println("One") 2 -> println("Two") 3 -> println("Three") } } getNumber(1) >> One 값을 리턴하는 when문 when은 코틀린에서 if와 마찬가지로, 값을 만들어내는 "식"의 기능을 할 수 있습니다. 따라서, 식이 본문인 함수에 when을 바로 사용하여 값을 리턴 할 수 있습니다. 단, 주의할 점은 when이 리턴값을 가지는 "식"의 기능..
코틀린(Kotlin) - 클래스와 프로퍼티 이번에는, 코틀린에서 클래스 선언하는 기본 문법을 살펴보고, 코틀린을 활용하면, 더 적은 양의 코드로 클래스와 관련 있는 대부분의 작업을 수행할 수 있다는 사실을 알아보고자 합니다. /** 자바 클래스 Person */ public class Person { private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } } 자바에서는 필드가 둘 이상으로 늘어나면 생성자인 Person(String name)의 본문에서 파라미터를 같은 필드에 대입하는 대입문의 수도 늘어나게 되는데, 코틀린에서는 그런 필드 대입 로직을 훨씬 더 적은 코드로 작성할 수 있습니다. /..