Java로 코딩테스트 문제를 풀던 중, 2차원 배열을 clone() 메서드로 복제한 후 수정하는 로직에서 원본 배열까지 함께 변경되는 문제를 경험했다. 당시에는 "clone이 얕은 복사를 수행하기 때문"이라는 표면적인 이해만으로 넘어갔고, 2차원 배열은 무조건 2중 반복문으로 복사해야겠다는 생각만 가진 채 문제를 마무리했다. 최근 『이펙티브 자바』와 『이것이 자바다』를 읽으며 배열의 메모리 구조와 clone()의 동작 원리를 깊이 있게 학습할 기회가 있었다. 힙 메모리에서 1차원 배열과 2차원 배열이 각각 어떻게 관리되는지, 그에 따라 clone()이 어떻게 동작하는지를 이해하면서 가변 객체, 불변 객체, 깊은 복사, 얕은 복사의 개념을 명확히 정리할 수 있었다. 이 글에서는 학습한 내용을 바탕으로 cl..
Spring Boot로 개발하다 보면 @Builder, @Service같은 어노테이션을 너무나 자연스럽게 사용하게 됩니다. 하지만 문득 이런 생각이 들었습니다."만약 Lombok이나 Spring이 없다면 어떻게 구현해야 할까?" 그래서 이번에는 빌더 패턴과 싱글톤 패턴을 직접 구현하면서 이전까지 이론적으로만 학습해왔던 디자인 패턴들에 대해 자세하게 공부해 보며 직접 적용할 때는 어떤 점을 주의해야하는지 학습해 보았습니다. 1. 빌더 패턴 왜 필요할까?객체를 생성할 때 이런 코드를 본 적 있으신가요?Pizza pizza = new Pizza(12, "thin", "mozzarella", "tomato", "olive", "pepperoni", true, false); 매개변수가 8개나 되는데, 순서도 헷갈..
1. 기획 동기상반기 입사 지원을 하면서 자주 사용하는 파일이나 사진을 크롬 브라우저에서 업로드할 때마다 불편함을 느꼈다. 파일을 찾아가는 과정이 생각보다 귀찮고 번거로웠기 때문이다.위 화면은 내 노트북에서 파일 업로드 버튼을 클릭했을 때 나오는 파일 탐색기다. 여기서 원하는 파일을 찾아가는 시간을 줄일 수 있지 않을까? 이런 생각에서 '파일 경로 북마크' 프로젝트가 시작되었다. 크롬 우측 상단의 북마크 탭처럼, 내 노트북의 파일 경로를 북마크로 저장하면 파일 업로드 시 찾아가는 시간을 획기적으로 줄일 수 있을 것 같았다. 2. 요구사항 정리애플리케이션 개발에 앞서 가장 고민했던 지점은 "북마크를 정말 필요한 순간에 바로 사용할 수 있어야 한다"는 것이었다. 이상적인 시나리오를 그려보니, 크롬에서 파일 ..
책이랑 강의로 객체지향 패러다임에 대해 공부하며 직접적으로 문제 하나에 대해 처음부터 끝까지 코드를 작성하는 연습을 진행해야겠다는 생각이 들었다. 계속 개념적으로만 학습을 진행해 실제 구현을 해나갈 때 어떤 고민들과 문제점을 마주치는지 경험하고자 레스토랑 음식 주문 시스템을 구현해 보기로 결정했다. 관련 레포지토리는 아래 링크를 참고해 주세요. 문제의 요구사항은 생성형 AI가 일부 만들어줘서 제시된 스켈레톤 코드를 필수적으로 구현하려 하진 않았고, 핵심 기능에 해당하는 입출력 예시와 요구사항을 만족시키도록 코드를 작성하였습니다. GitHub - HeeChanN/oop-food-order-management-system: OOP 연습(2) - 레스토랑 주문 시스템OOP 연습(2) - 레스토랑 주문 시스템...
최근 Java 문법에 대해 책을 정독하며 공부하며 이번에 처음 알게 되어 한번은 정리해놓고 싶은 개념들을 정리해보려고 합니다. 학교에서 한 학기 동안 Java 프로그래밍을 들으며 학습했던 내용 외에는 Java 언어에 대해 직접 책을 정독하며 공부한 적이 없었는데, 그만큼 지식에 많은 빈틈을 갖고 있었고 이번 기회에 이렇게 학습하고 기록할 수 있다는 점에서 다행이라고 생각합니다. 리터럴 정의리터럴은 너무 간단한데 용어 자체를 이번에 처음으로 알게되었다. 기본형 타입에 값을 넣어서 선언한 경우를 리터럴이라고 부른다. String 같은 경우 참조 타입 리터럴로 Heap에 String 상수 풀을 관리하며 동일한 문자열 리터럴에 대해서 동일한 객체를 참조한다.대학교에서 C를 기반으로 학습을 진행했어서 그런지 이런..
Spring Boot로 프로젝트를 진행할 때, Local 노트북 환경에서는 문제없이 동작하던 시간 비교 로직이 리눅스 우분투 환경에서는 예상과 다르게 동작하는 현상을 발견했다. Client에서 요청에 finished_at과 같은 (날짜 + 시간) 데이터를 전달할 때, 원하는 값에 9시간이 더해져서 DB에 저장되고 있었다. 이 글에서는 이러한 문제가 왜 발생했는지 분석하고, 지금까지 Spring Boot 개발 과정에서 적용되었던 시간 관련 설정들을 정리하며 학습한 내용을 공유하고자 합니다. 1. 문제 원인 파악Client에게 요청을 받아와 저장하는 로직에 log를 남기고 우분투 서버에서 확인해 보았을 때, 다음과 같은 문제를 발견할 수 있었다.LocalDateTime.now()로 생성된 날짜가 UTC로 ..