# Java 8

[JAVA] 람다로 new Comparator<> 멋지게 대체하기
개요 자바에서 가장 애용하는 자료구조가 있는데요, 바로 우선 순위 큐입니다. 우선 순위 큐는 정렬 기준을 커스텀 할 수 있기 때문에 정말 다양한 곳에서 사용 가능한데요, 처음에 나름(?) 진입 장벽이 있었던 자료구조였지만 이제는 저에게 있어서 없어서는 안되는 자료구조가 되었습니다. 우선 순위 큐를 사용할 때는 다음과 같이 정렬 기준을 커스텀 했습니다. 어려웠던 구조도 자주 사용하다 보면 익숙해지기 나름인데요, 최근에 자바의 소양을 키우기 위해 모던 자바 인 액션 이라는 서적을 구매해서 읽고 있는데 여기서는 람다의 편의성을 매우 강조했습니다. 평소에 람다의 멋짐(?) 을 꽤나 동경하고 있던 저로서는 이 기회에 Comparator 또한 람다를 써서 구현해보고자 합니다! 기본 구조 만약 위 코드를 람다식으로 변환하면 어떻게 나타낼까요? 의외로 형태는 비슷합니다. 보시면 알겠지만 new Comparator 나 `**public int

[Backend 개발자 면접 준비] Java 8 추가 된 내용
Java 8 에 추가 된 내용 람다식(Lambda expressions) 함수형 인터페이스 (Functional Interface) 디폴트 메서드 (Default Method) JVM의 변화 병렬 배열 정렬(Parallel Array Sorting) 컬렉션을 위한 대용량 데이터 처리 ( 스트림 ) Optional Base64 인코딩과 디코딩을 위한 표준 API 새로운 날짜, 시간 API (Date & Time API) 이 중에서 bold 로 된 항목에 대해서 간략하게 정리하고자 한다. 1️⃣ Lambda expressions 람다는 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다. ▪️ 특징 1
함수형 인터페이스
1. Predicate > 설명: Predicate 인터페이스는 단일 인수를 사용하고 조건에 따라 부울 값을 반환합니다. 이 예제에서는 주어진 문자열의 길이가 5자보다 큰지 확인하는 술어를 만듭니다. 그런 다음 test() 메서드를 사용하여 술어를 문자열 "Hello World"에 적용합니다. "Hello World"의 길이가 5보다 크기 때문에 result의 값은 true가 됩니다. > 설명: 이 예에는 1에서 10까지의 숫자 목록이 있습니다. 'Predicate'를 사용하여 이 목록에서 짝수를 필터링하려고 합니다. 모듈러스 연산을 수행하여 숫자가 짝수인지 확인하는 evenPredicate라는 Predicate를 정의합니다. 그런 다음 filterNumbers 메서드를 사용하여 evenPredicate를 기반으로 숫자 목록을 필터링합니다. 필터링된 짝수는 evenNumbers 목록에 저장됩니다. 마지막으로 System.o
Optional Class
Optional Null을 직접 다룰때 NPE( Null Point Exception )이 발생하는 위험성이 있다. 이 문제를 보완하기 위해 null이 등장할 위험이 있는 객체에 대해 Optional을 감싸(Wrapper) 해결하기 위해 등장했다. 그런데 이 과정에서 오버헤드가 발생하므로 잘 못 사용하면 시스템 성능이 저하된다. 따라서 모든 경우에 Optional을 사용하는게 아닌, 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용해야한다. 이 때문에 파라미터로 넘기는게 아닌, 반환 타입으로써 제한적으로 사용되도록 설계되었다. 생성 Optional.of Optional.empty 값 가져오기 단순 값 조회 isPresent 기본형 Optional 기본형에서 참조형으로 변환되는 과정을 줄이기 위해 기본형을 위한 다양

Lambda
함수형 프로그래밍 > 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. - 위키백과 > 람다를 이해하기 위해선 먼저, 함수형 프로그래밍에 대한 개념의 이해가 필요하다. 함수형 프로그래밍은 절차지향과 객체지향처럼 하나의 방법론 중 하나로, 다른 말로는 선언형 프로그래밍이라 한다. 이와 대조적으로 객체지향 프로그래밍은 명령형 프로그래밍이다. > 명령형? 선언형? > > - 명령형: 클래스에서 메서드를 정의하고, 필요할 때 메서드를 호출 > - 선언형: 데이터가 입력으로 주어지고, 데이터가 처리되는 과정을 정의하는 것으로 동작. 함수형 프로그래밍의 조건 순수 함수 같은 입력 시 같은 출력을 보장한다. 부수 효과가 없다. 멀티 쓰레드에도 안전하다. 고차 함수 일급 함수의 특징을 만족해야 한다. 익명 함수 이름이 없는 함수이다.
Stream
스트림 Stream Java 8에서 추가된 인터페이스 중 하나이다. 기존에 배열과 Collection 들을 다룰땐, for이나 foreach를 통해 반복하는 방법을 사용했다. 간단한 경우라면 상관없지만, 로직이 복잡해질수록 코드의 양이 많아지고 섞이게 되면서 한눈에 알아보기도 쉽지 않고, 메서드를 통해 역할을 나눌 경우 여러 루프가 중복되는 문제가 생긴다. 스트림은 메서드를 통한 사용과, Lazy Evaluation( 지연 연산 )을 통해 이를 해결하고자 했다. 스트림의 특징 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다. Read-Only 스트림은 일회용이다. 최종 연산을 실행하면 스트림이 닫히게 된다. 새로운 스트림을 다시 생성해서 작성해야 한다. 최종 연산 전까지 중간 연산이 수행되지 않는다. 지연 연산 ( Lazy Evaluation ) 무한 스트림을 distinct() 로 중복을 제거하는
Java 8
What's New in JDK 8 Lambda Java 8 이전의 익명 클래스 대신 람다를 이용하여 간결하고 직관적으로 구현 가능 Method Reference 특정 메서드만을 호출하는 람다의 축약형 | 람다 | 메서드 레퍼런스 | | --- | --- | | (Soccer s) → s.getGoal() | Soccer::setGoal | | () → Thread.currentThread().dumpStack() | Thread.currentThread()::dumpStack | | (str, i) → str.substring(i) | String::substring | | (String s) → System.out.println(s) | System.out.println | Interface Default Method 인터페이스

[Java] 동작 파라미터화 적용해보기
이전 포스팅에서 모던 자바 인 액션 2장(동작 파라미터화 코드 전달하기)을 학습한 내용을 정리하였다. > > 책에 주어진 예제를 눈으로 읽고, 따라치는 것만으로는 완전히 이해한 것이 아니라는 생각이 들었고, 기존에 만들어봤던 토이프로젝트에 학습한 내용을 적용해보기로 하였다! 💡 기존 구성 회원가입 사용자로부터 회원가입 요청이 컨트롤러에 들어오면, 컨트롤러는 이를 서비스에게 넘긴다. 실질적인 유효성 검사(기존 회

JAVA8 Stream 2
Stream의 병렬처리 > 병렬 처리란 멀티코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 자바 8 부터는 병렬 스트림과 포크/조인 프레임워크를 사용하면 쉽게 병렬처리가 가능하다. 동시성과 병렬성 공통점은 둘 다 동작방식이 멀티 스레드라는 점이지만 목적은 다르다. > - 동시성 멀티 작업을 위해 멀티 스레드가 번갈아가면서 실행한다. 병렬성 병렬성은 멀티 작업을 하기 위해 멀티 코어를 이용해 동시에 실행하는 성질이다. 병렬 스트림 > 병렬 스트림은 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 병렬 스트림을 이용하면 멀티코어 프로세서가 각각의 청크를 처리하도록 할당이 가능해진다. >

JAVA 8 Stream
컬렉션과 스트림의 차이 데이터를 언제 계산 하느냐가 컬렉션과 스트림의 가장 큰 차이이다. 컬렉션 컬렉션은 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조이다. 즉, 컬렉션의 모든 요소는 컬렉션에 추가하기전에 계산되어야 한다. 컬렉션은 요소를 추가하거나 컬렉션의 요소르 삭제할 수 있다. 모든 값을 계산할 때까지 기다린다는 의미 스트림 반면 스트림은 이론적으로 요청할 때만 요소를 계산하는 고정된 자료구조이다.이것을 다시말하자면 스트림에 요소를 추가하거나 요소를 제거할 수 없다. 필요할 때만 값을 계산한다는 의미 > ### UnsupportedOpertationException 컬렉션과 스트림의 차이를 말하였다. 그 중에 하나인 컬렉션은 요소를 추가하거나 삭제할 수 있지만, 스트림은 요소를 갱신할 수 있지만 추가하거나 삭제할 수 없다.. 만약 요소를 추가하려 하면 **UnsupportedOpertat

JAVA - 람다와 스트림(9)
collect( ) collect( )는 스트림의 요소를 수집하는 최종 연산이다. collect( )가 스트림의 요소를 수집하려면, 어떻게 수집할 것인지 방법이 정의되어 있어야 한다. collect( )가 스트림의 요소를 수집하는 방법을 정의한 것이 collector(컬렉터) 이다. 컬렉터는 Collector 인터페이스를 구현한 것으로, 직접 구현하거나 미리 작성된 것을 사용할 수 있다. Collectors 클래스는 미리 작성된 컬렉터를 반환하는 static 메서드들을 가지고 있다. > 💡 주의 : Collector는 인터페이스이고, Collectors는 클래스이다. 정리 ! collect( ) : 스트림의 최종연산이며 매개변수로 컬렉터를 필요로 한다. Collector : 인터페이스이며 컬렉터는 이 인터페이스를 구현해야한다. Collectors : 클래스이며, static 메서드를 가지고 있고, 미리 작성된
함수형 인터페이스 정리
함수형 인터페이스 추상 메서드를 하나만 가지고 있는 인터페이스 Single Abstract Method 인터페이스 FunctionalInterface 애노테이션을 가지고 있는 인터페이스 람다 식은 익명 클래스의 객체와 같다. 이 인터페이스를 익명 객체로 생성 할 수 가 있다. 위의 코드를 람다식을 이용을 해서 바꿀 수가 있다. 람다식으로 변환이 가능한 이유가 f의 인터페이스와 람다식의 메서드 선언부가 ㅇ리치하기 때문이다. 그리고 람다식도 실제로는 익명 객체 취급 람다식의 매개 변수의 타입과 개수 그리고 반환 값이 일치하기 때문이다. 람다 표현식 함수형 인터페이스의 인스턴스를 만드는 방법으로 생성 할 수가 있다. 코드를 줄일 수 있다. 메소드 매개변수 , 리턴 타입 , 변수로 만들어 사용 할 수도 있다. 람다식으로 할때는 매개변수의 타입이 맞다면 생략할 수 있다. 자바에서의 함수형 프로그래밍 자바에서 함수
JAVA 8 - 함수형 인터페이스
시작하며 백기선님의 "더 자바, JAVA 8" 인프런 강의를 들으면서 정리한 내용이다. 이전에 한번 강의를 쭉 봤었는데, 그때는 "아... 저런게 있나보다" 싶었다. 근데 이제 슬슬 써보려고 하니 가물가물해서 이제는 정리하려고 한다. 다시 한번 강의를 들으면서 정리하는 글이다. 함수형 인터페이스 Function > T 타입을 받아서 R타입을 리턴하는 함수 인터페이스 함수 조합용 메서드 andThen : fn1.anThen(fn2).plus10 -> fn1를 먼저 실행하고 fn2를 실행. compose : fn1.compose(fn2).plus10 -> fn2를 먼저 실행하고 fn1을 실행. Consumer > T타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스 Supplier >T타입의 값을 제공하는 함수 인터페이스 -> 입력값이 없음. Predicate >T타
Java - Stream
Stream API란? Java 8 부터 Collection interface에 추가된 기능으로, 데이터를 선언적으로 처리하고 멀티코어 아키텍처를 활용할 수 있도록 설계되었다. 여기서 선언적으로 처리한다는 말은 가독성과 연관이 있다. 간단하게 예제를 보여주도록 하겠다. 예제 example1에서는 값을 비교하면서 max의 값을 갱신하는 부분이 드러나있기 때문에 동작 과정을 상세히 알 수 있지만 가독성이 떨어진다. 또한, 실제 example1 메소드를 실행해보면 최대값이 아닌 최소값을 반환하는데, if (max >= numbers[i]) 부분에서 잘못된 비교를 하고 있기 때문이다. 이 부분은 if (max 어떤 동작을 하는지에 대해서는 명확히 나와있다. max()` 메소드를 통해서 최대

