본문 바로가기

전체 글

(53)
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..
코틀린: infix expression을 prefix expression으로 변환(5/5) - 괄호 처리 앞의 예제에서는 수식에서 괄호(parentheses)를 처리하지 않았습니다. 괄호를 처리하기 전에 앞의 예제 코드에서 중복 코드가 여러 군데 사용되고 있습니다. 이 코드도 클래스의 멤버 함수로 구현해, 전체 코드를 간략화하겠습니다. 아래 메소드의 while 문에서 실행하는 문장이 중복 코드입니다.private fun handleRemainingOperators() { while (opStack.isNotEmpty()) { val op = opStack.pop() val operand1 = exprStack.pop() val operand2 = exprStack.pop() exprStack.push(op + operand2..
코틀린: infix expression을 prefix expression으로 변환(4/5) - class 앞에서 구현한 코드를 클래스를 사용한 코드로 변환해 볼까요? 클래스 InfixExpression은 4개의 속성(infix, prefix, opStack, exprStack)을 갖습니다. 속성 infix(중위 수식)는 주 생성자(primary constructor)를 사용해 초기화합니다. 반면, 속성 prefix(전위 수식)는 메소드 infixToPrefix()를 실행하기 전까지는 빈 문자열입니다. precedence 등 내부에서만 사용하는 메소드는 private로 선언했습니다. 반면, 2개 메소드(infixToPrefix와 evaluatePrefix)는 public으로 선언하였으며, 외부에서 이 메소드를 직접 호출할 수 있습니다.import java.util.Stackimport kotlin.math.p..
코틀린: infix expression을 prefix expression으로 변환(3/5) - 람다 식 앞에서 작성한 코드는 함수를 사용하지 않았습니다. 아래 코드는 함수 processOperators와 handleRemainingOperator를 정의하여 전체 코드를 수정했습니다. 이렇게 함수를 사용해 프로그램하는 것을 모듈러(modular) 프로그래밍이라 부릅니다. 괄호가 포함된 중위 표기법을 다룰 때, 즉 간단한 프로그램에서 기능을 추가해가며 복잡한 프로그램을 만들 때 이러한 모듈러 프로그래밍 방식이 효과적입니다.import java.util.*enum class Precedence (val priority: Int) { ... }const val OP_LIST = "+-*/^"fun precedence(op: Char): Int { ... }fun isOperator(op: Char): Boolea..
코틀린: infix expression을 prefix expression으로 변환(2/5) - List 구현 앞에서 중위 수식을 전위 수식으로 바꾸기 위해 자료 구조로 Stack 타입을 사용했습니다. Stack 대신 List 컬렉션을 사용해서 구현하려면 앞에서 작성한 코드를 어떻게 수정하면 될까요? Stack과 List는 정반대 방식으로 원소를 저장하고 관리합니다. 프로그램을 개발할 때 성능 개선이나 설계 요구 조건을 충족하기 위해 핵심 자료 구조를 변경해야 할 때가 종종 있습니다. 자료구조의 차이점만 정확히 알고 있으면 어렵지 않게 바꿀 수 있습니다.앞에서 구현한 코드에서는 Stack 타입 객체에서 제공하는 3개의 메소드 push, pop, peek를 사용했습니다. fun makeSubExpr(op: Stack, exp: Stack) { val op = op.pop() val operand1 = e..