We will find a way, we always have.

-interstellar

자바 15

[리뷰] 함수형 프로그래밍 with 자바

"한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다."   함수형 프로그래밍을 사용한다면 코드를 간결하고 효율적으로 표현할 수 있다. 또한 복잡한 로직을 읽기 쉽게 리팩토링할 수 있으며 재사용 가능한 코드로 만들어준다.  이전까진 '모던 자바 인 액션'을 통해 함수형 프로그래밍을 배웠다면 이제는 '함수형 프로그래밍 with 자바'로 함수형 프로그래밍을 배워도 좋을 거 같다고 생각한다. 모던 자바 인 액션도 람다와 함수형 프로그래밍을 다루지만 자바 8로 다루기 때문에 살짝 올드한 면이 있다.  함수형 프로그래밍 with 자바에선 자바 17를 사용하고 있어 record나 새로운 스트림 문법들을 사용하여 좀 더 young하다고 생각한다.  자바와 관련한 좋은 레퍼런스 북이 생겨 뿌듯하다:)

Blah blah 2024.04.28

[자바] final에 美친놈

서론 우테코 레벨1 때 첫번째 미션이었던 자동차 경주 미션과 마지막 미션인 체스 미션의 main 메서드를 살펴보면 눈에 띄게 달라진 게 있다. 바로 final main의 파라미터인 args에도 final, 로컬 변수에도 final, try catch 문에서 잡은 예외에도 final이 붙어 있다. 제일 처음 꼬신건 :네오:였다. 문자열 덧셈 계산기 피드백 강의를 보는데 코드 여기저기서 final을 볼 수 있었다. 그때부터 이녀석에게 관심을 갖기 시작했다. 그럼 이제 final이 뭐길래 얘는 필사적으로 final을 붙이려고 하는지 알아보자. 본론 final 키워드를 추가할 수 있는 곳은 여럿 있는데 각각 의미가 다르다. 클래스 상속 제한 메서드 오버라이딩 제한 변수 재할당 제한 여기서 나는 변수에 초점을 두..

[자바] 내가 커스텀 예외를 사용하게된 이유 (IllegalArgumentException, IllegalStateException)

서론지금까지 도메인 요구 사항에 맞지 않는 입력이 들어온다면 주로 IllegalArgumentException를 사용하였고 파라미터로 어떤 예외인지 메시지를 담아 의미를 전달하였다. 이녀석이 뭐 특별한 기능을 제공하느냐? 라고 물어본다면 네니오라고 답할 수 있다. IllegalArgumentException이 제공하는 기능은 의미를 전달하는 것이다. 다시말해 유효하지 않은 인자가 왔다는 의미를 전달하는데 요게 바로 특별한 기능이다. 나는 이 IllegalArgumentException 안에 메시지를 넣어 예외를 다르게 표현하는 방식을 사용해왔다. 프리코스 때 뿐만 아니라 우테코 들어와 자동차 미션, 사다리 타기 미션 때까지만하여도. 이때까진 커스텀 예외를 사용하는 크루를 보고 아 너무 오버 엔지니어링 아..

[자바] ENUM에서 equals() vs ==, NPE(NullPointerException)의 고찰

서론 자바는 상수를 우아하게 관리하기 위해 enum을 제공한다. 이때 enum 값들은 전부 상수로 관리되는데 이 값들을 비교할 때 equals 메서드를 사용하느냐 아니면 == 으로 비교하느냐에 대해 토론의 장이 열렸다. 스택 오버플로우에도 쏼라쏼라 말이 많은 주제인 듯 하다. 본론으로 가기전 짚어야 할 점은 enum의 equals 메서드는 final로 정의되어 있어 재정의가 불가하며, 안에서 ==을 사용하여 비교를 한다. 본론 첫번째로 enum의 값을 비교할 때 ==를 사용할 것인가 equals를 사용할 것인가에 대한 토론을 하였다. ==을 사용했을 때 얻을 수 있는 장점은 컴파일 타임에 체크가 가능하다는 것이고, 또한 NPE(NullPointerException)을 피할 수 있다는 것이었다. 그렇게 자..

[자바] VO와 Record

우테코 메타인지 말하기 스터디때 준비한 글 VO (Value Objects) VO는 Value Objects의 약자로 값 객체를 나타낸다. 자바에서 VO를 사용하는 이유는 명확한 의미전달 및 책임 캡슐화이다. 단순히 원시값을 사용할 때와는 달리 이 객체가 어떤 역할을 담당하고 있는지를 이름을 통해 전달할 수 있다. 그리고 요구사항이 주어졌을 때 해당 객체 내에서 요구사항을 구현하여 캡슐화를 지킬수 있다. VO 사용시 유의사항 equals() && hashcode() VO를 만들었다면 필수로 equals() && hashcode() 메서드를 구현해줘야 한다. equals() && hashcode()가 구현되지 않았다면 객체의 값을 비교하는 것이 아니라 객체의 주소를 비교하기 때문에 원하는 대로 동작하지 않..

