본문 바로가기

JAVA34

[자바] 리플렉션 리플렉션이란 자바에서 클래스가 제공하는 다양한 정보를 동적으로 분석하고 사용하는 기능을 의미한다. 해당 기능을 통해 런타임 시점에 클래스에 메타데이터 정보를 얻거나, 동적으로 새로운 객체를 생성, 메서드 호출, 필드 값을 을 읽고 쓸 수 있다.클래스 메타데이터 조회 3가지클래스 타입으로 조회Class targetClass = Target.class;인스턴스에서 조회Target target = new Target();Class targetClass = target.getClass();문자(패키지+클래스명)를 통한 조회String targetPackage = "reflection.ReflectionTest";Class targetClass = Class.forName(targetPackage);3번의 경우를.. 2024. 12. 25.
[자바] 소켓 프로그래밍 소켓은 네트워크 상에서 프로세스 간의 통신을 위한 양쪽 끝단을 의미한다.이러한 소켓을 통해 송신자와 수신자를 연결하고 네트워크 상에서 장치를 식별하기 위한 IP, 해당 장치에서 응용프로그램을 식별하기 위한 포트를 사용하여 클라이언트와 서버 간의 데이터 전송을 가능하게 하는 역할을 한다.TCP 소켓 (stream 소켓)신뢰성 있는 데이터 전송을 제공하는 연결 지향 프로토콜로 데이터의 순서와 무결성을 보장한다.UDP 소켓 (datagram 소켓)비연결형 프로토콜로, 빠른 데이터 전송이 가능하지만, 데이터의 순서나 무결성을 보장하지 않는다. (Best- Effort)소켓 통신 흐름클라이언트 동작 과정socket 생성 → socket()서버에게 요청을 보내고 connection을 맺음. → connect()서버.. 2024. 12. 25.
[자바] I/O 스트림 입출력 스트림은 데이터를 읽고 쓰는 것을 추상화 한 것으로 자바 프로그램이 외부로부터 데이터를 읽거나 내보내기 위한 통로 역할을 한다.입력 스트림 : 외부에서 데이터를 읽는데 사용출력 스트림 : 자바 내부의 데이터를 외부로 내보내는데 사용스트림 주요 메서드InputStreamint read() : 하나의 바이트를 읽고, 읽은 바이트의 정수 값을 반환. 더 이상 읽을 바이트가 없으면 -1int read(byte[] b) : 바이트 배열에 데이터를 읽어 저장. 읽은 바이트 수를 반환하며, 더 이상 읽을 바이트가 없으면 -1int read(byte[] b, int off, int len):바이트 배열의 특정 오프셋에서 시작하여 최대 len 바이트를 읽음.읽은 바이트 수를 반환, 더 이상 읽을 바이트가 없으면 .. 2024. 12. 25.
[자바] 스레드 풀, Executor 스레드를 직접 생성해서 사용하면 다음과 같은 문제가 있다.스레드 생성 시간으로 인한 성능 저하스레드를 생성하는 작업은 커널 수준에서 시스템 콜에 의해 처리 → CPU 메모리와 리소스 사용스레드는 독립적인 스택 영역을 가짐 → 메모리 소모스레드의 관리가 어려움CPU, 메모리 자원이 한정적이므로 스레드는 무한하게 생성될 수 없음 + 인터럽트를 이용해 스레드를 급하게 종료해야 하거나 남은 스레드 작업을 확인해야하는 상황 → 스레드 관리가 필요함Runnable 인터페이스의 불편함Runnable 인터페이스는 반환 값 X, 체크 예외를 던질 수 없어 메서드 내부에서 예외 처리가 필요위의 1, 2번 문제를 해결하기 위해 스레드를 생성하고 관리하는 풀이 필요한데 이를 스레드 풀이라고 한다.스레드 풀스레드 풀이란 말 그.. 2024. 12. 25.
[자바] 동시성 컬렉션 자바의 컬렉션들은 대부분 Thread Safe(여러 스레드가 동시에 접근해도 안전한가) 하지 않다. 컬렉션 내부의 메서드들은 대부분 원자적 연산이 아니기 때문이다. 일반적으로 사용하는 컬렉션을 멀티스레드 상황에서 사용하면 어떻게 되는지 보자.public class ProxyTest { public static void main(String[] args) throws InterruptedException { List list = new ArrayList(); test(list); System.out.println("list = " + list + " size = " + list.size()); } public static void test(Collect.. 2024. 12. 25.
[자바] 원자적 연산, 동기화 자바는 멀티스레드 상황에서 안전하게 연산을 할 수 있도록 AtomicXxx 클래스들을 지원한다.먼저 Atomic이 아닌 int 값을 여러 스레드에서 ++하는 코드를 보도록 하자.public class Test { public static void main(String[] args) throws InterruptedException { IntTest intTest = new IntTest(0); System.out.println("연산 전 = " + intTest.getValue()); test(intTest); System.out.println("연산 후 = " + intTest.getValue()); } private static voi.. 2024. 12. 25.
[자바] Producer-Consumer Problem, BlockingQueue 생산자-소비자 문제란?여러 스레드가 동시에 데이터를 생산 및 소비할 때 생기는 동시성 문제생산자 : 데이터를 생산하는 역할 → 네트워크에서 데이터를 받아오거나, 파일을 읽는 스레드소비자 : 데이터를 소비하는 역할 → 얻어온 데이터를 처리, 저장하는 스레드버퍼 : 생산된 데이터가 일시적으로 저장되는 한정된 크기의 공간으로 데이터가 저장되면 소비자가 해당 버퍼에서 가져옴 (공유 자원)이해를 위해 다음 코드를 살펴보자.public class Buffet1 implements Buffet { private final Queue queue = new ArrayDeque(); private final int max; public Buffet1(int max) { this.max = ma.. 2024. 12. 25.
[자바] 동기화 락 공유 자원 → 여러 스레드가 접근할 수 있는 자원대표적으로 인스턴스의 필드(멤버 변수)에 여러 스레드가 접근할 수 있는데 이를 공유 자원이라 하고 이 때 공유 자원에 대한 접근을 적절하게 동기화해서 동시성 문제가 발생하지 않게 방지해야 한다.동시성 문제란어떠한 요청이 동시에 수행될 때 발생할 수 있는 문제로 동기화를 하지 않고 공유 자원에 접근하면 데이터의 일관성과 정합성을 해칠 수 있다. 코드로 동시성 문제에 대해 알아보도록 하자.public class ConcurrencyIssueMain { public static void main(String[] args) throws InterruptedException { Bank bank = new Bank(); DepositT.. 2024. 12. 25.
[자바] 메모리 가시성 메모리 가시성이란?멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에 언제 반영되는지 알 수 없는 문제 다음과 같은 상황을 확인해보자.public class ThreadMain { public static void main(String[] args) throws InterruptedException { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable, "thread-1"); thread.start(); Thread.sleep(100); myRunnable.flag = false; thread.join(); Sys.. 2024. 12. 25.