728x90
반응형

개발 34

(코틀린) 도메인 특화 언어(DSL)

도메인 특화 언어(Domain-Specific Language, DSL)는 특정 기능이나 영역을 위해 만들어진 언어를 뜻합니다. 연산자 오버로딩 코틀린 내장 연산자에 대해 새로운 기능을 제공하도록 해주는 기능입니다. + 가 수 타입에서는 덧셈 연산이지만 문자열의 경우 연결 연산인고 컬렉션의 경우는 원소를 맨 뒤에 붙이는 연산입니다. 이렇게 + 가 다르게 동작할 수 있는데 연산자 오버로딩이 되어 있기 때문에 가능합니다. 연산자 오버로딩은 operator 키워드를 붙이고 그에 맞는 이름을 붙이면 됩니다. operator fun String.times(n: Int) = repeat(n) fun main() { println("abc" * 3) // abcabcabc println("abc".times(3)) ..

개발/코틀린 2022.11.27

(코틀린) 제네릭스

제네릭 선언을 정의하고 사용하는지 보고 런타임 타입 소거(type erasure)와 구체화(reification)로 인해 제네릭스 사용 시 어떤 문제가 생기는지 보고 같은 제네릭 타입에 대해 타입 파라미터 값이 달라지는 경우까지 하위 타입 관계를 확장함으로써 제네릭스의 유연성을 향상시켜주는 중요한 개념인 변성(variance)에 대해 알아봅니다. 타입 파라미터 제네릭 선언 어떤 선언을 제네릭 선언으로 만들려면 하나 이상의 타입 파라미터를 추가해야 합니다. fun main() { val map = HashMap() val list = arrayListOf() // 컴파일러가 문맥에서 타입 인자를 추론할 수 있으면 생략 가능 val map2: HashMap = HashMap() val list2: Array..

개발/코틀린 2022.11.12

(코틀린) 클래스 계층 이해하기

클래스 상속 개념을 이해하고 하위 클래스를 정의하는 방법을 터득하며 abstract class, interface, 클래스 위임을 통해 복잡한 클래스 계층 구조를 설계하는 방법에 대해서 알아봅니다. 그리고 강력한 스마트 캐스팅을 사용할 수 있는 타입 검사를 가능하게 해주는 대수적 데이터 타입(Alegebraic Data Type, ADT)인 Sealed class에 대해서도 알아봅니다. 상속 객체지향 언어에서 상속은 도메인 개념에 있는 is-a 관계를 표현합니다. is-a는 사람은 동물이고, 자동차는 이동수단과 같은 개념을 의미합니다. 여기서 동물과 이동수단은 상위 클래스(superclass), 기반클래스(base class)라고 부르며 사람과 자동차는 하위 클래스(subclass), 파생클래스(deri..

개발/코틀린 2022.11.06

(코틀린) 컬렉션

컬렉션 요소들을 저장하기 위해 설계된 클래스 입니다. kotlin 표준 라이브러리는 다양한 컬렉션 라이브러리와 컬렉션 안에 데이터를 조작하기 위한 종합적인 api를 제공합니다. 컬렉션을 조작하는 모든 연산이 inline function이라서 함수 호출마다 부가 비용이 들지 않습니다. 컬렉션 타입 컬렉션 타입은 array, iterable, sequence, map으로 4가지로 분류 됩니다. 이터러블 이터러블은 즉시 계산되는 상태가 있는 컬렉션을 표현합니다. 실제로 값을 저장하고 있는 컬렉션 입니다. 원소를 순회할 수 있는 iterator()라는 메소드를 제공하고 for를 이용해서 순회할 수 있습니다. fun main() { val list = listOf("red", "yellow", "green") f..

개발/코틀린 2022.10.30

(코틀린) 특별한 클래스 사용하기

enum class 미리 정의된 상수들로 이뤄진 제한된 집합을 표현하는 클래스 입니다. 보통 enum은 대문자로 정의 합니다. enum class Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } fun Weekday.isWorkday() = this in listOf( Weekday.MONDAY, Weekday.TUESDAY, Weekday.WEDNESDAY, Weekday.THURSDAY, ) fun main() { println(Weekday.MONDAY.isWorkday()) // true println(Weekday.SUNDAY.isWorkday()) // false } 빠뜨린 부분이 없는 when 식 when ..

개발/코틀린 2022.10.23

(코틀린) 함수형 프로그래밍

코틀린을 활용한 함수형 프로그래밍 함수형 프로그래밍은 프로그램 코드를 불변 값을 변환하는 함수의 합성으로 구성할 수 있는 아이디어를 바탕으로 합니다. 함수형 언어는 함수를 일급 객체(first class citizen)으로 취급해서 함수를 일반적인 값처럼 취급합니다. 이렇게 때문에 함수를 변수가 대입하거나 함수의 파라미터나 리턴 값으로 전달 할 수 있습니다. 고차 함수 배열 생성자는 람다를 받아서 배열을 생성함과 동시에 초기화를 할 수 있습니다. val squares = IntArray(5) { n -> n * n } // 0, 1, 4, 9, 16 기존에는 함수 내부 구현을 변경하기가 어려웠다면 고차 함수를 사용하면 실제 동작하는 부분만 외부에서 고차함수로 받아서 처리 할 수 있습니다. fun sum(..

개발/코틀린 2022.10.10

(코틀린) 클래스

클래스 정의하기 클래스 내부 구조 코틀린에서 클래스는 class 키워드와 클래스이름으로 정의합니다. 클래스는 내부에서 변수와 함수를 가질 수 있습니다. class Person { var firstName: String = "" var familyName: String = "" var age: Int = 0 fun fullName() = "$firstName $familyName" fun showMe() { println("${fullName()}: $age") } } Person 클래스이고 firstName, familyName, age라는 프로퍼티가 있고 fullName()과 showMe()라는 함수가 있습니다. 클래스 내부에서 본인 자체에 접근할 때는 this라는 키워드를 사용하고 이를 수신객체라고 ..

개발/코틀린 2022.10.03

(코틀린) 예외처리

코드가 동작하는 중간에 Exception이 발생해서 프로그램이 강제종료 되는 케이스가 발생합니다. 이런 경우 예외처리(Exception Handling)을 통해서 강제종료 되지 않고 에러를 처리 할 수 있도록 합니다. 예외 던지기 예외를 던지기 위해서는 throw 키워드를 사용합니다. fun parseIntNumber(s: String): Int { var num = 0 if (s.length !in 1..31) { throw NumberFormatException("Not a number: $s") } for (c in s) { if (c !in '0'..'1') { throw NumberFormatException("Not a number: $s") } num = num * 2 + (c - '0') ..

개발/코틀린 2022.09.25

(코틀린) 조건문, 반복문

조건문 조건 값에 따라 동작을 수행하지 않을 수도 있고 여러 가지 동작중 하나의 동작을 수행할 수 있습니다. if if를 사용하면 Boolean 값에 따라서 동작을 다르게 수행할 수 있습니다. // if를 사용해서 조건에 따른 값을 다르게 전달할 수 있습니다. fun max(a: Int, b: Int): Int { return if (a > b) a else b } {}를 사용해서 여러 줄의 동작을 수행할 수 있습니다. // 반환값이 있는 if는 else가 필수로 구현되어야 합니다. fun max(a: Int, b: Int): Int { return if (a > b) { println("최대값은 a") a } else { println("최대값은 b") b } } 반환 값이 없는 형태의 if문을 작성할..

개발/코틀린 2022.09.25

(코틀린) 함수

함수 파라미터를 받아서 어떤 값을 반환하는 형태를 함수라고 이야기합니다. 파라미터가 없을 수도 있고 반환 값이 없을 수도 있습니다. 함수의 구조 함수는 fun 키워드를 사용해서 정의합니다. fun functionName(param1: Int, param2: String, param3: Boolean): String { return """ 이 함수의 이름은 \`functionName\`이고 함수의 파라미터는 param1은 Int타입이고 값은 $param1, param2은 String타입이고 값은 $param2, param3은 Boolean타입이고 값은 $param3 입니다. """.trimIndent() } fun noParamNoReturnValue() { // 파라미터와 반환값이 없는 함수도 만들 수 ..

개발/코틀린 2022.09.24
728x90
반응형