본문 바로가기
  • 개발하는 곰돌이

2023/0213

[Effective Java] 상속보다는 컴포지션을 사용하라(Feat. Stack) 목차 상속보다는 컴포지션을 사용하라 - 이펙티브 자바 3/E 아이템 18 상속은 자바가 갖는 유연한 구조의 기반이 되는 기법이다. 잘 사용한 상속 구조는 애플리케이션의 확장과 유지보수를 수월하게 해주지만, 잘못 사용한 상속 구조는 예상하지 못한 문제를 일으킬 수 있다. 이번 포스트에서는 자바의 Stack 클래스를 예시로 잘못 사용한 상속 구조에서 발생할 수 있는 문제와 컴포지션을 통해 이러한 문제를 해결하는 것을 다룰 것이다. 상속 일단 여기서 다루는 상속은 오직 클래스에서 클래스로의 상속만 해당된다. 상속을 사용하면 기본적으로 자식 클래스는 부모 클래스의 public과 protected 속성 + 자식 클래스만의 속성을 갖게 된다. 이 과정에서 상속은 캡슐화를 깨트리게 된다. 자식 클래스는 부모 클래스에.. 2023. 2. 27.
[Kotlin] 백준 16678 : 모독 문제 링크 16678번: 모독 명예에 죽고 명예에 사는 나라 얼라이언스에는 1명의 왕과 N명의 국회의원이 있다. 각 N 명의 국회의원은 a1, a2, ..., aN 의 명예 점수를 갖고 있으며, 명예 점수가 양수인 한 그들은 국회의원을 www.acmicpc.net 문제 해설 프로젝트 "Defile"은 모든 명예 점수를 1씩 감소시키고 이 때, 0이 되는 명예 점수만 있다면 계속 반복하는 방식이다. 즉, 단 한번의 "Defile"으로 모든 국회의원의 명예 점수를 0 이하로 만들기 위해선 가장 낮은 명예 점수가 1이어야하고, 각 명예 점수의 차이가 1 이하여야 한다는 것이다. 해커의 수를 최소로 하기 위해선 명예 점수를 1부터 공차가 1인 등차수열을 이루되, 중복은 신경쓰지 않아도 된다. 이를 위해서 명예 .. 2023. 2. 22.
[Kotiln] 백준 17175 : 피보나치는 지겨웡~ 문제 링크 17175번: 피보나치는 지겨웡~ 혁진이는 알고리즘 문제를 만들라는 독촉을 받아 스트레스다. 하지만 피보나치 문제는 너무 많이 봐서 지겹기 그지없다. 그러나 문제를 만들 시간이 없는 혁진이는 피보나치 문제를 응용해서 www.acmicpc.net 문제 해설 다이나믹 프로그래밍의 기초가 되는 문제이다. 피보나치 수의 특성 상 \(fibonacci(n)\)을 입력했을 때의 \(fibonacci\) 함수 호출 횟수 또한 이전 \(fibonacci\) 함수의 호출 횟수로 구할 수 있다. \(fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)\)라는 것은 함수 호출 횟수는 마찬가지로 이전 2개의 \(fibonacci\) 함수 호출 횟수를 더한 값 + (\(fibonacci(n)\.. 2023. 2. 20.
[WebFlux] WebClient를 사용하여 외부 API를 호출할 땐 인코딩을 주의해야 한다 문제의 배경 프로젝트 진행 중에 입력값의 유효성을 검사하기 위해 외부 API를 호출할 일이 있었다. 그런데 포스트맨이나 크롬 개발자 도구에서는 문제 없이 잘 호출되는 API가 막상 WebClient를 사용한 자바 프로덕션 코드로 호출을 하려고 해보니 자꾸 등록된 키가 아니라며 400 에러를 뿜어대서 일단은 동작하게 만들기 위해 Unirest로 구현을 한 상태였다. 원인 파악 return WebClient.create() .post() .uri("외부 API url") .body(BodyInserters.fromValue(param)) .retrieve() .BodyToMono(String.class) .block(); 에러 로그에서 계속 문제가 발생한다고 했던 부분이다. 처음에는 문제될 것이 없는데 왜 .. 2023. 2. 19.
[Kotlin] 백준 27315 : 틀리는 건 싫으니까 쉬운 문제에 올인하려고 합니다 문제 링크 27315번: 틀리는 건 싫으니까 쉬운 문제에 올인하려고 합니다 첫 번째 줄에 두 정수 $N$, $M$이 공백으로 구분되어 주어진다. ($1\leq M\leq N\leq 500\,000$) 다음 $N$개의 줄에 $D_i$ $P_i$ $T_i$ $E_i$의 네 정수로 각각 문제의 아이디어 난이도, 구현 난이도와 데이터 소유 www.acmicpc.net 문제 해설 기본적으로 틀렸습니다를 최소로 줄이려면 한별이의 아이디어 능력(이하 \(HD\))보다 작거나 같은 아이디어 난이도(이하 \(D\))를 가진 문제 중에서 구현 난이도(이하 \(P\))가 낮은 문제부터 해결해야 한다. 틀렸습니다의 개수는 각 문제마다 \(P\)와 한별이의 구현 능력(이하 \(HP\))의 차이이고, 문제를 풀 때마다 \(HP\.. 2023. 2. 18.
[Kotlin] 백준 21939 : 문제 추천 시스템 Version 1 문제 링크 21939번: 문제 추천 시스템 Version 1 tony9402는 최근 깃헙에 코딩테스트 대비 문제를 직접 뽑아서 "문제 번호, 난이도"로 정리해놨다. 깃헙을 이용하여 공부하시는 분들을 위해 새로운 기능을 추가해보려고 한다. 만들려고 하는 명령 www.acmicpc.net 문제 해설 정렬과 탐색을 동시에 빠르게 하기 위해서 TreeSet을 사용하여 풀었다. 문제의 번호를 인덱스로 하여 문제의 난이도를 배열로 따로 관리했고, 문제 번호는 TreeSet에서 난이도가 높은 순으로, 난이도가 같다면 문제 번호가 큰 순서대로 정렬되도록 Comporator를 구현했다. 그 후 주어지는 문제의 정보를 저장한 후 명령어별로 분기를 수행하면 된다. recommend : \(x\)가 \(1\)이면 TreeSe.. 2023. 2. 14.
[Kotlin] 빌더 패턴과 코틀린, 그리고 Default Parameter와 Named Argument를 이용하여 코틀린에서 빌더 패턴의 효과를 내보기 Builder Pattern 이펙티브 자바(조슈아 블로크 著)에서는 생성자의 파라미터가 많다면 빌더를 고려하라는 내용이 있다. 클래스의 필드가 많아져서 생성자의 파라미터가 많아질수록 파라미터의 순서를 뒤바꾸거나 엉뚱한 값을 집어넣는 실수를 하기 쉬워지고, 이는 파라미터의 타입과 파라미터의 개수만 같다면 컴파일 시점에는 아무 문제가 없기 때문에 런타임에 예상치 못한 에러를 유발할 수 있다. 이런 문제를 해결하기 위해 나온 디자인 패턴이 바로 빌더 패턴(Builder Pattern)이다. 빌더 패턴은 일반적으로 클래스 내부에 해당 클래스의 필드를 그대로 갖는 Builder라는 정적 클래스를 생성한 후 객체를 생성하고자 하는 클래스에서 builder() 메소드로 빌더를 생성한다. 이후 각 파라미터마다 값을 삽.. 2023. 2. 13.
[Kotlin] 백준 14698 : 전생했더니 슬라임 연구자였던 건에 대하여(Hard) 문제 링크 14698번: 전생했더니 슬라임 연구자였던 건에 대하여 (Hard) 각 테스트 케이스마다 슬라임을 끝까지 합성했을 때 청구될 비용의 최솟값을 1, 000, 000, 007로 나눈 나머지를 출력한다. 전기 에너지가 전혀 필요하지 않은 경우엔 1 을 출력한다. www.acmicpc.net 문제 해설 각 테스트 케이스마다 구해야 하는 총 비용은 매 합성 단계마다 필요한 전기 에너지, 즉 매 합성 단계마다 합성되는 슬라임의 에너지들을 모두 곱한 값과 같다. 이 값을 최소로 하기 위해서는 매 합성마다 에너지가 가장 낮은 슬라임 둘을 합성해야 하는데, 예제의 경우를 그림으로 표현하면 다음과 같다. 따라서 우선순위 큐를 사용하면 문제를 수월하게 풀 수 있다. 입력받은 모든 슬라임을 우선순위 큐에 삽입한다... 2023. 2. 12.