Backend/Java 29

[Java]자바 메모리 관리: 스택(Stack)& 힙(Heap)

자바 애플리케이션은 JVM 위에서 동작하며, JVM은 효율적인 메모리 관리를 위해 스택(Stack)과 힙(Heap)을 중심으로 메모리를 관리합니다. 이 글에서는 스택과 힙의 구조, 동작 원리, 그리고 실제 개발에서 반드시 알아야 할 내용을 정리하겠습니다.✍️ JVM 메모리 구조에서 스택과 힙의 위치JVM의 메모리는 크게 5가지로 나뉩니다. 메서드 영역(Method Area): 클래스 정보와 상수 풀(Constant Pool) 저장힙(Heap): 모든 객체와 배열이 저장스택(Stack): 각 스레드의 메서드 호출과 관련된 데이터 저장PC 레지스터(Program Counter Register): 현재 실행 중인 명령어 주소 저장네이티브 메서드 스택(Native Method Stack): 네이티브 코드(C, ..

Backend/Java 2024.11.20

[Java] Optional 한눈에 정리하기

Optional은 Java 8에 도입된 클래스로 null 처리를 안전하게 하고 코드의 가독성을 높이는 데 도움을 줍니다.이 글에서는 Optional에 대해 간단하게 정리해 보겠습니다. 👩🏻‍💻 Optional 기본 개념Optional은 값이 존재할 수도 있고 없을 수도 있는 상황을 명시적으로 표현합니다.NullPointerException 방지값을 감싸는 컨테이너 역할을 하며, null일 가능성을 안전하게 처리Optional 사용 이유명시적으로 값이 없음을 표현(`Optional.empty()`)null 대신 의미 있는 API 설계null 체크를 명시적으로 처리Optional 생성 방법1) 빈 Optional 생성Optional emptyOptional = Optional.empty();2) nul..

Backend/Java 2024.11.19

[Java] @SuperBuilder란?

상속 구조에서 @Builder를 어떻게 사용할 수 있을지 고민하던 중, 더 유연한 방식으로 객체 생성 패턴을 지원하는 @SuperBuilder 어노테이션을 알게 되었습니다.이 글에서는 @SuperBuilder의 개념, 사용 예시, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해 알아보도록 하겠습니다.🧐 @SuperBuilder란?@SuperBuilder는 Lombok 라이브러리에서 제공하는 어노테이션으로 상속 구조에서 빌더 패턴을 간편하게 사용할 수 있도록 도와줍니다. 기본적으로 Lombok의 @Builder는 상속 구조를 지원하지 않기 때문에 상속된 클래스들에서 객체를 생성할 때는 여러 문제점이 발생할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 @SuperBuilder입니다.@SuperB..

Backend/Java 2024.10.17

[Java] String.valueOf()와 toString() 차이점

