Java

39 posts

이진 탐색(Binary Search) 알고리즘

정렬된 데이터를 검색할 때 가장 널리 사용되는 이분 탐색(binary search)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 개념 책으로된 영어 사전(요즘은 거의 안 쓰죠? 😓)에서 단어를 찾거나 지역 업소록에서 상호명을 어떻게 찾으시나요? 수백, 수천 페이지가 되는 이러한 책을 맨 첫 페이지부터 한 장씩 넘기면서 찾으시는 분들은 아마 없으실 것입니다. 보통은 대강 중간 쯤 어딘가를 어림잡아서 페이지를 펼쳐본 후에 찾으려는 단어나 업소명과 비교하면서 검색 범위를

[Java] 객체 정렬하기 1부 - Comparable vs Comparator

자바와 같이 객체 지향 언어를 사용하여 프로그래밍을 하다보면 객체들을 정렬해야하는 경우가 생깁니다. 예를 들면, 온라인 게임 서비스에서 게이머들을 높은 점수 순으로 보여주는 게이머 랭킹 페이지를 생각해볼 수 있겠습니다. 정렬 대상 클래스 먼저, 각 게이머의 정보를 표현하기 위해 다음과 같은 간단한 클래스를 생각해보겠습니다. 그리고 5 명의 게이머가 담고 있는 리스트를 생성하였습니다. 자, 이제 이 게이머 리스트를 점수 기준으로 어떻게 정렬할 수 있을까요? Chloe 가 일등이기 때문에 리스트의 맨 앞으로 나와야하고, Alice 는

[Java] 최소/최대 원소 구하기 (Loop/Collections/Stream)

자바에서 최소나 최대 원소를 찾을 흔히 사용되는 3가지 코딩 스타일에 대해서 알아보겠습니다. Loop 제일 먼저 반복문을 통해 각 원소에 하나씩 접근해서 최대값을 구하는 다음과 같은 고전적인 코드를 생각해볼 수 있습니다. 반복문(for)을 이용해서 지속적으로 변수(max)에 새로운 값을 할당하는 방식이 전형적인 명령형 프로그래밍(Imperative programming) 스타일을 따르고 있습니다. 많은 프로그래머들에게 가장 익숙한 방법이지만, 고수준의 비지니스 로직 중간에 이러한 저수준의 코드가 들어가게 되면 가독성에 나쁜 영향을

Java9에서 강화된 Stream 클래스의 iterate 정적 메서드

Java9에서는 기존 Java8 때 부터 있었던 Stream 클래스의 iterate() 메서드를 오버로드(overload)한 신규 메서드가 추가되었습니다. 이번 포스팅에서는 Stream 클래스의 정적 메서드인 iterate()에 대해서 얘기해보고자 합니다. 메서드 이름이 암시하듯 iterate()는 어떤 연산을 반복적으로 수행할 때 사용되는 메서드이며, 명령형 프로그래밍(imperative programming)에서 for나 while과 같은 루프문으로 해결하던 코드를 함수형 프로그래밍(functional programming) 방

Java9에서 추가된 Optional 기능 소개

Java9에서 Optoinal 클래스에 몇가지 유용한 메서드들이 추가되었습니다. 이번 포스팅에서는 이 새로운 메서드들을 어떻게 활용할 수 있는지 살펴보겠습니다. Java8에서 추가되었던 Optional의 좀 더 기본적인 사용법은 아래 포스팅를 참고바랍니다. 자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪 자바8 Optional 2부: null을 대하는 새로운 방법 자바8 Optional 3부: Optional을 Optional답게 or() 메서드 Optional 객체가 담고 있는 값에 접근할 때, 비어있는 경우를

Java9의 불변 컬렉션 생성

좀 더 간결한게 불변 컬렉션을 생성할 수 있도록 Java9에서 List, Set, Map 인터페이스에 새로운 팩토리 메서드들이 추가되었습니다. 불변 컬렉션이란? 불변(Immutable) 컬렉션(Collection)은 아이템 추가, 수정, 제거가 불가능합니다. 따라서 신규 아이템을 추가하거나 기존 아이템을 수정또는 제거하려고 하면 java.lang.UnsupportedOperationException이 발생합니다. 컬렉션이 생성된 후에 변경되기를 원하지 않는 경우에 사용하며, 의도치 않은 컬렉션 변경을 예방에 도움이 됩니다. 불변 컬

[Java8 Time API] Instant 사용법

자바8 Time API의 Instant 클래스는 시간을 타임스탬프로 다루기 위해서 사용합니다. 타임스탬프는 UTC 기준으로 1970년 1월 1일 0시 0분 0초를 숫자 0으로 정하고 그로 부터 경과된 시간을 양수 또는 음수로 표현합니다. 타임스탬프는 인간에게는 직관적이지 않은 시간의 표현 방법이지만 고전적으로 기계에게는 매우 친화적인 방법으로 현재까지 널리 사용되어 왔습니다. 일단 시간을 표현하기 위해서 별도의 타입없이 기본 데이터 타입으로 표현이 가능한데다가, 타임존이 UTC로 고정되어 있기 때문에 타임스탬프가 어느 타임존 기준인

