Java
Java 리플렉션(Reflection API): 동적 코드 조작과 메타프로그래밍을 위한 Refelction API
리플렉션(Reflection)이란? 자바 리플렉션은 프로그램 실행 중(런타임)에 클래스의 정보를 분석하고, 클래스의 필드, 메소드, 생성자 등에 접근하여 조작할 수 있는 능력을 제공합니다. 이는 컴파일 때는 알 수 없는 클래스를 동적으로 조작하고 활용할 수 있는 기능을 제공하며, 메타프로그래밍을 위한 핵심 개념입니다. 리플렉션을 활용하여 클래스의 메타데이터를 분석하고, 필드와 메서드를 동적으로 조작하거나 호출할 수 있습니다. 리플렉션 API로 클래스의 인스턴스를 생성하고, 필드 값을 읽거나 수정하고, 메서드를 호출하는 등의 작업을 수행할 수 있습니다. 이를 통해 프레임워크, 플러그인 시스템, 유연한 코드 구현 등을 가능하게 합니다. 리플렉션 API java.lang.Class: `getName()`: 클..
Java 어노테이션(@annotation)을 활용한 커스텀 메타데이터 만들기
Java 어노테이션이란 (@annotation) `Java 어노테이션`은 컴파일러, 런타임, 또는 다른 도구들에게 추가적인 정보를 제공하는 `메타데이터`입니다. `어노테이션`은 @ 기호를 사용하여 표시하며, 클래스, 메소드, 필드 등 다양한 요소에 적용할 수 있습니다. 실제로 Java 어노테이션은 다양한 분야에서 활용될 수 있습니다. 예를 들어, 우리가 가장 많이 접하는 @Override 어노테이션은 상위 클래스의 메소드를 재정의하고 있음을 나타내는데 사용됩니다. Spring Framework에서는 @Controller, @Service, @Autowired 등의 어노테이션을 사용하여 의존성 주입과 컴포넌트 스캔을 처리합니다. 또한 JUnit은 @Test, @Before, @After 등의 어노테이션을 ..
Java 직렬화와 역직렬화: 객체 저장과 복원을 위한 기술
직렬화란? Java 직렬화는 객체 또는 데이터를 바이트(byte), 이진 형태로 변환하고, 이를 파일 또는 네트워크를 통해 전송하거나 저장하는 기술입니다. 역직렬화는 바이트로 변환된 데이터를 다시 객체로 변환하는 기술입니다. 이를 통해 다음과 같이 다양한 용도로 사용될수 있습니다. 객체, 데이터의 저장 및 전송: 객체를 파일 시스템에 저장하거나, 네트워크에 전송하기 위해 직렬화를 통해 객체를 바이트 스트림으로 변환하여 저장하거나 전송할 수 있습니다. 이를 통해 객체 및 데이터를 `영속화`할 수 있습니다. 캐시: 객체를 직렬화하여 메모리에 `캐싱`하고 필요할때 역직렬화하여 사용할 수 있습니다. 클러스터링 및 분산시스템: 다른 노드 간에 데이터를 공유하기 위해 직렬화를 사용할 수 있습니다. 직렬화를 통해 데..
Java java.io 기반 입출력: 입출력 스트림, 콘솔 입출력, 파일 입출력, 보조 스트림
IO 패키지 IO 패키지는 입출력 작업을 수행하기 위한 클래스와 인터페이스를 제공하는 패키지입니다. 사용자가 키보드로 데이터를 `입력`할 수도 있고, 파일 또는 네트워크로부터 데이터가 입력될 수 있습니다. `출력`도 마찬가지입니다. IO 패키지를 활용하여 데이터를 시스템 콘솔, 파일, 네트워크 등 다양한 소스와 대상으로 전달하고 처리할 수 있습니다. Java에서 데이터는 `Stream`을 통해 입/출력이 되기 때문에 스트림 특징을 이해해야 합니다. 스트림은 데이터를 읽거나 쓰는 작업을 수행합니다. 이때 데이터 교환을 위해서는 입력 스트림과 출력 스트림이 각각 필요한데, 그 이유는스트림은 단방향이기 때문에 하나의 스트림으로 입/출력을 동시에 할 수 없기 때문입니다. 스트림은 `바이트 기반 스트림`과 `문자..
Java 소켓을 사용하여 단체 채팅방 만들기
실행 결과 ChatServer ChatClient 1 ChatClient 2 ChatServer import java.io.*; import java.net.*; import java.util.*; public class ChatServer { private static Set clients = new HashSet(); private static final int PORT = 5000; public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(PORT)) { System.out.println("SERVER START. Listening port " + PORT); while (true) { Sock..
Java try-wtih-resources로 자원 관리하기
입출력 스트림, DB 연결 등과 같은 자원을 사용할 때는 기존에 close() 메서드를 호출하여 자원을 해제해주었어야 합니다. 사용 전: FileInputStream fis = null; try { fis = new FileInputStream("file.txt"); // 파일 읽기 작업 수행 } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } Java 7 부터 도입된 `try-with-resources` 문법을 사용하면 코드를 간결하고 효율적으로 작성할 수 있습니다. 기존에는 코드 안에 c..
Java 소켓 프로그래밍: 네트워크 통신을 위한 Java Socket
Java 소켓(Socket)은 네트워크 통신을 위한 API입니다. 소켓(Socket)은 TCP/IP 기반의 연결 지향형 통신을 제공하며, 소켓 프로그래밍을 통해 클라이언트와 서버 간의 데이터 통신을 구현할 수 있습니다. 소켓(Socket) 관련 용어 `클라이언트와 서버` 클라이언트는 서버에 연결을 요청하고 데이터를 보내고 받는 쪽이며, 서버는 클라이언트의 요청을 수락하고 처리하는 쪽입니다. `TCP/IP` 소켓은 TCP/IP 프로토콜을 기반으로 동작합니다. TCP는 신뢰성 있는 연결 지향형 통신을 제공합니다. IP는 데이터를 패킷으로 분할하여 전송하는 역할을 합니다. Java는 TCP 네트워킹을 위해 `java.net.Socket`과 `java.net.ServerSocket` 클래스를 제공합니다. 소켓 ..
Java 동기화와 비동기 처리
데이터 동기화와 비동기 처리는 멀티 스레드 환경에 대해서 공부하다보면 많이 접할 수 있는 용어입니다. 이 용어들에 대한 개념들을 명확하기 위해 포스팅을 해보려 합니다. 동기화 동기화는 여러 스레드가 공유하는 데이터에 대한 접근을 조절하여 데이터의 일관성과 안정성을 보장하는 것을 의미합니다. 동기화를 사용하면 한 스레드가 공유 자원을 사용할 때 다른 스레드가 동일한 공유 자원에 접근할 수 없도록 통제하는 것을 말합니다. 동기화는 `상호 배제`를 통해 데이터 경쟁 상태를 방지합니다. 상호 배제 방법으로 뮤텍스, 세마포어 방식이 사용됩니다. 경쟁 상태: 멀티스레드 환경에서 두 개 이상의 스레드가 공유 자원에 접근하여 동시에 변경하려고 할 때 발생하는 문제, 데이터 일관성과 안정성이 보장되지 않습니다. 임계 영..