본문 바로가기

분류 전체보기

(46)
코틀린: DSL(2/2) - CSV 빌더를 만들어 봅시다. ■ 클래스 FileCSV 앞에서는 한 개의 행 밖에 처리하지 못했습니다. 이제 여러 개 행들을 처리하도록 코드를 추가해 봅시다. 이를 위해 클래스 FileCSV를 만듭니다. 속성 rows는 여러 행을 저장하기 위해 가변 리스트 객체로 선언합니다. 리스트 객체 rows의 원소(=행) 타입은 RowCSV입니다. 메소드 row()는 원소를 리스트 객체 rows에 추가합니다. 재정의 메소드 toString()은 행과 행을 구분하기 위해 줄바꿈 문자('\n')를 추가합니다.class FileCSV { private val rows = mutableListOf() fun row(makeRow: RowCSV.() -> Unit) { val rowCSV = RowCSV().apply(makeRo..
코틀린: DSL(1/2) - CSV 빌더를 만들어 봅시다. DSL은 Domain Specification Language(영역 규정 언어)의 약자입니다. 이름만으로는 선뜻 이해하기 어렵죠. 간단히 DSL은 "언어"입니다. DSL이 언어이지만, c나 파이썬 같은 일반 프로그래밍 언어가 아니라, 응용 분야가 제한된(domain-specific) 언어입니다. 그런 언어가 있나요?  HTML이나 SQL이 바로 DSL입니다. HTML은 웹 페이지를 만들 때, SQL은 데이터베이스 질의어(query)로 사용하죠. 그런데, 엄밀히 따지면 HTML이나 SQL은 여기서 다루려는 코틀린 DSL과는 차이가 있습니다. 코틀린 DSL은 주로 빌더(builder) 역할을 하기 때문입니다. 아래 예를 볼까요. HTML로 웹 페이지를 만들 때 기본 구조입니다.   ...  DSL은 코틀린 ..
4장 - (아주 쉽게 설명한) 다양한 sealed 클래스를 만들어 봅시다. 쉽게 다가가는 최신 프로그래밍: 코틀린 - 4장 클래스의 연습문제 5번을 잘 풀었나요? 문제는 아래와 같습니다.문제 5 교재 p.195-197의 코드는 다형성(polymorphism)을 적용해 다각형의 면적을 계산하는 코드입니다. 이를 sealed class(봉인 클래스)를 사용해 구현하세요.(1) 봉인된 부모 클래스 이름은 Shape, 자식 클래스 이름은 Circle, Rectange, Triangle 입니다.(2) sealed class Shape 안에 자식 클래스를 모두 선언해야 합니다(교재 p.93 코드를 참고하세요). 4장 정답해설을 보고도 잘 이해가 되지 않았나요? 조금 더 자세히 살펴볼까요. sealed 클래스에서 sealed는 "봉인하다"는 뜻입니다. 키스로 봉한 편지(sealed with..
3장 - (아주 쉽게 설명한) 함수를 람다 식으로 변환해 봅시다(2/2). 앞에서 일반 함수를 람다 식으로 변환하는 방법을 설명했습니다. 함수 isPrime()은 어떤 숫자가 소수인지 여부를 판별합니다. 아래 코드는 isPrime()을 return 문을 사용하지 않는 람다 식(방법 2)으로 바꾼 것입니다. val isPrimeLambda: (Int) -> Boolean = { n: Int -> var status: Boolean = true for (i in 2..위 코드를 아래처럼 확~  바꿀 수 있습니다. 코드가 이해되나요?val isPrimeLambda : (Int)-> Boolean = { n: Int -> (n > 1) && (0 !in Array(n-2){ i -> n % (i+2)})}위 코드를 차근차근 분석해 볼까요? 람다 식 블록은 논리 AND..
3장 - (아주 쉽게 설명한) 함수를 람다 식으로 변환해 봅시다(1/2). 일반 함수는 앞에서 다뤘으니 여기서는 람다식을 다루겠습니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 3.3 람다 식 기초 ~ 3.5 람다 식에서 return 문 사용을 참고하기 바랍니다. 소수(prime number)는 1보다 큰 자연수 중 1과 자기 자신만을 약수(divisor)로 갖습니다. 2, 3, 5, 7, 11, 13, 17, 19, ... 가 소수입니다. 아래는 어떤 숫자가 소수인지를 판별하는 프로그램입니다. 여기서 다루려고 하는 내용은 함수 isPrime()을 람다 식으로 바꿔 구현하는 겁니다.fun isPrime(n: Int): Boolean { for (i in 2..일반 함수를 람다 식으로 바꾸려면 함수의 형식인자 타입과 반환값 타입을 람다 식의 함수 타입 선언에..
3장 - (아주 쉽게 설명한) 조합을 계산하는 함수를 만들어 봅시다. 3장 함수에 관한 보충 설명입니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 3.1.4 함수 응용을 참고하기 바랍니다. 함수 사용 방법에 익숙해지는 첫 단계는 자신이 잘 아는 (너무 복잡하지 않은) 수학 공식을 함수로 만들어보는 것입니다. 여기서는 조합(combination) 를 구하는 프로그램을 작성해 보려고 합니다. 조합 C(n, k) = n!/k!(n-k)! 이므로, 조합을 구하려면 계승(factorial)을 구해야 합니다. 3의 계승은 3!=1x2x3=6 입니다. n!에서 n은 자연수(n≥1)이며, n보다 같거나 작은 모든 양의 정수 곱입니다. 0!은 어떻게 정의될까요? 0!=1입니다(^^~). 1!부터 계승을 구하는 게 일반적이죠. 1!은 당연히 1입니다. 함수를 정의할 때 가..
2장 - (아주 쉽게 설명한) enum 클래스와 난수를 사용해 봅시다. 2장 연산자와 흐름 제어에 관한 보충 설명입니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 2장 연산자와 흐름를 참고하기 바랍니다. 아래 조건에 맞는 홀짝 맞추기 프로그램을 만들어봅시다.  (가) 홀수, 짝수는 enum class Number를 사용해야 합니다.(나) 무작위로 컴퓨터가 1부터 100 사이(1과 100을 모두 포함) 정수를 생성합니다.(다) 사용자 예측(“홀수” 또는 “짝수”)을 변수(yourGuess)에 저장합니다.(라) 사용자 예측이 컴퓨터가 생성한 값(computerNumber)의 결과와 같은지 비교합니다.■ 조건(가) : 나열형(enum) 클래스 선언나열형(enum) 클래스를 사용해 홀수와 짝수를 정의합니다. enum은 enumeration(나열이란 뜻)의 첫 4글자..
코틀린: 6장 스레드와 코루틴 - 오류 정정 쉽게 다가가는 최신 프로그래밍: 코틀린 "6장 스레드와 코루틴"에 오타가 있어 정정합니다.■ 393쪽 - withContext 예제(지연 시간 수정)코드를 실행했을 때 "We received 'Hello, Kotlin'"이 출력되지 않을 수 있습니다. main() 함수의 sleep 값이 1_000으로 설정되어 있어 대기 시간이 짧아 출력되지 않는 것입니다. 아래 보인 것처럼 2000L로 수정하기 바랍니다. fun main() { updateUI() Thread.sleep(2000L) // 책은 1_000으로 표시}Long 타입 값을 나타내는 'L'은 생략해도 됩니다. Thread.sleep(2000L) 대신 단순히 sleep(2000L)을 입력하려면, import java.lang.Thread..