Modern Java in action이라는 책의 스터디를 시작했다! 첫번째 주제로 나는 세번째 챕터였던 람다 표현식을 선택했다. 왜냐하면 람다 표현식은 막상 어렵다고 느껴져서인지 잘 안쓰게 되더라... 오늘 이 정리를 계기로 람다 표현식을 더 자주 사용할 수 있었으면 좋겠다. 3.1 람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 즉, 함수(메서드)를 간단한 식(expression)으로 표현하는 방법이다. 람다의 특징 익명 : 보통의 메서드와 달리 이름이 없는 함수이므로 익명이라 표현 int max(int a, int b){return a > b ? a : b;} (a, b) -> a > b ? a : b 처럼 이름이 없다. 함수 : 특정 클래스에 종속되지 않으므..
REST API 코드리뷰에서 받은 피드백 중, get() 사용 시 NoSuchElementException이 발생할 수 있어 orElseThrow를 사용해보라는 피드백을 받았다. 코드를 수정하면서 Optional의 주의사항을 간단히 찾아보았는데, 블로그에 정리를 하면 좋을 것 같다고 생각이 되어 글을 작성하게 되었다! Optional 이란? 먼저 공식문서에서 정의하는 Optional은 위와 같다. 해석하자면, Optional은 non-null값을 가지고 있을 수도 있고 가지고 있지 않을 수도 있는 컨테이너 객체이다. 만약 값이 존재한다면 isPresent() 메소드 사용 시, true를 리턴하게 된다. 반면 값이 존재하지 않는다면, 객체는 비어있는 것(empty)으로 여겨지고, isPresent() 메소..
코딩테스트 풀이를 풀다보면 굉장히 많이 다루게 되는 시간 복잡도. 블로그에도 몇 번 언급한 적이 있는데, 어렴풋이 알고있는 개념이지만 오늘 예제를 통해 더 자세히 알아보도록 하자! 시간 복잡도란? 먼저 시간 복잡도란 무엇일까? 컴퓨터 공학에서는 알고리즘의 기본 동작을 실행할 때 특정한 시간이 소요된다고 추정한다. 그리고 시간 복잡도란, 이러한 알고리즘의 동작들을 실행하는 데에 총 소요된 시간을 나타낸 것이다. 쉽게 설명하면 알고리즘 수행에 필요한 단계의 수가 알고리즘의 효율성을 결정하는 주된 요인이라는 것이다. 당연하게 들릴 수 있지만, 알고리즘은 연산이 많아질 수록 그 연산 속도가 오래걸린다. 즉, 시간 복잡도는 알고리즘 내 연산 단계의 횟수의 영향을 받는다. 빅 오 표기법 (Big O notation..
REST API를 공부하는데, 한 아이디에 관련된 Task를 가져오는 getTask 메소드를 만들었고, Task를 가져오기 위해 stream() 을 사용해 해당 id를 필터링 후 findFirst() 메소드를 사용하였다. 그런데 findAny()를 사용하지 않은 이유에 대해 질문이 들어왔고, 이에 대해 공부한 내용을 정리하고자 한다. findFirst() stream에서 가장 첫번째 값의 Optional을 반환하고, stream이 비어있을 경우에는 empty Optional을 반환한다. 만약 stream에 따로 순서가 없을 경우에는 무작위의 (any element) Optional을 리턴한다. findAny() stream의 '일부' 요소를 기술하는 Optional 값을 반환하고, stream이 비어있는..
원티드에서 진행하는 프리온보딩 Kotlin 및 백엔드 과정을 신청했다! 각 과정 별 준비해야하는 간단한 사전 과제가 있었는데, 그 중 하나가 메세지 큐에 대해 공부해보는 것이었다. 백엔드 직무 우대사항이나 자격요건에 메세지 큐를 필요로 하는 회사가 많았어서 언젠가 계속 정리해야지 했었는데 이 기회로 드디어 메세지 큐를 정리하게 되었다 ^ㅅ^! 내가 생각하기에 메세지 큐는 말 그대로 메세지들을 큐라는 자료 구조에 담아 관리하는 의미라고 생각된다. MOM(Message Oriented Middleware: 메세지 지향 미들웨어)를 구현한 시스템을 MQ(Message Queue)라고 한다. 그렇다면 MOM이란 무엇일까? 메세지 지향 미들웨어 (MOM) MOM은 비동기 메세지를 사용하는 프로그램 간 데이터 송수..
얼마전에 SingleTon 패턴을 정리하면서, 쓰레드를 이용한 적이 있다. 쓰레드에 대한 정리는 이전에 했었는데, 오늘은 이 쓰레드의 바탕이 되는 동기, 그리고 비동기와 많이 혼동되는 개념인 블록(Block) 과 논블록(Non-Block)에 대해서도 간단히 알아보자! 데이터를 받는 방식에는 동기식 처리와, 비동기식 처리라는 두가지의 방식이 있다. 동기 (Synchronous) Synchronous 의 사전적 뜻은 다음과 같다 : happening, existing, or arising at precisely the same time. 무슨 말인가 하면, 정확히 같은 시간에 발생, 존재하는 것이다. 즉, 동시에 일어난다는 것이다. 많은 포스팅에서는 동기를 '데이터의 요청과 결과가 한 자리에서 동시에 일어나..
REST API에 대해서 다시 공부중인데, 코드 리뷰 중 enum을 사용해보라는 피드백을 받았다. 오늘은 enum 에 대해서 공부한 것들을 정리해보겠다! Enum Class 보통 상수를 정의할 때는 final로 String 과 같은 문자열이나 숫자들을 나타내는 기본 자료형의 값을 '고정'한다. 하지만 이렇게 상수를 정의해서 코딩을 하게 되면 다양한 문제가 발생하게 된다 (문제점에 대해서는 아래 예시들을 통해 알아보자). 따라서 이러한 문제점을 보완하기 위해 만들어진 것이 Enum 이다. Enum은 enumeration(열거, 목록)의 앞부분을 따서 만든 예약어로, 열거형이라고 불리며 서로 연관된 상수들의 집합을 의미한다. Enum의 장점 코드가 단순해지며, 가독성이 좋다. 인스턴스 생성과 상속을 방지하여..
이전 HashSet 포스팅 맨 아래에 적었던 것 처럼, HashSet은 정렬을 지원하지 않는다고 했는데 정렬이 되는 경우가 있었다. 그리고 왜 이렇게 되는 것인지에 대해 의문이 들었다. 그래서 이러한 궁금증에 알아볼 겸 오늘은 LinkedHashSet과 HashSet에 대해 알아보자! 먼저 Set의 종류들에 대해 다시 한 번 살펴보자. HashSet 순서를 보장하지 않는다 TreeSet보다 삽입, 삭제가 빠르다 (해시 테이블에 원소를 저장하여, 성능 면에서 가장 우수함) 내부적으로 HashMap을 사용한다 LinkedHashSet 입력된 순서를 보장한다 TreeSet 이진 탐색 트리 (Red-Black Tree)를 기반으로 한다 따라서 값에 따라 순서가 결정된다 (오름차순 정렬) 데이터의 삽입 / 삭제에..