이번에 출석으로 페어프로그래밍하다가 처음 안 사실이있다. 바로 `yyyy-MM-dd`와 `YYYY-MM-dd`가 다르다는 사실!나는 처음 알았다. 과연 둘은 뭐가 그렇게 다를까? 둘의 가장 큰 차이점은 y와 Y가 각각 다른 개념의 연도를 의미한다는 것이다. 특히 `YYYY`는 ISO-8601의 Week-based year를 따르기 때문에 연초와 연말에 의외의 값이 나올 수 있다. ISO 8601은 날짜와 시간의 표준 형식을 정의하는 국제 표준입니다. 이 표준에서는 연도를 나타내는 다양한 형식을 다루며, 특히 주 기반 연도(week-based year)에 대한 내용을 포함하고 있습니다. 이게 무슨 말이냐? 1️⃣ yyyy-MM-dd yyyy는 달력을 기준으로 한 연도를 의미한다. 즉, 우리가 보통 ..
public LottoNumbers(final List lottoNumbers) { validateLottoNumbers(lottoNumbers); this.lottoNumbers = ensureSorted(lottoNumbers); } `LottoNumbers`라는로또 미션을 수행하던 중에 구두로 리뷰를 받은 적이 있다."외부에서 전달된 `List`를 그대로 내부 필드에 할당하면, 외부에서 리스트를 변경할 때 내부 필드도 함께 영향을 받는 문제가 발생할 수 있지 않을까요?" 맞는 말이었다. 왜 내가 고려하지 않았을까? 생각보다 관성적으로 코드를 작성하고 있는 순간들이 많다는 것을 다시 한 번 깨달았다. 🚨 외부에서 리스트를 그대로 내부 필드에 할당하면 발생하는 문제..
코드를 작성하다가 이러한 질문을 받았다. 나의 답변은 간단했다."자주 사용하는 상수를 모아놓은 상수 클래스 즉, 정적 변수만 사용하는 클래스이기 때문에 인스턴스가 필요하지 않기 때문에 private 으로 선언했습니다." 그런데 뭔가 이 이상 답변하지 못한다는게 아쉬웠다.적어도 파생되는 개념들을 설명할 수 있어야 한다고 생각이 들었다. 그래서 다시 공부해보기로 했다. 내가 유틸이나 상수클래스등에는 `private` 생성자를 해놓아야 한다는 말을 처음 들은 곳은 Effective Java Item 4 "인스턴스화를 막으려거든 `private` 생성자를 사용하라"였다. 해당 내용을 이전에 발표했던 내용을 사용해서 정리하자면 아래와 같다. 🚀 자바에서 인스턴스가 필요하지 않는 경우자바에서 ..
개발하다 보면 "객체가 같은지 확인해볼까?"라는 순간이 자주 옵니다. ==만 쓰면 되지 않냐고요? 사실 ==는 객체의 참조값(주소)를 비교하기 때문에, 우리가 진짜 원하는 값 비교는 안 되는 경우가 많습니다. 그때 등장하는 게 바로 equals입니다. 기본적으로 Object 클래스에서 제공되지만, 직접 정의해야 하는 경우도 꽤 많습니다. 1️⃣ 언제 equals를 정의해야 할까? 1. 객체의 "값"을 기준으로 비교하고 싶을 때예를 들어, 같은 이름과 나이를 가진 사람이 같은 사람으로 간주되어야 한다면, equals를 정의해야 합니다. 그렇지 않으면 기본 equals는 객체의 주소값(물리적 동치)을 비교하기 때문에 다른 객체로 판단될 수 있습니다. 두 객체가 "물리적으로 같음"이 아니라 "논리적으로 같음"..
Stream.forEach가 종단 연산이라는 것을 공부하다보니 여기까지 왔다. 1. Collection.forEach란?`collection.forEach`는 `Iterable` 인터페이스에서 제공하는 메서드로, 컬렉션의 모든 요소를 순회하면서 하나씩 작업을 수행합니다. 특징- 내부 반복자(internal iterator)를 사용합니다.- 순차적으로 요소를 처리합니다.- 기본적으로 데이터 변경에 적합합니다. public class Main { public static void main(String[] args) { List names = new ArrayList(List.of("Alice", "Bob", "Charlie")); // Collection.forEach 사..
자바 8의 출시와 함께 다양한 새로운 기능들이 추가되었는데, 그 중 하나가 바로 forEach 메서드입니다. 이번 글에서는 forEach가 무엇인지, 어떻게 사용하는지, 그리고 주의사항 및 한계에 대해 알아보겠습니다. forEach란?`forEach`는 자바 8에서 추가된 `Iterable` 인터페이스의 디폴트 메서드로, 컬렉션의 모든 요소를 순회하며 지정된 동작을 수행합니다. 기존의 `for` 또는 `iterator`를 사용하는 방법보다 코드가 간결해집니다. 기본 사용법List list = Arrays.asList("apple", "banana", "cherry");list.forEach(fruit -> System.out.println(fruit)); 람다 표현식과의 연계forEach는 함수형 인터페..
스트림(Stream)을 공부하다 보면 종단 연산과 중간 연산이라는 말이 자주 나옵니다. 이게 뭐냐면, 스트림에서 데이터를 다루는 과정에서 어디까지 준비 단계인지, 어디서 실제 결과를 만드는지를 구분한 거예요. 쉽게 말해, "준비 작업(중간 연산)"과 "마무리 작업(종단 연산)"의 차이입니다. 1. 스트림(Stream)이란?이미 알고계시겠지만 스트림은 데이터를 다루는 흐름입니다.예를 들어, "리스트나 배열 같은 데이터 모음을 일렬로 나열해서 처리하는 도구"라고 보시면 좋습니다.스트림에서는 데이터를 "흘려보내며(filter, map)" 처리하고, 최종적으로 "결과를 만들어내거나(forEach, collect)" 끝냅니다.2. 중간 연산이란?중간 연산은 데이터를 가공하는 "준비 작업"입니다.이 단계에서는 결과..
다른분들 코드리뷰를 보다가 static 메서드를 사용하는거를 보고 "static 메서드를 사용하는 이유가 뭔지 알 수 있을까요?" 라는 리뷰가 달렸는데 제가 관련자는 아니지만 만약 내가 답변이 남긴다면 뭐라고 남길가 해봤는데 논리적인 근거를 가지고 명확하게 설명을 못하는 저 자신을 발견했습니다. 저도 옛날에 공부하고 어느덧 다 휘발되고 관성적으로 쓰고 있었습니다. 마치 한국어 문법 모르는 부분을 사용하는 데 느낌적으로 이게 맞다라고 생각하고 쓰듯이 말이죠 그래서 이참에 정리해보았습니다. 혹시 여러분들은 잘 설명하실 수 있나요? 🚀 정적 팩토리 메서드 정적 팩토리 메서드(Static Factory Method)는 객체의 생성 방식을 단순화하고 제어하기 위한 패턴으로, 클래스의 생성자를 직접 호출하..