[Java] JVM Garbage Collection 구조와 Promotion(승격) 조건
·
Back end/Java
1. JVM Garbage Collection(GC)이란?Garbage Collection(GC)은 자바의 메모리 관리 기법 중 하나로, 힙(Heap) 영역에서 더 이상 참조되지 않는 객체들을 찾아 메모리에서 해제하는 과정을 의미합니다. C나 C++ 과 달리 개발자가 직접 메모리를 해제할 필요가 없으며, JVM이 자동으로 관리해줍니다.GC의 장점메모리 누수 방지: 프로그래머의 실수로 인한 메모리 누수를 자동으로 방지개발 생산성 향상: 메모리 관리에 신경 쓰지 않고 비즈니스 로직에만 집중안정성 보장: 메모리 부족으로 인한 프로그램 정지 위험을 감소GC의 단점GC 중단시간(Stop-The-World): GC 실행 중 모든 애플리케이션 스레드가 중단성능 저하: GC로 인한 CPU 사용률 증가예측 불가능성: G..
[Java] JDBC의 Statement와 PreparedStatement
·
Back end/Java
데이터베이스와 통신하는 Java 애플리케이션을 개발할 때, JDBC를 통해 SQL을 실행하게 됩니다. 이때 Statement와 PreparedStatement 중 어떤 것을 사용하느냐에 따라 애플리케이션의 성능과 보안이 크게 달라집니다.Statement: 유연하지만 위험한 방식Statement는 가장 기본적인 SQL 실행 방식입니다. 쿼리를 작성할 때 문자열 연결(String concatenation)을 통해 동적으로 SQL을 구성합니다.String userId = "user123";String sql = "SELECT * FROM users WHERE id = '" + userId + "'";Statement stmt = connection.createStatement();ResultSet rs = s..
AtomicInteger는 어떻게 동시성을 보장할까? - CAS 알고리즘 깊이 파헤치기
·
Back end/Java
들어가며이런 질문을 받았습니다."일반 int에 synchronized를 걸지 않고 100개 스레드가 각각 +1을 하면 결과가 100이 안 나올 수 있습니다. 하지만 AtomicInteger.addAndGet()을 사용하면 락 없이도 정확히 100이 보장됩니다. 어떻게 이게 가능한가요?당시에는 제대로 답변하지 못했지만, 이후 학습을 통해 그 원리를 정리해보았습니다.문제 상황: Race Condition먼저 문제를 명확히 해봅시다.// 문제가 되는 코드private int counter = 0;// 100개의 스레드가 동시에 실행public void increment() { counter++; // 이 한 줄이 사실은 3개의 작업!}counter++는 원자적(atomic) 연산이 아닙니다. 실제로는:R..
[Java] static import 활용법
·
Back end/Java
테스트 코드를 작성하다 보면 Assertions.assertThat(...) 같은 코드가 반복됩니다. 이럴 때 static import를 사용하면, 훨씬 간결하고 깔끔한 테스트 코드를 만들 수 있습니다.🔍 예제 전후 비교📌 Before: 일반 import 사용import org.assertj.core.api.Assertions;...Assertions.assertThat(discount).isEqualTo(1000);📌 After: static import 사용import static org.assertj.core.api.Assertions.assertThat;...assertThat(discount).isEqualTo(1000);✅ assertThat을 바로 사용할 수 있어서 코드가 훨씬 깔끔해졌..
[Java] 자바 데이터 타입 (기본형, 참조형)
·
Back end/Java
자바는 정적 타입 언어로, 변수를 선언할 때 데이터 타입을 명시해야 합니다.자바의 데이터 타입은 크게 다음 두 가지로 나뉩니다.기본형 (Primitive Type)참조형 (Reference Type)🔢 기본형 타입 (Primitive Type)기본형 타입은 값 자체를 메모리에 저장합니다.자바에는 총 8가지 기본형 타입이 있으며, 성능이 중요한 영역에서 자주 사용됩니다.분류 타입 크기 예시논리형boolean1 bytetrue, false문자형char2 byte'a', '1'정수형byte, short, int, long1~8 byteint x = 59;, long big = 123L;실수형float, double4, 8 bytefloat f = 3.14f;, double d = 3.14;📌 Tip: 숫자..
[Java] 상수(Constant)
·
Back end/Java
🔒 상수란?상수(Constant)는 한 번만 값을 저장할 수 있는 메모리 공간입니다.프로그램 실행 중 절대 변경되어서는 안 되는 값을 의미하며, final 키워드를 사용하여 선언합니다.final int J = 10;// J는 한 번만 값을 저장할 수 있음📌 상수의 명명 관례모두 대문자로 작성여러 단어는 밑줄(_)로 구분예: MAX_COUNT, PI, DEFAULT_TIMEOUT❓ 상수는 언제 사용할까?값이 절대 바뀌면 안 되는 경우예: 원주율(π), 최대 접속 수, 세율 등숫자나 값의 의미를 명확하게 하고 싶을 때→ 매직 넘버 대신 의미 있는 상수명을 사용하여 코드 가독성 향상✅ 상수 사용 예제public class ConstantExam { public static void main(Strin..
[Java] 변수(variable)
·
Back end/Java
✅ 변수란? 변수(variable)는 값을 저장할 수 있는 메모리 공간입니다.자바에서는 데이터를 저장하고 처리하기 위해 변수를 반드시 선언해야 하며,변수에 저장된 값은 언제든 변경할 수 있습니다. ✅ 변수 선언 방법 자바에서 변수를 사용하려면 선언(Declaration)이 필요합니다.int count; // 정수를 저장할 수 있는 변수 count 선언double average; // 실수를 저장할 수 있는 변수 average 선언형식은 다음과 같습니다.타입 변수명;타입(type)은 변수에 저장될 값의 종류(예: 정수, 실수 등)를 지정하며, 변수명은 메모리 공간을 구분짓는 이름입니다. 이러한 이름은 식별자(identifier)라고 하며, 클래스, 메서드, 변수 등에 붙는 이름입니다.🔐 ..
[Java] 주석의 종류 (구현 주석, 문서화 주석)
·
Back end/Java
💡 주석이란?주석은 코드에 대한 설명을 작성하기 위한 용도로, 프로그램의 실행에는 영향을 주지 않습니다.가독성을 높이고, 협업 시 의도를 명확하게 전달하거나 문서를 생성하는 데 사용됩니다.📝 주석의 종류1. 구현 주석 (Implementation Comment)코드의 흐름을 이해하기 쉽도록 설명을 덧붙이는 주석으로, 두 가지 방식이 있습니다. 📌 행 단위 주석 (//)한 줄에 대한 주석을 작성할 때 사용합니다.int score = 90; // 학생의 점수를 저장하는 변수💡 단축키 팁대부분의 IDE(예: IntelliJ, Eclipse, VS Code)에서는 Ctrl + / 단축키를 사용하여 해당 줄을 주석 처리하거나 해제할 수 있습니다.Mac 사용자의 경우 Command + / 를 사용하세요. ?..