설치 1. github에서 tar.gz 파일 다운로드 (https://github.com/yahoo/CMAK) 2. 압축 해제 후 설치한 폴더 내에서 ./sbt clean dist 명령어 실행 Cannot use JVMCI compiler: No JVMCI compiler found 명령어 실행 시 위 에러가 발생한 경우, 링크 참고 3. target/universal 경로에 생성된 .zip 파일을 원하는 위치에 압축 해제 4. conf/application.conf 파일 수정 (로컬에 주키퍼를 띄웠기 때문에 아래와 같이 수정) 5. ./bin/cmak 명령어 실행 후, localhost:9000 접속 ! @7jn3njc8f - Internal server error, for (GET) [/assets..
기수 정렬 (Radix Sort) ? 기수 정렬은 각 자리 위치를 하나씩 증가시키면서 숫자들을 정렬하는 방법이다. 안정 정렬에 속하며, 카운팅 정렬과 마찬가지로 값의 비교연산 없이 정렬한다. 기수 정렬의 단점은 다음과 같다. 제자리 정렬이 아니기 때문에 추가적인 메모리가 필요하다. 동일한 길이를 가진 숫자나 문자열이여야 한다. 정렬하는 숫자 자릿수 \(k\) 에 따라 \(O(kn)\) 의 시간 복잡도를 가진다. 기수 정렬 과정은 다음과 같다. 1의 자리 숫자를 비교해서 오름차순 또는 내림차순으로 정렬한 뒤, 큐 버킷에 삽입한 뒤 순서대로 뽑아 정렬한다. 그 다음, 10의 자리 숫자를 비교해서 동일하게 수행한다. 가장 큰 숫자의 자릿 수만큼 반복해서 수행한다. Code public static void r..
요구사항 살펴보기 앞으로의 설명을 위해 '영화'와 '상영'이라는 용어를 구분할 필요가 있을 것 같다. '영화'는 영화에 대한 기본 정보를 표현한다. 제목, 상영시간, 가격 정보와 같이 영화가 가지고 있는 기본적인 정보를 가리킬 때는 '영화'라는 단어를 사용할 것이다. '상영'은 실제로 관객들이 영화를 관람하는 사건을 표현한다. 상영 일자, 시간, 순번 등을 가리키기 위해 '상영'이라는 용어를 사용할 것이다. 두 용어의 차이가 중요한 이유는 사용자가 실제로 예매하는 대상은 영화가 아니라 상영이기 때문이다. 사람들은 영화를 예매한다고 표현하지만 실제로는 특정 시간에 상영되는 영화를 관람할 수 있는 권리를 구매하기 위해 돈을 지불한다. 할인을 받을 수 있는 특정한 조건 할인액을 결정하는 두 가지 규칙이 존재한..
설계가 왜 필요한가 어떤 사람들은 설계가 코드를 작성하는 것보다는 높은 차원의 창조적인 행위라고 생각하는 것 같다. 하지만 설계를 구현과 떨어트려서 이야기하는 것은 불가능하다. 설계는 코드를 작성하는 매 순간 코드를 어떻게 배치할 것인지를 결정하는 과정에서 나온다. 설계는 코드 작성의 일부이며 코드를 작성하지 않고서는 검증할 수 없다. 좋은 설계란 무엇인가? 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다. 변경을 수용할 수 있는 설계가 중요한 이유는 요구사항이 항상 변경되기 때문이다. 그리고 코드를 변경할 때 버그가 추가될 가능성이 높기 때문이다. 요구사항은 필연적으로 코드 수정을 초래하고, 코드 수정은 버그가 발생할 가능성을 높인다. 객체지향 설계 우리가 진정으로..
설계 개선하기 앞 글의 코드는 세 가지 목적 중 한 가지는 만족시키지만 다른 두 조건은 만족시키지 못한다. 기능은 제대로 수행 이해하기 어려움 변경하기가 쉽지 않음 여기서 변경과 의사소통이라는 문제가 서로 엮여 있다는 점에 주목하라. 코드를 이해하기 어려운 이유는 Theater가 관람객의 가방과 판매원의 매표소에 직접 접근하기 때문이다. 이것은 관람객과 판매원이 자신의 일을 스스로 처리해야 한다는 우리의 직관을 벗어난다. 다시 말해서 의도를 정확하게 의사소통하지 못하기 때문에 코드가 이해하기 어려워진 것이다. Theater가 관람객의 가방과 판매원의 매표소에 직접 접근한다는 것은 Theater가 Audience와 TicketSeller에 결합된다는 것을 의미한다. 따라서 Audience와 TicketSe..
무엇이 문제인가 로버트 마틴은 '클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 방법'에서 소프트웨어 모듈이 가져야 하는 세 가지 기능에 관해 설명한다. 모듈 : 크기와 상관 없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소 모든 소프트웨어 모듈에는 세 가지 목적이 있다. 1. 실행 중에 제대로 동작하는 것이다. 이것은 모듈의 존재 이유라고 할 수 있다. 2. 변경을 위해 존재하는 것이다. 대부분의 모듈은 생명주기 동안 변경되기 때문에 간단한 작업만으로도 변경이 가능해야 한다. 3. 코드를 읽는 사람과 의사소통하는 것이다. 모듈은 특별한 훈련 없이도 개발자가 쉽게 읽고 이해할 수 있어야 한다. 읽는 사람과 의사소통할 수 없는 모듈은 개선해야 한다. 앞 글의 애플리케이션에서는 제..
티켓 판매 애플리케이션 구현하기 여러분은 작은 이벤트를 기획하기로 했다. 이벤트의 내용은 추첨을 통해 선정된 관람객에게 공연을 무료로 관람할 수 있는 초대장을 발송하는 것이다. 한 가지 염두에 둬야 할 점이 있는데, 이벤트에 당첨된 관람객과 그렇지 못한 관람객은 다른 방식으로 입장시켜야 한다는 것이다. 이벤트에 당첨된 관람객은 초대장을 티켓으로 교환한 후에 입장할 수 있다. 이벤트에 당첨되지 않은 관람객은 티켓을 구매해야만 입장할 수 있다. 코드 Invitation 공연을 관람할 수 있는 초대일자 (when) 를 인스턴스 변수로 포함하는 간단한 클래스다. public class Invitation { private LocalDateTime when; } Ticket 공연을 관람하기 원하는 모든 사람들은 ..
프로그래밍 패러다임 프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지한다. 또한 프로그래밍 패러다임을 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장할 수 있도록 준비시킬 수 있다. 각 프로그래밍 언어가 제공하는 특징과 프로그래밍 스타일은 해당 언어가 채택하는 프로그래밍 패러다임에 따라 달라진다. C 언어는 절차형 패러다임을 기반으로 하는 언어이며 자바는 객체지향 패러다임을 기반으로 하는 언어다. 함수형 패러다임을 수용한 가장 대표적인 언어는 리스프 (LISP) 이며 프롤로그 (PROLOG) 는 논리형 패러다임을 수용한 대표적인 언어다. 이것이 프로그래밍 언어와 프로그래밍 패러다임을 분리해서 설명할 수 없는 ..