[Java8 Time API] Duration과 Period 사용법 (+ChronoUnit)

자바8에 추가된 Time 패키지에는 Duration과 Period라는 상당히 비슷해 보이는 2개의 클래스가 있습니다. 이 두개의 클래스는 둘 다 시간의 길이을 나타내기 위해서 사용되는데요. Duration은 두 "시간" 사이의 간격을 나타내는 반면에 Period는 두 "날짜" 사이의 간격을 나타낸다는 차이점이 있습니다. 이 게 무슨 말인지 예제를 통해서 살펴보도록 하겠습니다. Duration 먼저 Duration 클래스는 두 시간 사이의 간격을 초나 나노 초 단위로 나타냅니다. 다음 예제는 10시 35분 40초와 10시 36분 50

[Java8 Time API] ZonedDateTime 사용법

Java8에서 추가된 ZonedDateTime 사용법에 대해서 알아보겠습니다. ZonedDateTime는 LocalDateTime과 달리 타임존 또는 시차 개념을 가지고 있는 클래스입니다. ZonedDateTime ZonedDateTime 클래스는 타임존 또는 시차 개념이 필요한 날짜와 시간 정보를 나타내기 위해서 사용됩니다. public 생성자를 제공하지 않기 때문에 객체를 생성할 때는 now()나, of()와 같은 정적 메소드를 사용하도록 설계되어 있습니다. 제 PC의 타임존이 LA로 세팅이 되어 있어서, 인자없이 ZonedDa

[Java8 Time API] LocalDate, LocalTime, LocalDateTime 사용법

이번 포스팅에서는 Java8 Date/Time API의 LocalDate과 LocalTime 그리고 LocalDateTime 사용법에 대해서 알아보겠습니다. 이 3개의 클래스는 모두 타임존 개념을 가지고 있지 않기 때문에 타임존에 따른 시간 변환이 불가능하다는 공통점을 가지고 있습니다. LocalDate LocalDate 클래스는 타임존 개념이 필요없는 날짜 정보를 나타내기 위해서 사용됩니다. 대표적으로 적용이 가능한 사례는 '생일'을 떠올릴 수 있을 것 같습니다. 보통 우리가 생일을 얘기할 때는 타임존 개념을 넣지 않기 때문입니다

[알고리즘] 퀵 정렬 - Quick Sort (Python, Java)

이번 포스팅에서는 가장 유명한 정렬 알고리즘 중 하나인 퀵 정렬(Quick Sort)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 컨셉 병합 정렬과 마찬가지로 퀵 정렬도 분할 정복 (Devide and Conquer) 기법과 재귀 알고리즘을 이용한 정렬 알고리즘입니다. 쉬운 이해를 위해서 다음과 같이 1부터 7까지 총 7개의 숫자가 들어있는 배열을 기준으로 설명하겠습니다. 항상 정 가운데를 기준으로 분할을 하는 병합 정렬과 달리, 퀵 정렬은 흔히 피봇(pivot)이라

[알고리즘] 병합 정렬 - Merge Sort (Python, Java)

대표적인 O(logN) 알고리즘인 병합 정렬(Merge Sort)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 컨셉 병합 정렬은 분할 정복 (Devide and Conquer) 기법과 재귀 알고리즘을 이용해서 정렬 알고리즘입니다. 즉, 주어진 배열을 원소가 하나 밖에 남지 않을 때까지 계속 둘로 쪼갠 후에 다시 크기 순으로 재배열 하면서 원래 크기의 배열로 합칩니다. 예를 들어, 다음과 같이 1부터 8까지 총 8개의 숫자가 들어있는 배열에 있다고 가정해보겠습니다. 먼

[알고리즘] 삽입 정렬 - Insertion Sort (Python, Java)

선택 정렬, 거품 정렬과 더불어 대표적인 O(N^2) 정렬 알고리즘인 삽입 정렬(Insertion Sort)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 컨셉 삽입 정렬은 한마디로 표현하면 정렬 범위를 1칸씩 확장해나가면서 새롭게 정렬 범위에 들어온 값을 기존 값들과 비교하여 알맞은 자리에 꼽아주는 알고리즘입니다. 예를 들어, 다음과 같이 1부터 5까지 총 5개의 숫자가 들어있는 배열에 있다고 가정해보겠습니다. 맨 처음에는 첫번째 2개의 값만 정렬 범위에 포함시키고

[알고리즘] 거품 정렬 - Bubble Sort (Python, Java)

선택 정렬(Slection Sort)과 더불어 대표적인 O(N^2) 정렬 알고리즘인 거품 정렬(Bubble Sort)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 컨셉 거품 정렬은 큰 그림에서 보았을 때 뒤에서 부터 앞으로 정렬을 해나가는 구조를 가지고 있습니다. 즉, 맨 뒷자리에 제일 큰 값을 제일 뒤로 보내고, 제일 큰 값 바로 앞에 두번째로 큰 값을 보냅니다. 이를 위해 배열 내의 값들을 앞뒤로 서로 비교해서 자리를 바꾸는 작업을 지속적으로 수행해야 합니다. 이

