Java
-
[Java] 생산자-소비자 문제Java 2025. 4. 8. 22:48
1️⃣ 생산자-소비자 문제란?생산자-소비자 문제는 멀티스레드 환경에서 공유 자원을 두고 여러 작업이 협업할 때 발생하는 대표적인 동시성 문제이다.생산자는 데이터를 만들어 큐(버퍼)에 넣고, 소비자는 그 데이터를 꺼내어 처리한다.이 과정에서 발생하는 동시성 문제를 살펴보고, 그것을 해결하는 과정을 알아보자.2️⃣ 동기화 적용 ❌@Slf4jpublic class SharedBuffer { private final int capacity; // 생산자와 소비자가 공유하는 버퍼 private final Queue table = new ArrayDeque(); public SharedBuffer(int capacity) { this.capacity = capacity; } ..
-
[Java] volatile 예약어Java 2025. 2. 18. 22:31
volatile이란?volatile 예약어는 자바의 동시성 환경에서 변수의 가시성 문제를 해결하기 위해 사용되는 예약어이다. volatile의 특징1. 가시성 보장한 스레드가 volatile 변수를 변경하면, 다른 스레드가 즉시 변경된 값을 읽을 수 있다.CPU 캐시를 사용하지 않고, 메인 메모리(RAM)에서 직접 읽고 쓰기 때문이다.2. 원자성 미보장volatile은 읽기/쓰기는 안전하지만, 연산 등과 같은 복합 연산은 원자적으로 동작하지 않는다.예제 코드1. 가시성 문제volatile 없이 실행했을 때 가시성 문제 발생 가능!public class NoVolatileMain { private static boolean flag = false; public static void main(St..
-
[Java] record 예약어Java 2025. 2. 13. 21:51
record 예약어자바 14에서 처음 도입되고, 자바 16에서 정식 기능으로 추가된 예약어로, 불변 데이터 객체(immutable data objects)를 간편하게 선언할 수 있도록 지원하는 기능이다. record의 특징1. 자동으로 필드, 생성자(모든 필드 포함), Getter, equals(), hashCode(), toString() 제공2. record의 필드는 상수 (final)3. 일반적인 POJO 클래스와 비교했을 때 코드가 훨씬 간결함4. Serializable을 구현하여 직렬화 가능5. 상속 불가능 record 사용 예제public record User(String name, int age) {}public class RecordExample { public static void ..
-
[Java] 리플렉션(Reflection)에 대해서Java 2025. 1. 17. 23:04
자바의 리플렉션이란 런타임에 클래스, 생성자, 필드, 메서드 등에 동적으로 접근하여 조작할 수 있게 해주는 기능이다. 긴말 필요 없이 예제 코드로 알아보자. 간단한 계산기 클래스를 만들었다.public class Calculator { private int add(int a, int b) { return a + b; } public static int max(int a, int b) { return Math.max(a, b); }} 이제 JUnit5와 AssertJ를 사용하여 테스트해보자.class ReflectionTest { @Test void testCalculator_1() throws Exception { Class calc..
-
[Java] I/O 정리Java 2024. 11. 9. 12:03
출력 스트림: 자바 프로세스가 가지고 있는 데이터를 밖으로 보낼 때 사용입력 스트림: 외부 데이터를 자바 프로세스 안으로 가져올 때 사용각 스트림은 단방향으로 흐름InputStream / OutputStream자바 1.0부터 제공된 추상 클래스이를 상속 받은 다양한 클래스가 제공됨FileStreampublic class StreamStartMain1 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("temp/hello.dat"); fos.write(65); // int fos.write(66); fos.writ..
-
[Java] Charset과 문자 인코딩Java 2024. 11. 8. 21:41
문자 집합1. ASCII오늘날 사용하는 많은 문자 집합의 기초가 되는 문자 집합UTF-16을 제외한 대부분의 문자 집합에 호환됨한글 지원 X2. ISO_8859_1ASCII + 서유럽 문자 추가한글 지원 X한글 문자 집합3. EUC-KR초창기 등장한 한글 문자 집합ASCII + 자주 사용하는 한글2byte 한글4. MS949마이크로소프트가 EUC-KR을 확장하여 만든 문자 집합복잡한 한글 표현 가능 (쀍, 뷁, 삡 등)윈도우 시스템에서 계속 사용됨유니코드1990년대에 전 세계 모든 문자들을 단일 문자 세트로 표현할 수 있는 유니코드 표준이 등장함UTF-16, UTF-85. UTF-16영문을 2byte로 사용하고, ASCII와 호환되지 않는다는 단점으로 인해 현재는 잘 사용되지 않음자주 사용하는 기본 다국..
-
[Java] 다형성 (Polymorphism)Java 2024. 11. 7. 22:30
1. 다형성이란?객체가 여러 형태를 가질 수 있는 능력자바의 객체지향 개념을 이해하기 위한 중요한 개념이다.다형성을 활용하면 코드의 확장성, 유연성을 향상시켜 유지보수하기 쉬워진다.다형성은 부모와 자식 관계 에서만 사용할 수 있다.인터페이스와 구현 클래스도 부모 - 자식 관계이다.부모 타입의 참조변수는 자식 타입의 객체를 가리킬 수 있다. 2. 부모 타입의 참조변수로 자식 타입의 객체 참조하기부모 - 자식 관계로 맺어진 Phone 클래스와 SmartPhone 클래스가 있다.지금까지는 A 타입 변수에는 A 타입의 값만 대입할 수 있었다.부모 - 자식 관계인 경우에는 부모 타입의 참조변수에 자식 객체를 참조하는 참조 값을 대입할 수 있다.Phone p = new SmartPhone();중요한 것은 참조변수 ..
-
[Java] Dump File에 대해서Java 2024. 10. 31. 23:31
자바의 덤프 파일이란?덤프 파일(Dump File)이란 자바 애플리케이션에서 문제를 진단하고 디버깅하는 데 사용되는 파일이다. 덤프 파일은 JVM의 상태가 담겨있어, 시스템 오류가 발생했을 때 그 문제의 원인을 파악하고 해결하는 데 도움을 준다. 이러한 덤프 파일에는 몇 가지 종류가 있다. 함께 알아보도록 하자. (1) 힙 덤프 (Heap Dump)힙 덤프란 JVM 힙 메모리의 상태를 캡처한 파일로, 모든 객체와 그 참조 관계가 포함되어 있다. 힙 덤프는 주로 메모리 누수 분석, GC 튜닝, 객체 사용 패턴을 파악하는 데 사용된다. 일반적으로 .hprof 확장자를 가지며 jmap, jvisualvm, MAT(Memory Analyzer Tool) 같은 툴을 통해 분석할 수 있다. (2) 쓰레드 덤프 (T..