Java에서 사용하고 있는 String.valueOf()와 toString()은 객체를 문자열로 변환하는 데 사용되지만 약간의 차이가 있습니다.각각의 특징과 차이를 알아보겠습니다. 😺 String.valueOf()String.valueOf() 메서드는 다양한 타입(기본 타입과 객체 모두)을 받아서 이를 문자열로 변환합니다.이 메서드는 null 처리를 포함한 안전한 변환을 제공합니다.null 안전String.valueOf()는 인자로 전달된 객체가 null일 경우 "null"이라는 문자열을 반환합니다.다양한 타입 지원boolean, char, int, long, float, double 등의 기본 타입과 객체 타입을 처리할 수 있습니다.Object obj1 = null;System.out.println(..

Backend/Java 2024.10.14

[Java] 직렬화(Serialization)

직렬화(Serialization)는 객체를 바이트 스트림(Byte Stream)으로 변환하여, 이를 파일로 저장하거나 네트워크를 통해 전송할 수 있게 하는 과정입니다.반대로, 역직렬화(Deserialization)는 바이트 스트림을 다시 객체로 복원하는 과정입니다.Java에서는 직렬화를 통해 객체의 상태를 저장하거나 다른 시스템으로 데이터를 전달할 수 있습니다.이번 글에서는 직렬화에 대해 알아보겠습니다.🧐 직렬화의 필요성자바 프로그램에서는 메모리 내에서만 객체를 사용할 수 있습니다.하지만 때로는 객체를 파일로 저장하거나 네트워크를 통해 전송할 필요가 있습니다.이때 객체의 상태를 바이트 스트림으로 변환하여 저장하거나 전송할 수 있는데, 이 과정이 바로 직렬화입니다. 예를 들어, 한 객체의 데이터를 파일에..

Backend/Java 2024.09.17

[Java] 람다 표현식(Lambda Expressions)

Java 람다 표현식은 Java 8에서 도입된 기능으로, 코드의 간결성과 가독성을 높여줍니다.람다 표현식을 사용하면 더 간단하고 읽기 쉬운 코드 작성이 가능해집니다.평소에 사용하던 람다 표현식과 기본 개념을 정리해 보겠습니다.👀 람다 표현식이란?람다 표현식은 익명 함수를 간단하게 표현할 수 있는 방법입니다.익명 함수란 이름이 없는 함수를 의미하며, 일반적으로 함수형 인터페이스를 구현하는 데 사용됩니다. 람다 표현식의 기본 형태는 다음과 같습니다.(parameters) -> expression여기서 parameters는 함수의 매개변수, expression은 함수의 본문입니다. 람다 표현식의 예시다음은 람다 표현식을 사용한 간단한 예시입니다.이 예시는 두 개의 숫자를 더하는 함수를 람다 표현식으로 정의합..

Backend/Java 2024.09.16

[Java] 상속(Inheritance)보다는 컴포지션(Composition)

객체지향 프로그래밍에서는 코드 재사용과 구조화를 위해 상속(Inheritance)과 컴포지션(Composition)이라는 두 가지 주요 개념을 사용합니다. 이 두 가지는 클래스 간의 관계를 정의하고, 기능을 재사용하는 방법을 제공합니다.그러나 두 개념은 본질적으로 다르며, 특정 상황에서는 하나가 다른 것보다 더 유리할 수 있습니다. 👀이번 글에서는 컴포지션이 상속보다 더 나은 선택이 될 수 있는 이유에 대해 알아보겠습니다.📝 상속(Inheritance)란?상속은 기존 클래스(부모 클래스, 슈퍼 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스, 서브 클래스)가 물려받아 사용하는 개념입니다. 이를 통해 코드의 중복을 줄이고, 이미 작성된 기능을 재사용할 수 있습니다.상속을 사용하여 동물(Animal..

Backend/Java 2024.08.24

[Java] JPA의 @Lock 동시성 제어

데이터베이스와 관련된 애플리케이션을 개발하다 보면 동시성 문제를 다루어야 할 때가 많습니다.🤔JPA에서 여러 스레드 또는 트랜잭션이 동일한 데이터를 동시에 읽고 쓰려고 할 때 발생할 수 있는 문제를 해결하기 위해 다양한 잠금(Locking) 기법에 대해 살펴보겠습니다. @Lock 어노테이션이란?@Lock 어노테이션은 JPA에서 엔티티에 대한 동시성 제어를 위한 잠금 메커니즘을 정의할 때 사용됩니다.이 어노테이션은 주로 @Query 어노테이션과 함께 사용되어 쿼리 실행 시 특정 잠금 모드를 적용하도록 지시합니다.이를 통해 특정 엔티티에 대한 동시성 제어를 강화할 수 있습니다. 예를 들어, 특정 리포지토리 메서드에서 @Lock 어노테이션을 적용하여 비관적 잠금을 설정할 수 있습니다.public inter..

Backend/Java 2024.08.12

[Java] for 루프와 Stream API

다들 코드 작업을 하다 보면 다양한 이유로 반복 작업을 수행해야 할 때 어떤 방법으로 작업을 진행하시나요??이 글에서는 반복 작업을 수행할 때 적절하게 for 루프와 Stream API를 사용할 수 있도록 알아보겠습니다. 🙌 for 루프기본 사용 방법으로는 아래와 같습니다.정수 기반 반복문 (특정 범위 내의  정수를 반복할 때 사용합니다.)for (int i = 0; i 확장된 for 루프(배열이나 컬렉션의 각 요소를 순회할 때 사용합니다.)List list = Arrays.asList("a", "b", "c");for (String item : list) { System.out.println(item);}장점직관적이고 간단함for 루프는 프로그래머가 직관적으로 이해하기 쉬운 구조입니다.특히, 초..

Backend/Java 2024.08.10

[Java] final 불변 객체를 사용해야하는 이유

불변 객체는 소프트웨어 설계에서 중요한 개념이라고 생각합니다.실수를 예방하고 로직 구현에 집중할 수 있는 장점을 가지고 있는 불변 객체에 대해 알아보겠습니다. 🤓  불변 객체(Immutable Object)란?불변 객체는 생성된 이후에는 상태가 변경되지 않는 객체를 의미합니다.즉, 객체의 상태가 한번 설정되면 수정할 수 없으며, 객체의 필드 값이 불변으로 유지됩니다.불변 객체는 설계와 구현에 있어서 중요한 원칙으로 다양한 장점으로 인해 많이 사용됩니다.불변 객체의 특징 상태 변경 불가능객체가 생성된 이후에는 내부 상태를 변경할 수 없습니다.스레드 안전성여러 스레드에서 동시에 접근해도 안전합니다.복잡성 감소상태를 변경하지 않기 때문에 코드가 단순해지고, 디버깅과 유지보수가 용이합니다.불변 객체를 사용하는..

Backend/Java 2024.08.10