[Java] BiConsumer: 두 개의 매개변수를 처리하는 함수형 인터페이스
·
JAVA
안녕하세요 개발자 stark입니다! 오늘은 BiConsumer에 대해서 소개드리고자 합니다. 어느 날 제 사수님께서 2개의 List를 이중 stream을 돌리며 filter로 특정 조건을 매칭시키면서 값을 세팅하는 방식에서 BiConsumer를 사용하여 값을 세팅하는 방식으로 변경하신 다음 코드의 가독성과 전체적인 성능이 개선된 것을 리뷰해 주셨습니다. 그래서 저도 이 지식을 흡수하고 로직에서 사용해 보고자 BiConsumer에 대한 자료들을 찾아보며 이해하기 위해 많은 노력을 했습니다. 그리고 이제는 어느 정도 이해가 되었다고 느껴져서 조금이지만 정리해 본 것을 공유드리고자 합니다. 항상 새로운 것을 제게 가르쳐주시는 제 사수님께 감사한 마음을 가지며 포스팅을 작성합니다. 시작해 봅시다. Let's g..
[Java] ReentrantLock으로 티켓팅 시스템 동시성 문제 해결하기
·
JAVA
안녕하세요. 개발자 stark입니다! 오늘은 재미있는 주제를 가지고 왔습니다. 바로 인기 아티스트인 지드래곤의 power 콘서트 티켓팅 시스템을 구현하면서 겪을 수 있는 동시성 문제와 그 해결 방법에 대해 이야기해보려고 합니다. (실제로 존재하는 콘서트는 아니며 이런 콘서트가 있다고 상황만 가정해 봤습니다.) 아마 많은 분들이 티켓팅에 도전해 보신 경험이 있으실 텐데요. 인기 공연은 오픈과 동시에 수만 명이 접속합니다. 이런 상황에서 시스템이 제대로 동작하지 않으면 어떤 문제가 발생할까요? 예를 들어, 지드래곤의 power 콘서트는 굉장히 특별한 콘서트라 단 100석만 예약이 가능하다고 가정해 보겠습니다. 이 콘서트를 예매하기 위해 만 명의 사용자가 동시에 접속했습니다. 우리가 흔히 생각할 수 있는 방식..
[Java] List를 Optional로 처리할 때 고려해야 할 사항
·
JAVA
Optional에 List를 담았을 때 착각할 수 있는 점이 있다.📌 서론개발 작업을 하던 도중 외부 api를 호출하여 받은 응답 객체(DTO) 내부의 List 필드를 가져다 사용하는 경우가 있었다. 이때 NPE가 생기지 않도록 하기 위해 Optional로 List 필드를 한번 감싸게 되는 상황이 있었다. 이게 선호되는 방법은 아니지만 NPE를 방지하고자 로직을 이렇게 작성하게 되었다. 문제는 내가 착각을 해서 Optional로 감싼 리스트가 빈 리스트(Empty List) 일 때도 ifPresentOrElse() 메서드의 else에 잡힌다고 생각했다. 근데 빈 리스트는 null이 아니기 때문에 orElse에 잡히지 않는다. 그래서 로직을 또 바꾸게 되는 일이 생겼다. 바보 같은 실수일 수도 있지만 충..
[Java] 자바 생성자의 초기화 방법
·
JAVA
자바 생성자는 어떻게 초기화될까?  1. 생성자에서 모든 필드를 초기화할 필요가 없는 이유자바에서 생성자는 객체가 생성될 때 특정 필드를 초기화하기 위해 사용된다. 그러나 모든 필드를 반드시 생성자에서 초기화해야 하는 것은 아니다.  다음과 같은 이유로 일부 필드는 생성자에서 초기화하지 않아도 된다.선택적 초기화일부 필드는 기본값으로 초기화해도 문제가 없는 경우가 있다. 예를 들면 숫자형 필드는 기본적으로 0, 객체형 필드는 null로 초기화된다.다중 생성자여러 생성자를 정의하여 다양한 방식으로 객체를 생성할 수 있다.각 생성자에서 초기화할 필드를 선택적으로 지정할 수 있다.필드 초기화 블록 또는 선언 시 초기화필드를 선언할 때 기본값을 지정할 수 있다.초기화 블록을 사용하여 공통적으로 초기화할 수도 있..
[Java] 자바의 약한 복사(Shallow Copy)란?
·
JAVA
자바의 약한 복사를 정리해 봤다. 1. 약한 복사(Shallow Copy)란?약한 복사란?약한 복사(Shallow Copy)는 객체를 복사할 때 원본 객체의 필드 값들을 그대로 새로운 객체에 복사하는 방식이다. 여기서 중요한 점은 객체 내에 포함된 참조형 필드, 즉 다른 객체를 참조하는 필드들이 원본과 복사된 객체 모두 동일한 메모리 주소를 가리킨다는 것이다.즉, 단순히 필드의 값이나 참조를 복사할 뿐, 참조된 객체 자체는 복제하지 않는다. 따라서 원본 객체와 복사된 객체는 동일한 참조형 필드를 공유하게 되며, 한쪽에서 참조된 객체를 변경하면 다른 쪽에도 그 변경이 영향을 미칠 수 있다.예를 들어, 사람이 주소(Address)라는 필드를 가지고 있는 객체라고 가정해 보자. 약한 복사를 통해 사람 객체를 ..
[Java] 스트림(Stream)에서 가변 변수 사용 시 발생하는 문제 및 해결 방법
·
JAVA
스트림에서 가변 변수를 사용하면 문제가 발생한다. 1. 스트림에서 가변 변수 사용의 문제점스트림 내부에서 가변 변수를 사용하는 것은 여러 가지 문제를 초래할 수 있다.동시성 문제스트림은 내부적으로 병렬 처리를 지원한다. 만약 가변 변수를 공유하게 되면 여러 스레드가 동시에 접근하여 데이터 무결성을 해칠 수 있다.예측 불가능한 동작스트림의 연산은 지연(lazy) 실행되거나 최적화될 수 있어, 가변 상태는 연산의 결과를 예측하기 어렵게 만든다.가독성 및 유지보수성 저하가변 상태를 사용하면 코드의 흐름을 추적하기 어려워져 버그를 유발하기 쉽다.스트림의 설계 철학스트림의 설계 철학은 함수형 프로그래밍에 기반을 두고 있다. 함수형 프로그래밍은 상태를 변경하지 않는 순수 함수를 중심으로 작동하며, 이는 코드의 예측..
[Java] 스택 프레임과 변수의 생명 주기 이해하기
·
JAVA
자바의 스택 프레임과 변수의 생명 주기를 알아보자. 1. 스택 프레임스택 프레임이란?컴퓨터가 프로그램을 실행할 때, 메모리를 사용하는 방법 중 하나가 스택(stack)이다. 스택은 책을 쌓아 올리는 것처럼 데이터를 차곡차곡 쌓았다가, 마지막에 넣은 것부터 꺼내는 구조다.지금부터 알아볼 스택 프레임은 메서드(함수)를 호출할 때마다 생성되는 작은 상자라고 생각하면 된다. 이 상자 안에는 그 메서드에서 사용하는 지역 변수와 매개변수가 들어 있다. 메서드가 끝나면 그 상자는 스택에서 사라지게 된다.전체 메모리 구조 그림스택 프레임을 이해하기 위해 먼저 자바의 메모리 구조를 알아보자.[메모리 구조]+--------------------------+| Method Area |  메모리 구조 ..
[Java] 객체지향(OOP)의 특징: 캡슐화
·
JAVA
객체지향(OOP)의 특징 중 캡슐화에 대해 알아보자📌 서론객체지향 언어인 Java를 사용하다 보면 캡슐화에 대해 다양한 생각을 가지게 된다.나는 처음 캡슐화라는 말을 들었을 때 근본적으로 왜 "캡슐"이라고 부르는지는 생각하지 않고 진짜 알약 캡슐만을 생각하면서 개발하다 보니 대체 왜 이게 캡슐화라고 불리는 것인지 잘 이해가 가지 않았다.다만 현업에 들어와 개발을 하며 시간이 흐른 지금은 이전보다는 이해도가 많이 상승하여 조금은 어떤 느낌인지 알게 되었다. 이번 포스트에서 "캡슐화"에 대해서 간단하게 예시를 통해 알아보도록 하자.  1. 캡슐화란?캡슐화란 무엇일까캡슐화는 '캡슐 안에 무언가를 담는 것'을 의미한다. 우리가 아플 때 먹는 약 캡슐을 생각해 보자. 약 성분은 캡슐 안에 안전하게 보호되어 있다..