[Kotlin] 인라인 함수(inline function)
·
Language/Kotlin
1. 시작'성능 최적화'라는 말은 개발자에게 언제나 매력적이면서도 조심스러운 단어다. 특히 코틀린에서 고차 함수(Higher-order function)를 자유자재로 사용하다 보면, 우리가 작성한 간결한 람다식이 내부적으로는 어떻게 돌아가는지에 대해서는 크게 고민을 하지 않고 사용하곤 한다. 하지만 람다의 구현 방식을 고려하면 약간의 비용이 발생 한다는 것을 알 수 있는데, 오늘은 이 람다의 유연함은 유지하면서 실행 시점의 오버헤드를 줄여주는 인라인 함수(Inline function)에 대해 알아본다. 2. 인라인 함수(inline function)2.1 람다에서 무슨 비용이?함수형 프로그래밍은 기본적으로 '함수를 객체처럼 사용한다'에 뿌리를 두고 있다. 다시 말해, 코드 가독성을 획기적으로 높여주는 ..
[Kotlin] 봉인된 클래스(Sealed Class)와 봉인에 대하여
·
Language/Kotlin
1. 시작모두가 잘 알고 사용하고 있는 클래스와 상속을 이용한 다형성은 Open-Closed Principal의 기본이자 단순한 구현에서 벗어나 각 클래스들에 명확하고 분명한 책임을 부여하는데 이점이 있다. 하지만 높은 확장성은 인터페이스나 추상 클래스를 사용해 결과로 받은 객체가 내가 정의한 서브타입임을 보장할 수 없음을 의미하기도 하다. 이러한 구조를 '제한 없는 계층구조(non-restricted hierarchy)'라고 하며, 아래와 같이 작성할 경우 else 구문이 강제된다.abstract class Resultclass Success(val data: String) : Result()class Failure(val exception: Throwable) : Result()// 'when' ex..
[Kotlin] 다양한 형태의 객체(object, companion, data, constant)
·
Language/Kotlin
1. 시작'클래스의 인스턴스(instance)'라는 간단명료한 정의에서 시작하여, '상태를 가지고 행동을 수행하며, 책임을 지고 다른 객체와 협력하는 프로그램의 구성 단위'라는 보다 능동적인 정의까지. 개발자들에게 객체에 대한 개념은 이제는 조금 친숙해지기도 했지만 여전히 그 개념을 충분히 이해하고 살려서 프로그래밍하는데는 어려움을 겪고 있다고 생각한다. 클래스와 객체를 '설계도-실체'의 관점으로 바라봤을 때, 객체를 생성할 수 있는 가장 간단한 방법은 다음과 같다.class DaFaNew// Hi~ 데페뉴~val a = DaFaNew() 하지만 다양하고 복잡한 현실과 마찬가지로, 객체 역시 다양한 목적과 용도로 만들어질 필요성을 갖고 있으며 오늘은 이를 지원하는 몇 가지 수단들을 알아본다. 2. 누구냐..
[Kotlin] 데이터 묶음을 표현하는 Data Class
·
Language/Kotlin
1. 시작클래스 명칭에서 드러나듯이 '데이터 자체'를 표현하기 위해 만들어진, 그리고 그렇게 사용하는 Data class에 대해서 알아본다. 2. 누구냐 넌클래스 명 앞에 data 제어자를 사용해 정의하는 코틀린의 Class 중 하나로, 코틀린의 철학 중 하나인 실용성(Pragmatic)이 강하게 반영된 결과물 중 하나다. 다시 말하면, 어떤 점에서 실용성을 만족시키고 있는가를 이해하는 것이 'data class'를 이해하는 가장 중요한 키라고 생각한다. 대규모 시스템의 안정적인 운영과 용이한 유지보수를 위해 활성화된 ‘객체지향’이라는 하나의 규약을 지켜내기 위해 Java 진영에서 만들어진 문화는, 결국 개발자에게 반복적인 노동을 요구하게 된다. 특히 객체의 내부 상태를 직접 노출하지 않고 캡슐화하기 위..
[ 백준 2635번 ] 수 이어가기
·
Algorithm/문제풀이
1. 문제2635번 - 수 이어가기 2. 풀이수열의 전체 길이를 결정짓는 것은 두 번 째 항으로, 입력받은 첫 번째 수 N 만큼만 순회하면 되는 문제이다.N의 최대값은 30,000이므로 제한 시간 내에 풀이하는데는 문제 없으며, 가장 긴 수열을 찾았을 때 어차피 O(N)의 시간복잡도이므로 별도의 공간을 추가 할당하기 보다, O(N + 1)로 찾은 수열의 두 번째항을 넘김으로써 한 번 더 순회하며 출력하도록 구현하였다. 3. 소스코드더보기fun main() { val n = readln().toInt() var maxLength = 1 var ansIdx = 0 fun findSequence(prev: Int, next: Int, print: Boolean = false): Int {..
[ 백준 11366번 ] Tons of Orcs, no Fibbin’
·
Algorithm/문제풀이
1. 문제https://www.acmicpc.net/problem/11366 2. 풀이앞선 두 년도의 오크 숫자가 누적해서 더해지는 구조로, 각 년도별 오크 수의 점화식을 세워보면 아래와 같다.년도오크 수1a + b2a + 2b32a + 3b43a + 5b55a + 8ba와 b의 차수가 각각 피보나치로 증가하는 구조이고, a의 차수는 b의 차수보다 하나 작은 것을 발견할 수 있다. 즉, 단일 피보나치 배열을 미리 생성해두고, 입력받은 쿼리에 따른 출력을 구현하면 O(N)에 처리할 수 있는 문제.가장 중요한 조건이자 검토해야할 사항은 입/출력의 범위가 Integer를 넘어서지 않는다는 것과, 오크가 한 마리도 없는 경우는 어떻게 할 것인가 라는 점이다.3. 소스코드fun main() { val fib..
[동시성 제어 - 1] Java가 제공하는 Lock
·
Language/Java
1. 동시성 제어 왜 필요한 것일까?한정된 자원을 가장 효과적으로 사용해 낭비를 줄이는 경제적 효율성의 원리는 어김없이 서버에도 적용된다. 수 백, 수 천만에 이르는 사용자들의 요청을 1:1로 순차적으로 대응하는 것은 극히 비효율적이고 생산성이 떨어지기 때문에, 요청에 유연하게 대응하기 위해서는 '동시성'은 필연적으로 수반되어야 한다. 요청에 최적의 응답시간을 보장하기 위해 클라이언트 요청마다 스레드를 할당하거나 비동기 / 논블로킹 IO를 사용할 수 있는데, 이 때 공유자원(shared resource)에 대하여 서로 다른 두 스레드가 동시에 조회, 수정하는 일이 발생할 수 있다. 만약 공유 자원에 대한 접근을 제대로 제어하지 않는다면 API의 멱등성이 깨지고, 원치 않는 결과와 장애를 만들어낼 수 있기..
[ 백준 25496번 ] 장신구 명장 임스
·
Algorithm/문제풀이
1. 문제 25496번: 장신구 명장 임스 첫 번째 줄에 정수 $P$와 정수 $N$이 공백으로 구분되어 주어진다. ($1 \le P \le 200$, $1 \le N \le 1\,000$) 두 번째 줄에는 정수 $A_1, A_2, \dots, A_N$이 공백으로 구분되어 주어진다. ($1 \le A_i \le 200$) www.acmicpc.net 2. 풀이 욕심쟁이 알고리즘(Greedy Algorithm)을 통해서 풀이할 수 있는 문제로, 남아 있는 피로도를 어떻게 하면 가장 효과적으로 사용할 수 있을 것인가를 해결하는 것이다. 장신구를 제작하는데 드는 피로도가 작은 것을 최대한 먼저 제작한다면, 다른 장신구를 제작할 수 있는 문제로 분할할 수 있다. 따라서 입력받은 피로도를 작은 순서로 정렬하여, 순..
[ 백준 4796번 ] 캠핑
·
Algorithm/문제풀이
1. 문제 4796번: 캠핑 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다. www.acmicpc.net 2. 풀이 '강산이는 휴가를 P일 중 L일만 사용할 수 있다'라는 것은 전체 V를 P로 나눈 몫에 L을 곱한 것만큼 휴가를 캠핑장을 사용할 수 있다는 말이다. 중요한 것은 V를 P로 나눈 나머지를 곧바로 더해주면 안된다는 점이다. (L < P) 이므로, V % P가 L보다 클 수 있다는 점을 놓치지 않아야 통과할 수 있다. 즉, min(V % P, L) 값을 추가로 더해주면 풀이할 수 있다! 3. 소스코드 더보기 public class Main ..
[ 백준 25513번 ] 빠른 오름차순 숫자 탐색
·
Algorithm/문제풀이
1. 문제 25513번: 빠른 오름차순 숫자 탐색 5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자에는 -1, 0, 1, 2, 3, 4, 5, 6중 하나의 수가 적혀 있다. 격자의 위치는 (r, c)로 표시한다. r은 행 번호, c www.acmicpc.net 2. 풀이 전형적인 BFS를 통한 경로탐색 문제이며, 방문해야 하는 노드가 순차적으로 정해져 있는 형태의 문제다. 우선 보드가 5 x 5 로 작은 형태이므로 구현 자체에도 큰 어려움이 없을 것으로 생각된다. 다만, 이미 방문한 노드를 어떻게 다시 방문하지 않을 것인가를 판단하는 것이 중요한데, 대개 이러한 유형의 경우 3차원 배열로 방문배열을 선언하여 현재 탐색중인 idx 에서는 중복된 칸을 ..