[Java 기능] 동기화 구현 (2) - 한정적인 리소스에 접근하는 경우
·
Java & Kotlin
wait(), notify() 메서드를 활용한 동기화 프로그래밍 리소스가 available하지 않은 경우 쓰레드에 wait() 메서드를 호출하여 Not Runnable 상태가 됨 wait() 상태가 된 쓰레드는 notify() 메서드가 호출될 때까지 대기함 리소스가 available 해지면 notify() 메서드가 호출되고 wait() 상태에 있는 쓰레드 중 무작위로 하나의 thread를 재시작 notifyAll() 메서드가 호출되면 wait() 상태의 모든 쓰레드가 재시작되고 available한 자원만큼의 쓰레드만 수행됨 자원을 갖지못한 쓰레드는 다시 wait() 상태가 됨 notify()를 호출하는 경우 무작위로 호출하기 때문에 계속 실행되지 못하는 쓰레드가 있을 수 있음 자바에서는 notifyAll..
[Java 기능] 동기화 구현 (1) - 리소스 하나를 공유하는 경우
·
Java & Kotlin
critical section과 semaphore critical section은 두개 이상의 쓰레드가 동시에 접근하는 경우 문제가 발생할 수 있기 때문에 방지해야 함 semaphore는 특별한 형태의 시스템 객체이며 get/release 기능이 있음 한번에 오직 하나의 쓰레드만이 semaphore를 얻을 수 있고, 다른 쓰레드는 대기 상태(blocking)가 됨 semaphore를 가진 쓰레드만이 critical section에 진입할 수 있음 (일종의 열쇠 역할) 예제 코드 한 계좌에서 동시에 입금과 출금이 일어날 때(두개의 쓰레드가 하나의 공유 자원을 동시에 사용할 때) 결과 확인해보기 동기화 구현하지 않은 경우 shared resource는 money이지만 자바에서는 객체로 resource 단위를..
[Java 기능] Thread 클래스의 여러 메서드
·
Java & Kotlin
Thread 우선순위 Thread.MIN_PRIORITY (1) ~ Thread.MAX_PRIORITY (10) 우선순위 따로 설정해주지 않았을 때 default 우선순위는 Thread.NORM_PRIORITY (5) 우선 순위가 높은 쓰레드가 CPU의 배분을 먼저 받을 확률이 높음 (무조건은 아님) 예제 코드 PriorityTest.java package ch21; class PriorityThread extends Thread { public void run() { int sum = 0; Thread t = Thread.currentThread(); System.out.println(t + "start"); for(int i = 0; i
[Java 기능] 쓰레드(Thread)
·
Java & Kotlin
쓰레드(Thread) 디스크에 존재하는 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨 실제로 작업이 수행되기 위해서는 CPU를 점유해야하는데, 이때 작업 단위를 쓰레드라고 함 하나의 프로세스는 하나 이상의 쓰레드를 가짐 Multi-threading 하나의 프로그램에서 동시에 여러 작업이 일어날 수 있음 이는 쓰레드가 동시에 실행되는 것이 아니라 쓰레드 간에 switch가 발생하는 것임 OS의 스케줄러가 CPU를 골고루 점유하도록 쓰레드를 배분하는 역할을 함 쓰레드는 각각 자신만의 작업공간(context)를 가짐 (자원이 각각 저장됨) 여러 쓰레드가 CPU를 번갈아 점유하게 되면서 context switch가 발생함 멀티 쓰레드에서 발생할 수 있는 문제 상황 각 쓰레드 사이에는 공유하..
[Java 기능] Decorator Pattern 활용한 커피머신 프로그램
·
Java & Kotlin
Decorator Pattern 자바의 입출력 스트림은 decorater pattern으로 구현됨 상속보다 유연한 구현 방식 지속적인 기능의 추가와 제거가 용이함 데코레이터는 컴포넌트 또는 또 다른 데코레이터를 포함해야 함 여러 데코레이터로 다양한 기능을 추가할 수 있음 Component : 실제로 I/O를 할 수 있는 오브젝트 Decorator : 추가적인 기능을 제공 ConcreteComponent와 Decorator는 Component로부터 상속을 받음 클래스 다이어그램 ConcreteComponent와 Decorator는 Component로부터 상속을 받음 Operation()은 ConcreteComponent에서 최종 수행 예제 코드 Decorator Pattern을 활용하여 커피샵 메뉴 구현하..
[Java 기능] 그외 여러가지 입출력 클래스들
·
Java & Kotlin
File 클래스 파일 개념을 추상화한 클래스 입출력 기능(read, write)은 없고, 파일의 이름, 경로, 읽기 전용 여부 등의 속성을 알 수 있음 FileTest.java File 생성자 매개변수로 파일의 경로 또는 파일의 이름 입력 출력 스트림과 달리 createNewFile() 메서드를 이용해야 파일이 생성됨 package ch18; import java.io.File; import java.io.IOException; public class FileTest { public static void main(String[] args) throws IOException { File file = new File("D:\\suea7\\Documents\\newFile.txt");// 경로 지정 file...
[Java 기능] 직렬화
·
Java & Kotlin
직렬화 (serialization) 객체가 인스턴스화 되면 메서드가 호출되면서 값이 계속 변할 수 있음 인스턴스의 상태를 그대로 파일에 저장하거나 네트워크로 전송하고 이를 다시 복원하는 방식 자바에서는 보조 스트림을 활용하여 직렬화를 제공 (ObjectInputStream, ObjectOutputStream) Serializable 인터페이스 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 명시해야함 직렬화 하려는 클래스가 Serializable 인터페이스를 구현하도록 하여 직렬화 명시 구현 코드가 없는 marker interface transient : 직렬화하지 않으려는 멤버 변수에 사용하는 키워드 (Socket 등 직렬화 할 수 없는 객체) Seria..
[Java 기능] 보조 스트림 클래스
·
Java & Kotlin
보조 스트림 실제로 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림 FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들 셍성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐 기능을 확장하기 위해 상속을 이용하면 hierarchy 복잡해질 수 있음 → Decorator Pattern으로 구현 InputStreamReader와 OutputStreamWriter InputStreamReaderTest.java FileInputStream은 바이트 단위로 파일을 읽는 스트림 이를 InputStreamReader로 감싸주어 바이트로 읽은 자료를 문자로 변환해줌 package ch16; import java.io.FileInputStrea..
[Java 기능] 문자 단위 입출력 스트림
·
Java & Kotlin
Reader 문자 단위 입력 스트림의 최상위 추상 클래스 많은 추상 메서드가 선언되어 있고, 이를 하위 스트림에서 상속받아 구현 주요 하위 클래스 스트림 클래스 설명 FileReader 파일에서 문자 단위로 자료를 읽음 InputStreamReader 바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 BufferedReader 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림 주요 메서드 메서드 설명 int read() 파일로부터 한 문자를 읽음. 읽은 문자 반환 int read(char[] buf) 파일로부터 buf 배열에 문자를 읽음 int read(byte b[], int off, int len) 파일로부터 buf 배열의 off 위치로부터 len 개수만큼의 ..