백엔드 데브코스 TIL 04일차
학습목표 > 강의를 들으며 내가 알고 있는 내용을 점검하고, > > > 새로 배운 내용을 정리하며, > > 궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다. > Collection Collection은 여러 데이터의 묶음을 추상화한 인터페이스입니다. Collection 도입 이전에는 공통된 표준 인터페이스가 없어 프로그래머가 모든 종류의 컬렉션에서 작동할 수 있는 알고리즘을 짜는 일이 어려웠습니다. 그렇기 때문에 JDK 1.2 부터 Collection이 도입 된 후 다음과 같은 장점을 가지게 되었습니다. 자바의 컬렉션을 통해 상위 인터페이스가 구현하는 모든 클래스에 공통된 메소드를 제공해 API에 일관성을 부여합니다. 이미 추상화가 되어 있기 때문에 자료구조를 쉽게 사용할 수 있습니다. 유용한 자료구조와 알고리즘의 고성능 구현을 제공하여 프로그래머가 특정 자료 구조의 구현을 생각할 필요가 없습니다. Collection

Java 5일차 : 구구단 변형 구현해보기
21. 11. 18 학습일지 구현하고자 하는 프로그램 목표와 힌트 몇 가지만 보고서, 내가 이해하고 습득한 머릿속 코드들을 최대한 끄집어내어 본 건 처음인 것 같다. 코드 실습용 로컬 PC가 없어서, 우선은 백지에 손코딩하듯 삼성노트에 손으로 직접 써보면서 머릿속 구현을 하였고, 아쉬운대로 repl.it의 웹 IDE에 옮겨적었다. (당연하겠지만) 머릿속의 완전하지 못한 코드와 에러가 몇 군데 발생하였다. 정수형 선언을 빼먹었거나, 배열 변수명을 써야 할 자리에 자료형 예약어를 썼다거나 하는 오류들... 무엇이 어떻게 왜 잘못되었는지 이해하고서 디버깅하다보니 순조로웠다. 
Java 4일차 : 구구단을 출력하는 여러가지 코드(2)
21. 11. 17 학습일기 슬슬 간단한 구구단 프로그래밍 로직을 짜고, 실행시키고 github에 올리는 것이 익숙해지고 있다. 한 2~3시간 연속 공부하고 나니 지치고, 하기 싫어진다. 1시간 밍기적거리고 다시 30분 앉아서 얼레벌레 오늘의 목표까지 공부했지만... 이대로는 죽도 밥도 안 된다는 생각이 든다. ...어차피 지금 일을 그만둔다고 해도 일일 최대 시간 효율 못 뽑았네... 지금도 이렇게 2~3시간만에 쭉 뻗어버리는 판국에... 좀 더 습관화를 들여, 공부 집중 지구력을 키울 필요가 있는 것 같다. 어쨌든 이래저래, 배열과 별도의 메소드, 별도의 클래스 다루는 것까지 배웠네... 배열(Array) 하나의 변수에 여러 개의 데이터를 담아서, 필요할 때 이 한 개의 변수 호출로 다중 데이터를 다룰 수 있는 방법으로, 배열이 있다. 배열의 크기(변수 안에 담을 데이터의 가짓수)를 정하여 새로운 배열을 만들 수 있다. 정수형 배열 변수 선

