Java
-
[Java] 커스텀 어노테이션으로 컴파일 시점에 검증하기 (Annotation Processor)Java 2025. 6. 20. 23:43
개발자에게 컴파일 에러는 정말 고마운 에러이다. 컴파일 에러가 있다면 빌드 자체가 되지 않기 때문에 실행할 수도, jar 파일을 만들 수도 없기 때문이다. 자바의 어노테이션 기능을 잘 사용하면 컴파일 시점에 코드를 검증할 수 있다. 대표적으로 자바에서 기본으로 제공하는 @Override 어노테이션이 있다. 추상 메서드를 구현할 때 @Override 어노테이션을 사용하면 이 메서드가 상위 타입의 메서드를 재정의한 것임을 명시적으로 나타낼 수 있을 뿐만 아니라 오버라이딩을 잘못했을 경우 컴파일 시점에 오류를 발생시켜 실수를 사전에 방지할 수 있는 효과가 있다. 나는 '@Override와 같은 어노테이션처럼 컴파일 시점에 코드를 검증해주는 어노테이션을 개발자가 직접 만들어서 사용할 수는 없을까?'라는 생각이 ..
-
[Java] 문자열 결합과 컴파일러 최적화Java 2025. 5. 7. 22:37
자바를 사용하다보면 문자열을 정말 많이 다루는데 이때 결합 연산자 '+'도 자주 다루게 된다. 처음 자바를 배웠을 때는 결합 연산자로 문자열을 다루면 성능이 안 좋을 수 있다고 들었다. 그런데 조금 더 공부해보니 결합 연산자를 사용해도 컴파일러가 컴파일 시점에 최적화를 해준다고 알게 되었다. 딱 여기까지만 알고 있었는데, 오늘은 어떻게 최적화가 이루어지는지 궁금해서 직접 알아보기로 했다. javap -c 명령어이 명령어는 Java 클래스 파일(.class)의 바이트코드를 디컴파일해서 보여주는 명령어이다. 즉, java 파일이 class 파일로 컴파일된 이후 실제 JVM이 실행하는 저수준 명령어(바이트코드)를 확인할 수 있는 도구이다. 예제 코드를 만들어 컴파일하고 이 명령어를 통해 코드가 어떻게 동작하는..
-
[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와 호환되지 않는다는 단점으로 인해 현재는 잘 사용되지 않음자주 사용하는 기본 다국..