JAVA 47

동시성 문제와 해결 방안

자바에서의 동시성 문제란?자바에서 동시성 문제는 여러 스레드가 동시에 공유 자원에 접근 할 때 발생할 수 있는 문제.Race Condition : 둘 이상의 접근 흐름이 동시에 자원에 같은 자원에 접근해서, 실행 순서에 따라 결과가 달라지는 문제Deadlock: 여러 스레드가 서로 자원을 기다리며 영원히 대기 상태에 빠지는 문제  동기화(Synchronization)란? 여러 프로세스나 스레드가 공유자원에 동시에 접근하는 것을 제어하여, 데이터의 일관성과 무결성을 보장하는 기법 동시성을 제어하기 위해 뮤텍스, 세마포어 ,  BlockingQueue 가 있다.세마포어의 목적과 동시성 제어의 방법 차이점을 알아보자.뮤텍스나 세마포어는 동시성 제어를 위한 자료 구조이다. 동시성 제어를 위한 자료구조 뮤텍스(M..

JAVA 2025.04.09

Java 예외 처리, 제대로 알고 쓰자

예외 처리는 프로그램을 작성할 때 필수적인 부분이지만, 어떻게 예외를 처리할지에 대한  기준을 명확히 해야 합니다.잘못된 예외 처리 방식은 오히려 코드의  가독성을 떨어뜨리고 성능을 저하시킬 수 있다.이 글에서는 예외를 잘못 사용했을 때 발생할 수 있는 문제점과 올바른 예외 처리 방법을 정리해보겠습니다.예외는 예외적인 상황에서만 사용하자예외를 활용한 분기 처리는 절대로 사용하지 말아야 합니다. 예외는 예측 불가능한 문제를 처리하는데 사용해야 하며, 일상적인 제어 흐름에는 사용되지 않아야 합니다.  예외를 활용한 조건문 대체 (잘못된 반복문 종료 방식) try { int[] arr = {1, 2, 3}; int i = 0; while (true) { System.out.prin..

JAVA 2025.03.26

바이트코드 조작

"스카우터(Scouter)는 어떻게 애플리케이션의 XLog를 실시간으로 측정할까?" 이 단순한 궁금증에서 시작해, 나는 자바의 *바이트코드 조작(Bytecode Manipulation)*이라는 흥미로운 개념을 알게 되었다.이 글에서는 바이트코드 조작이란 무엇인지, 그리고 그것이 어떻게 코드 커버리지 측정이나 APM 도구에 활용되는지 살펴보려 한다. 바이트 코드 사용 예시자바 커버리지 측정도 바이트코드 조작과 면밀한 연관이 있다. 코드 커버리지코드 커버리지는 어떻게 측정할까?테스트 케이스 실행 시 커버리지로 실행을 할 수 있다. 커버리지 실행 후 보고서를 확인할 수 있다.  바이트 코드 조작 라이브러리 비교ASM 바이트 코드 조작시 가장 고전적이고 널리 쓰이는 라이브러리  (비지터 패턴과 어뎁터 패턴을 알..

JAVA 2025.03.24

클래스 로더란?

jvm 내부에서 자바 바이트코드를 전달받아 동작하는 클래스 로더에 대해 알아보자! 클래스 로더의 개념자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트코드를 실행할 때) 에 클래스를 링크하고 로드하는 특징을 가진다. 자바의 클래스 로딩은 클래스 참조 시점에 JVM 에 코드가 링크되고, 실제 런타임 시점에 로딩되는 동적 로딩을 거친다.자바는 클래스 로딩은 클래스 참조 시점에 JVM 에 코드가 링크되고, 실제 런타임 시점에 로딩되는 동적 로딩을 거진다. 런타임에 동적으로 클래스를 로딩한다는 것은 JVM 이 미리 모든 클래스에 대한 정보를 메소드 영역에 로딩하지 않았다는 것을 의미합니다. JVM 내에서 자바 바이트코드를 전달받는 클래스 로더가 자바가 동적으로 로드될 수 있도록 해주는 소프트웨어입니다. ..

JAVA 2025.03.24

JVM, JDK, JRE 의 차이, JVM의 동작방식

자바 JVM, JDK, JRE 의 차이가 무엇인지 확인해보자 JVM (Java Virtual Machine)자바 가상 머신으로 자바 바이트 코드(.class 파일) 를 OS 에 특화된 코드로 변환(인터프리터와  JIT 컴파일러)하여 실행한다.바이트 코드를 실행하는 표준 (JVM 자체는 표준) 이자 구현체 (특정 밴더가 구현한 JVM) 다.JVM 밴더: 오라클, 아마존, Azul,...특정 플랫폼에 종속적.(os 에 맞는 native 코드로 맞춰서 호출) JRE (Java Runtime Environment) : JVM + 라이브러리자바 애플리케이션을 실행 할 수 있는 배포판.jre 배포판의 목적은 자바 애플리케이션을 실행하는 것이다. 실행을 하기 위해 바이트 코드를 변환하는 jvm 과 java 의 핵심 ..

JAVA 2025.03.23

네트워크 - 프로그램1

네트워크 프로그램 1 - 예제이제 본격적으로 자바 네트워크 프로그램을 작성해 보자.여기서는 TCP/IP로 개발할 예정이다. (UDP는 직접 사용할 일이 많지 않으므로 다루지 않겠다. 이번에 만들 프로그램은 아주 간단한 네트워크 클라이언트, 서버 프로그램이다.클라이언트가 "Hello"라는 문자를 서버에 전달하면 서버는 클라이언트의 요청에 " World!"라는 단어를 더해서 "Hello World!"라는 단어를 클라이언트에 응답한다클라이언트 서버: "Hello"클라이언트 서버: "Hello World!"package network.tcp.v1;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;imp..

JAVA 2025.01.29

자바 - IO 기본 (buffer)

데이터 통신을 다루다 보면 버퍼라는 개념이 나온다. 버퍼는 왜 쓰이는 것일까?버퍼에 목적에 대해 알아보자! 파일 입출력과 성능 최적화 1 - 하나씩 쓰기파일을 효과적으로 더 빨리 쓰러 읽고 쓰는 방법에 대해서 알아보자.먼저 예제에서 공통으로 사용할 상수들을 정의하자.package io.buffered;public class BufferedConst { public static final String FILE_NAME = "temp/buffered.dat"; public static final int FILE_SIZE = 10 * 1024 * 1024; // 10MB public static final int BUFFER_SIZE = 8192; // 8KB}FILE_NAME  : temp/..

JAVA 2025.01.28

자바 - IO 기본 (InputStream, OutputStream)

자바에서 데이터를 파일이나 네트워크 등을 통해 주고 받을 때 어떤식으로 통신하는지 알아보자  데이터의 통신 과정은 스트림으로 통신한다  자바가 가진 데이터를 hello.dat 라는  파일에 저장하려면 어떻게 해야할까?자바 프로세스가 가지고 있는 데이터를 밖으로 보내려면 출력 스트림을 사용하면 되고, 반대로 외부 데이터를 자바 프로세스 안으로 가져오려면 입력 스트림을 사용하면 된다. 참고로 스프트림을 단방향으로 흐른다. 스트림 시작 스트림 시작 - 예제1package io.start;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class StreamStartMain1_1 { ..

JAVA 2025.01.28

지연 연산 vs 즉시 연산: Kotlin과 Java Stream을 통한 최적화 전략 이해하기

지연 연산 (Lazy Evaluation) vs 즉시 연산 (Eager Evaluation) 스트림을 배우다 보면 지연연산이라는 특징을 접하게 된다. 지연연산을 종단연산을 실행하기 전까지 연산을 미루기 때문에 해당 연산을 즉시 실행되지 않는다. 그렇다면 지연 연산이란 무엇일까? Lazy  vs Eager 지연 연산이란 간단히 말해 결괏값이 필요할 때까지 계산을 늦추는 기법이다. 즉, 눈앞에 코드가 주어졌을 때 곧바로 해당 코드를 실행하는 것이 아니라 실행결과가  필요해지는 시점에 실행을 하도록 하는 것이다. 다만, 이러한 방식으로 코드가 동작하기 위해 내부적으로 준비해 주는 작업이 필요하므로  무조건 효율적인 방식이라고 보기 어렵다. 이에 반해 어떠한 작업이 즉시 수행되다면 말 그대로 실행할 코드가 보이..

JAVA 2025.01.17

Runnable과 Callable

Runnable과 Callable의 차이점은 무엇이고 왜 쓰일까?둘 다 스레드를 만들 때 사용된다. 즉 스레드를 만들어 실행시킨다는 의미는 비동기적으로 실행시킨다는 의미이다. 비동기적으로 실행해야 하는 작업에 대해서 반환값을 받아야 할 때는 Callable 를 쓰고 그 결과를 무시해도 될 때는 Runnable를 사용한다. Thread는 비동기적으로 실행해야 하는 작업이 있을 때 쓰인다.기존 Runnable 은 반환값이 없고 체크 예외를 던질 수 없다는 불편함이 있었다.public interface Runnable { void run();}Runnable  의 run()  은 반환 타입이 void이다. 따라서 값을 반환할 수 없다.예외가 선업되어 있지 않다.  따라서 해당 인터페이스를 구현하는 모든 메서..

JAVA 2025.01.12