본문 바로가기

분류 전체보기

(46)
코틀린: 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..
코틀린: infix expression을 prefix expression으로 변환(1/5) - 문자열 방식 쉽게 다가가는 최신 프로그래밍: 코틀린  - 2.2 연산자 오버로딩에서 연산자 오버로딩은 중위 표기법(infix notation)을 사용합니다. 3.6.6 중위 함수 역시 중위 표기법을 사용합니다.  수식 2 + 3 처럼 연산자(operator)가 피연산자(operand) 가운데에 놓이는 표기법을 중위 표기법이라고 합니다. 기계어 코드(machine code)에서는 + 2 3 처럼 연산자가 앞에 오는 전위 표기법(prefix notation)을 사용합니다. 전위 표기법을 폴란드 표기법(polish notation, PN)이라 부릅니다. 2 3 +처럼 연산자가 마지막에 오는 표기법을 후위 표기법(postfix notation)이라 부릅니다. 후위 표기법을 RPN(reverse polish notation)..
코틀린: 5장 테스트에 도전해 보세요 (정답 해설) 문제 1  4개의 Person 타입 객체를 갖는 시퀀스 heroes 를 생성했습니다. (1) 나이가 가장 젊은 객체를 찾으세요.(2) 이름 순으로 객체를 정렬하세요.(3) 미혼인 객체를 모두 찾으세요.(4) 객체의 평균 나이를 구하세요.class Person(val name: String, val age: Int, val gender: Char, val martialStatus: Boolean) { override fun toString() = "$name $age $gender $martialStatus"}fun main() { val heroes = sequenceOf( Person("홍길동", 21, 'M', ..
코틀린: 5장 테스트에 도전해 보세요 쉽게 다가가는 최신 프로그래밍: 코틀린 - 5장 배열과 컬렉션을 완전히 이해했나요? 다음 문제를 풀어 보세요.문제 1  4개의 Person 타입 객체를 갖는 시퀀스 heroes 를 생성했습니다. (1) 나이가 가장 젊은 객체를 찾으세요.(2) 이름 순으로 객체를 정렬하세요.(3) 미혼인 객체를 모두 찾으세요.(4) 객체의 평균 나이를 구하세요.class Person(val name: String, val age: Int, val gender: Char, val martialStatus: Boolean) { override fun toString() = "$name $age $gender $martialStatus"}fun main()..
코틀린: 시퀀스(Sequence)와 컬렉션(Collection)은 뭐가 다를까요? 시퀀스(Sequence)에 관한 보충 설명입니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 5.7 iterator와 sequence를 참고하기 바랍니다. 시퀀스와 컬렉션의 공통점은 "여러 개 원소를 다룰 수 있다" 입니다. 그러나, 원소를 저장하고 처리하는 방식은 전혀 다릅니다. 간단히 정리하면, 컬렉션은 열성적 처리(eager evaluation) 방식이며 시퀀스는 지연 처리(lazy evaluation) 방식입니다. eager는 "열성적인, 간절히 갈망하는" 뜻입니다. 컬렉션은 보자마자 달려드는 스타일인 반면, 시퀀스는 느긋하게 기다리는 스타일인 셈입니다. 여러 개 메소드를 연결해서 처리하는 메소드 체이닝(method chaining)으로 구현했을 때 유의해야 할 내용이 있습니다. 컬..