[알고리즘] 선택 정렬 - Selection Sort (Python, Java)

정렬 알고리즘 중에서 가장 직관적이고 쉽게 구현이 가능한 선택 정렬(Selection Sort)에 대해서 알아보겠습니다. 알고달레에서 코딩 테스트/인터뷰 준비에 좀 더 특화된 컨텐츠를 만나보세요! 📝 기본 아이디어 선택 정렬은 알고리즘에 대해 배워본 적이 없는 사람도 쉽게 생각해낼 수 있는 정렬 알고리즘입니다. 왜냐하면 우리가 일상에서 무언가를 크기 순으로 나열할 때 흔히 사용되는 사고 방식이기 때문입니다. 예를 들어, 위와 같이 키를 알고 있는 네 친구들을 키 순으로 세우려면, 우선 4명의 키를 모두 비교하여 키가 제일 작은 1

스프링 부트 구동 시점에 특정 코드 실행 시키기 (CommandLineRunner & ApplicationRunner)

스프링 부트 애플리케이션 구동 시점에 특정 코드 실행 시키기기 위해서 2가지 인터페이스를 제공하고 있습니다. CommandLineRunner CommandLineRunner 인터페이스는 구동 시점에 실행되는 코드가 자바 문자열 아규먼트 배열에 접근해야 할 필요가 있는 경우에 사용합니다. 다음과 같이 CommandLineRunner 인터페이스를 구현한 클래스에 @Component 어노테이션을 선언해두면 컴포넌트 스캔이되고 구동 시점에 run 메소드의 코드가 실행됩니다. 테스트 jar 파일로 패키징된 애플리케이션을 실행시킬 때 abc와

스프링 부트 내장 서버 설정 (포트, 컨텍스트 패스)

본 포스팅에서는 스프링 부트의 내장 서버를 설정하는 방법에 대해서 알아보겠습니다. 애플리케이션 설정 파일 스프링 부트 프로젝트의 src/main/resources 디렉터리를 보시면 application.properties나 applicaiton.yml 파일을 찾으실 수 있으실 겁니다. (없으신 경우 새로운 applicaiton.yml 파일을 만드시면 됩니다.) 포트와 컨텍스트 패스 변경 스프링 부트의 내장 서버는 디플트로 포트는 8080을 사용하고 컨텍스트 패스는 /를 사용하고 있습니다. 포트를 8081로 바꾸고 컨텍스트 패스를 /

스프링 부트 내장 서버 바꾸기

본 포스팅에서는 스프링 부트의 내장 서버를 바꾸는 방법에 대해서 알아보도록 하겠습니다. 메이븐 설정 파일(pom.xml)만 조금씩 수정해주면 다양한 내장 서버를 사용해볼 수 있습니다. Tomcat 스프링 부트는 디플트 내장 서버로 Tomcat을 사용하고 있습니다. 따라서 특별한 설정없이 Web Starter 의존성만 추가해주면 됩니다. 바로 스프링 부트 애플리케이션을 실행하면 Tocmat 내장 서버가 올라갑니다. Jetty 스프링 부트의 내장 서버로 Tomcat 대신에 Jetty를 사용해보겠습니디. 먼저 Web Starter에 기본

도구 없이 스프링 부트 프로젝트 만들기

스프링 부트 프로젝트를 만드는데는 여러 가지 자동화된 방법이 있습니다. Eclipse나 IntelliJ와 같은 코드 에디터에서 제공하는 프로젝트 생성 마법사를 이용할 수 있고, SPRING INITIALIZR 웹사이트에서 생성해준 프로젝트의 압축 파일을 다운로드 받을 수도 있으며, Spring CLI 도구를 이용하여 터미널에서 커맨드 한 줄을 날릴 수도 있습니다. 하지만 스프링 부트를 본격적으로 시작할 분이 아니라면 이런 도구를 설치하는 게 부담스럽거나 번거롭게 느껴질 수 있습니다. 본 포스팅에서는 이러한 도구의 도움없이 아무 것도

[자바] 알아두면 유용한 Lombok 어노테이션

이번 포스팅에서는 많이 알려지지는 않았지만 알아두면 유용한 Lombok 어노테이션에 대해서 알아보겠습니다. 빌더 자동 생성 다수의 필드를 가지는 복잡한 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 많은데요. 빌더 패턴을 직접 작성해보면 코딩량이 의외로 상당함을 깨닫게 됩니다. 이 때, @Builder 어노테이션을 사용하면 자동으로 해당 클래스에 빌더를 추가해주기 때문에 매우 편리합니다. 컬렉션으로 된 필드에는 @Singular 어노테이션을 선언해주면 모든 원소를 한 번에 넘기지 않고 원소를 하나씩 추가할 수 있습니다. 로거

Discord