728x90
반응형

개발 36

(코틀린) 동시성

동시성(concurrent) 주제로 코루틴에 대해 알아보겠습니다. 코루틴 코틀린 프로그램에서도 자바 동시성 기본 요소를 쉽게 사용해 스레드 안전성을 이용할 수 있습니다. 하지만 동시성 연산인 Thread.sleep(), Thread.join(), Object.wait()등이 스레드를 블럭하기 때문에 문제가 남아있습니다. 스레드를 블럭하고 나중에 재개하려면 문맥 전환(context switch)를 하면서 성능이슈가 발생할 수 있습니다. 또한 자원을 많이 사용하기 때문에 비효율적입니다. 더 효율적인 접근 방법은 비동기(Asynchronous) 프로그래밍입니다. 동시성 연산에 대해 연산이 완료될 때 호출될 수 있는 람다를 제공할 수 있고, 원래 스레드는 블럭된 상태로 작업 완료를 기다리는 대신 다른 유용한 작..

개발/코틀린 2022.12.11

(코틀린) 자바 상호 운용성

자바 코드를 코틀린에서 사용하기 코틀린은 JVM을 주 대상으로 설계됐기 때문에 자바 코드를 코틀린에서 쉽게 사용할 수 있습니다. 자바 메서드와 필드 Unit과 void 자바에서 void는 코틀린에서 Unit으로 변환되서 사용합니다. 연산자 관습 Map.get()과 같은 몇몇 자바 메서드는 코틀린에서 연산자 관습을 만족합니다. 자바 메서드에는 operator가 붙어있지 않지만 코틀린에서는 연산자처럼 사용할 수 있습니다. 그래서 List나 Map의 get을 코틀린에서는 []로 접근 할 수 있습니다. 합성 프로퍼티 자바에는 합성 프로퍼티가 없고 getter와 setter를 사용하는 일이 많습니다. 이로 인해 코틀린 컴파일러는 자바의 getter와 setter를 일반적인 프로퍼티처럼 사용할 수 있게 변형 해줍니..

개발/코틀린 2022.12.03

(코틀린) 도메인 특화 언어(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
728x90
반응형