Java 3일차 : 구구단을 출력하는 여러가지 코드(1)
21. 11. 16 학습일기 반은 이해하고, 반은 얼레벌레 코드를 짠 것 같다. 특히 while 반복문과 for 반복문, if 조건문에서, 머리로 어느 정도 동작 원리는 이해했으니 익숙하지 않아 버벅대는 느낌으로 짠 것 같다. 이런 부분들이야말로 직접 타이핑으로 반복 연습이 많이 필요한 것 같다. 또 학습 시에 코드를 직접 친 것과는 별개로, 여기 Notion에 정리하는 것도 꽤나 노가다였다. 어느 정도 밸런스 선에서 상세하게 기술해야 하는지 아직까지 긴가민가한 면도 없지 않아 있는 데다, 완벽주의 성격 상 스터디로그에 내가 잘못 이해한 것과 애매하게 이해한 것들이 남는 것에 대해 관대하지 못한 부분이 알게 모르게 스트레스를 주는 것 같다. 나중에 더 공부해야 할 부분들도 체크를 해야 할텐데... 어떻게 체크해야 한 눈에 알 수 있을까...?? 아닌가?? 너무 쓸데없이 지엽적인 고민인가?? 2단 : 결과값 출력 w/ 타이핑 노가다 한 줄 출력 명령은 `Sys

Java 2일차 : Github 저장소와 Markdown 언어
21. 11. 12 학습일기 겨우 IDE에서 코드 몇 줄 작성한 것으로 Local Repository, Remote Repository를 연동시켰을 뿐이지만, 시간이 벌써 훌쩍 지나가고, 많은 것들이 순식간에 휙휙 지나간 것 같은 기분이다. 정말 스스로 처음부터 다시 혼자 힘으로 끙끙거리며 해보지 않고서, 영상을 보고 따라한다거나 힌트를 보면서 따라한다거나 하기만 하면은 내 손과 머리의 실력이 늘지 않는 건 자명한 사실이다. 솔직히 망설여진다. 지금 시점에선 이미 이해한 것을 굳이 또 처음부터 다 원상복구 시키고, 시간과 노가다를 들여서 해야 하는가?? 의미없는 짓거리 같고 지겹고 귀찮다는 생각이 밀려온다. 마음 같아선 빨리 다음 진도로 팍팍 나아갈 수 있었으면 좋겠는데... 하지만 시니어 개발자나 강사 분 역시도, 처음부터 다시 개발 환경을 세팅하고, 직접 시행착오와 삽질을 겪으면서 체득하기를 강권하셨으니... 나름의 이유가 다 있겠지. Notion을 쓰면서 어느 정도

Java 1일차 : 자바 개발환경 구축
21. 11. 11 학습일기 처음으로 돌아가는 기분으로, Vanilla Windows에 Java JDK 8 설치, Eclipse for Java Developers 설치 이후, Eclipse에서 Java 연동을 내장 JRE가 아닌 수동 JDK 8로 세팅하는 법까지 해보았다. 찐 개발자가 되기 위해서는 PATH 환경변수 설정, Eclipse가 아닌 cmd 같은 CLI 환경에서도 코드 작성 및 컴파일을 할 수 있어야 하겠지만, 지금은 일단 Java를 설치하고 구현하는 경험 자체에 초점을 두기로 한다. 클래스 생성과 Hello world 한 줄을 출력하는 코드조차 길어서 외우기 너무 힘들다. 기본적인 코드 한 줄이 정말로 막막하다. 결국 삽질 밖에 없는 걸까... 머리의 힘만으로는 역부족이다. 손으로 반복해서 치면서, 손의 힘을 빌려야겠다. 강사님도 계속해서 개발환경 세팅과 Hello world 프로그램 구현을 반복하라고 강조하셨고, 이 조언이 나에겐 꽤나 위로와 격려가