[우테코 레벨 1]: 1주차 회고

회고를 작성하는게 언제까지 지속될진 모르겠지만 일단 해보자!! 레디의 1주차 회고 시작합니다. OT 2월 13일부터 본과정이 시작되었다. 데일리 조는 제제, 비토, 백호, 커비, 종이, 안나, 테바, 러쉬, 리건이였다. 연극조는 그 중 제제, 비토, 백호, 커비 이렇게 였고, 첫 페어는 백호였다! OT때 기억에 남았던 문장들을 남겨본다. 다양한 피드백을 통해 메타인지 역량을 키움 모르는 것을 모른다고 할 수 있는 용기 빠르게 실패하기 일단 도전하기 페어 프로그래밍의 맛보기로 문자열 계산기 프로그램을 작성하는 하는 것이였다. 주어진 시간이 무척이나 짧았기에 고민보다는 GO를 하였어야 했는데 처음이다 보니 서툴렀다. 일단 기능부터 빠르게 구현하고 그 이후에 피드백을 받는 것이, 제한 시간안에 동작할 수 있는..

[Spring] query dsl Q클래스 파일 위치 설정 (스프링 버전 3.2 )

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화강의를 듣는 도중 마지막 부분에서 query dsl 도입을 하기 위해 build.gradle 파일을 설정하는데, 스프링이 버전업 되면서 기존 코드로는 설정이 되지 않아 문제가 발생하였다. 제공해주신 3.x 버전용 build.gradle 파일에서도 그래들 리프레쉬중 오류가 나거나 빌드 오류가 발생하거나 겨우 컴파일 성공하여도 Q 클래스가 main.java.generate 에 위치해있는 게 아니라 어디 저 멀리 build.generated 에 가있어 자바 프로젝트 내에서 import 가 되지 않는 문제들이 있었다. 해결 방안은 일단 컴파일 성공하는 단계에서 Q 클래스 파일 생성 위치를 알맞게 설정하는 것이다. plugins { id 'java'..

[자바] 자바에서 ConcurrentHashMap

개선된 ConcurrentHashMap ConcurrentHashMap 클래스는 동시성 친화적이며 최신 기술을 반영한 HashMap 버전이다. 내부 자료구조의 특정 부분만 잠궈 동시 추가, 갱신 작업을 허용한다. 떄문에 동기화된 Hashtable 버전에 비해 읽기 쓰기 연산 성능이 월등하다. 리듀스와 검색 ConcurrentHashMap은 스트림에서 봤던 녀석들과 비슷한 종류의 세 가지 새로운 연산을 제공한다. forEach: 각 (키, 값) 쌍에 주어진 액션을 실행 reduce: 모든 (키, 값) 쌍을 제공된 리듀스 함수를 이용해 결과로 합침 search: 널이 아닌 값을 반환할 때까지 각 (키, 값) 쌍에 함수를 적용 또 키, 값 그리고 Map.Entry 를 활용해서도 연산을 수행할 수 있는 메서드도..

[자바] static 메서드와 static 클래스

static class와 static method 자바에서 static 키워드는 JVM이 시작될 때 static 영역에 한번 저장되어 프로그램이 종료될 때 해제되는 것을 의미한다. static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 가지지만 Garbage Collection이 관리하지 않으므로 자주 사용한다면 메모리 효율이 떨어질 수 있다. static 메서드 static 메서드는 객체 생성 없이 사용할 수 있는 메서드이다. 사용 예시 class Counter { static int count = 0; Counter() { count++; System.out.println(count); } public static int getCount() { return count; } } pu..

[백준] 2133번 타일 채우기 - 파이썬, 자바

🔈 문제 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. 📝입력 첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다. 📑출력 첫째 줄에 경우의 수를 출력한다. 📚 문제 풀이 dp 점화식을 찾아내는 문제였다. 전형적인 dp 문제. 위의 사진이 N이 12일 때의 한 경우이다. 그림을 조금 그려보면 N이 홀수일때는 2X1, 1X2 타일로 벽을 전부 채울 수 없다. 때문에 N이 홀수면 경우의 수는 0이 된다. N이 2일 때는 3가지의 경우의 수가 등장한다. N이 4일 때는 총 11가지의 경우의 수가 등장하는데 N이 4일 때만 나올 수 있는 경우의 수 2개랑 N이 2일 때의 경우의 수인 3을 제곱한 결과이다. 처음에는 이렇게 생각하여 점화식을 적었는데 틀렸습니다 판정을 받았다. 결국 질..