프로그래밍 노트/Kotlin

필수적인 함수: filter 와 map filter함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. data class Person(val name: String, val age: Int) fun main() { val list = listOf(1, 2, 3, 4) println(list.filter { it%2 == 0 }) val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.filter { it.age > 30 }) } filter 함수는 컬렉션에서 원치 않은 원소를 제거한다. 하지만 filter는 원소를 변환할 수는 없다. 원소를 변환하려면 map 함수를 사용해..
코틀린 람다 맛보기 컬렉션에서 직접 탐색하기 data class Person(val name: String, val age: Int) fun findTheOldest(people: List){ var maxAge = 0 var theOldest: Person? = null for(person in people){ if(person.age > maxAge){ maxAge = person.age theOldest = person } } println(theOldest) } >> val people = listOf(Person("Corn", 31), Person("HB", 27)) >> findTheOldest(people) Person(name=Corn, age=31) 경험이 많은 개발자라면 순식간에 이런 ..
object 키워드를 사용하는 여러 상황 객체 선언(object declaration)은 싱글턴을 정의하는 방법 중 하나다. 동반 객체(companion object)는 인스턴스 메소드는 아니지만 어떤 클래스와 관련 있는 메소드와 팩토리 메소드를 담을 때 쓰인다. 동반 객체 메소드에 접근할 때는 동반객체가 포함된 클래스의 이름을 사용할 수 있다. 객체 식은 자바의 무명 내부 클래스(anonymous inner class)대신 쓰인다. 객체선언: 싱글턴을 쉽게 만들기 코틀린은 객체 선언 기능을 통해 싱글턴을 언어에서 기본 지원한다. 객체 선언은 클래스 선언과 그 클래스에 속한 단일 인스턴스 의 선언을 합친 선언이다. 한 회사에 여러 급여 대장이 필요하지 않을테니 회사 급여 대장은 싱글턴으로 쓰는게 정당하다..
코틀린 컴파일러는 equals, hashCode, toString 등의 메소드를 기계적으로 생성하는 작업을 보이지 않는 곳에서 해준다. 따라서 필수 메소드로 인한 잡음 없이 소스코드를 깔끔하게 유지할 수 있다. 이제 코틀린 컴파일러가 데이터 클래스에 유용한 메소드를 자동으로 만들어주는 예와 클래스 위임 패턴을 아주 간단하게 쓸 수 있게 해주는 예를 살펴보자. 모든 클래스가 정의해야 하는 메소드 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드할 수 있다. // 고객 이름과 우편번호를 저장하는 간단한 Client 클래스 class Client(val name: String, val postalCode: Int) 문자열 표현: toString() class C..
인터페이스에 선언된 프로퍼티 구현 코틀린에서는 인터페이스에 추상 프로퍼티를 선언할 수 있다. interface User{ val nickname: String } 이 인터페이스를 구현하는 세 클래스를 만들어보자. 이 세 클래스는 각각 다른 방식으로 추상 프로퍼티 nickname을 구현한다. // 주 생성자에있는 프로퍼티 class PrivateUser(override val nickname: String) : User // 커스텀 게터(nickname은 매번 호출될 때마다 substringBefore를 호출해 계산) class SubscribingUser(val email: String) : User{ override val nickname: String get() = email.substringBefo..
코틀린은 주(primary) 생성자와 부(secondary) 생성자를 구분한다. 또한 코틀린에서는 초기화 블록(initializer block)을 통해 초기화 로직을 추가할 수 있다. 주 생성자 : 주로 사용하는 간략한 생성자로, 클래스 본문 밖에서 정의 부 생성자 : 클래스 본문 안에서 정의 클래스 초기화: 주생성자와 초기화 블록 class User(val nickname: String) 이렇게 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 주 생성자(primary constructor)라고 부른다. 주 생성자는 생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는 두 가지 목적에 쓰인다. 실제로는 아래와 같은 일이 벌어진다. class User constructor(_n..
가시성 변경자(visibility modifier): 기본적으로 공개 코트린에서는 아무 변경자도 없는 경우 선언은 모두 공개(public)이 된다. 코틀린에서는 패키지 전용(package-private)은 없다. 코틀린은 패키지를 네임스페이스를 관리하기 위한 용도로만 사용한다. 그래서 패키지를 가시성 제어에 사용하지 않는다. 변경자 클래스 멤버 public(기본 가시성) 모든 곳에서 볼 수 있다. internal 같은 모듈 안에서만 볼 수 있다.(모듈은 한꺼번에 컴파일되는 코틀린 파일들을 의미) protected 하위 클래스 안에서만 볼 수 있다. private 같은 클래스 안에서만 볼 수 있다. internal open class TalkativeButton: Focusable{ private fun ..
코틀린 인터페이스 코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있다. (자바8 디폴트 메소드처럼) interface Clickable{ fun click() } class Button: Clickable{ override fun click() = println("I was clicked") } >> Button().click() I was clicked 자바에서는 extends와 implements 키워드를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)를 붙이고 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현을 모두 처리한다. 코틀린에서는 override 변경자를 꼭 사용해야 한다. interface Clickable{ fun click() ..
코틀린에서는 함수에서 추출한 함수를 원 함수 내부에 중첩시킬 수 있다. 그렇게 하면 문법적인 부가 비용을 들이지 않고 깔끔하게 코드를 조직할 수 있다. (DRY. Don't Repeat Yourself) 흔히 발생하는 코드 중복을 로컬(local)함수를 통해 어떻게 제거할 수 있는지 살펴보자. 사용자를 데이터베이스에 저장하는 함수가 있다. 이때 데이터베이스에 사용자 객체를 저장하기 전에 각 필드를 검증해야 한다. class User(val id: Int, val name: String, val address: String) fun saveUser(user: User){ if(user.name.isEmpty()){ throw IllegalArgumentException("Can't save ..
1. 문자열 나누기 코틀린에서는 자바의 split 대신에 여러 가지 다른 조합의 파라미터를 받는 split 확장 함수를 제공함으로써 혼동을 이야기하는 메소드를 감춘다. 정규식을 파라미터로 받는 함수는 String이 아닌 Regex 타입의 값을 받는다. >>> println("12.345-6.A".split("\\.|-".toRegex())) // 정규식을 명시적으로 만든다. [12, 345, 6, A] 코틀린에서는 toRegex 확장 함수를 사용해 문자열을 정규식으로 변환할 수 있다. >>> println("12.345-6.A".split(".", "-")) // 여러 구분 문자열을 지정한다. [12, 345, 6, A] // 문자열 대신 문자를 인자로 넘겨도 마찬가지 결괄르 볼 수 있다. 2. 정규식과..
깡냉쓰
'프로그래밍 노트/Kotlin' 카테고리의 글 목록 (2 Page)