전략 패턴(Strategy Pattern)이란?
·
JAVA
전략 패턴을 알아보자 1. 전략 패턴이란?전략 패턴이란?전략 패턴은 알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 하는 디자인 패턴이다. 이를 통해 알고리즘을 사용하는 클라이언트 코드에 영향을 주지 않고 알고리즘을 독립적으로 변경할 수 있다. 전략 패턴의 구성 요소Strategy 인터페이스알고리즘을 정의하는 공통 인터페이스다.특정 작업을 수행하기 위한 메서드를 선언한다.Concrete StrategyStrategy 인터페이스를 구현하는 구체적인 알고리즘 클래스다.다양한 알고리즘이나 행동을 구현한다.ContextStrategy 객체를 가지고 있으며, 클라이언트로부터 요청을 받아 Strategy에 작업을 위임한다.전략을 설정하고 실행하는 역할을 한다.전략 패턴의 작동 방식클라이언트가 C..
커맨드 패턴(Command Pattern)이란?
·
JAVA
Command 패턴 알아보기 1. Command 패턴이 왜 필요하고 어떤 장점을 제공할까?지금부터 레스토랑 주문 시스템을 예로 들어, Command 패턴이 왜 필요하고 어떤 장점을 제공하는지 알아보자.  Command 패턴을 사용하지 않은 경우먼저, Command 패턴을 사용하지 않고 간단한 주문 시스템을 구현해 보자.// OrderSystem 클래스: 주문 처리 담당public class OrderSystem { public void placeOrder(String item) { System.out.println(item + " 주문이 접수되었습니다."); } public void cancelOrder(String item) { System.out.println..
[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. 캡슐화란?캡슐화란 무엇일까캡슐화는 '캡슐 안에 무언가를 담는 것'을 의미한다. 우리가 아플 때 먹는 약 캡슐을 생각해 보자. 약 성분은 캡슐 안에 안전하게 보호되어 있다..