반응형

언어(Language) 108

[Java] 자바 스레드 동기화 개념 정리 및 활용 (Thread Synchronization)

스레드 동기화란? (Thread Synchronization) 프로세스는 자원과 데이터, 스레드로 구성되어 있다. 따라서 프로세스는 스레드가 운영체제로부터 자원을 할당받아 소스 코드를 실행하여 데이터를 처리한다. 만약, 싱글 스레드 프로세스라면, 공유 데이터에 단 하나의 스레드만이 접근하므로 문제가 될 것이 없다. 하지만, 멀티 스레드 프로세스의 경우, 두 개 이상의 스레드가 공유 데이터에 동시에 접근하게 되면 예상과 벗어난 결과가 타나날 수 있다. 이러한 문제를 해결해 주는 것이 바로 스레드 동기화다. 스레드 동기화를 안하는 경우 의도적으로 계좌에 동시 접근이 가능하도록 만든 코드이다. 출금할 금액이 계좌 잔액보다 크면, 출금을 못하도록 설정하였으나, 실행 과정에서 의도적으로 스레드가 동시에 접근할 수..

[Java] 자바 스레드(Thread) 이름 조회 및 설정하기

스레드 이름 메인 메서드의 소스 코드를 읽는 메인 스레드는 “main”이라는 이름을 가지고 있다. 추가적으로 생성한 스레드는 기본적으로 “Thread-n”이라는 이름을 가진다. (n은 0부터 스레드의 개수만큼 증가하여 명명) 이러한 스레드의 이름을 조회하거나 생성한 스레드의 이름을 설정할 수 있다. 스레드 이름 조회 스레드의 이름을 조회하는 방법은 다음과 같다. // 스레드의 참조변수 이름.getName() System.out.println(thread.getName()); 스레드의 이름 조회 예제 public class ThreadName { public static void main(String[] args) { // Runnable 익명 구현 객체 Thread thread1 = new Thread(..

[Java] 자바 스레드(Thread)의 생성과 실행 방법 예제

작업 스레드 생성과 실행 멀티 스레드를 구현하기 위해 작업 스레드가 수행할 코드를 작성하고, 작업 스레드를 생성하여 실행시켜야 한다. 자바의 모든 코드는 클래스 안에 작성해야 한다. 따라서 스레드가 수행할 코드 또한 클래스 내부에 작성해야 하며, run() 메서드를 통해 스레드가 처리할 작업을 작성해야 한다. run() run() 메서드는 Runnable 인터페이스와 Thread 클래스에 정의되어 있다. 작업 스레드를 생성하고 실행하려면, Runnable 인터페이스를 구현한 객체에서 run() 메서드를 구현하여 스레드를 생성하고 실행하거나, Thread 클래스를 상속받은 하위 클래스에서 run() 메서드를 구현하여 스레드를 생성하고 실행해야 한다. Runnable 인터페이스를 활용하여 run() 메서드를..

[Java] 자바 스레드(Thread) 개념 정리

Intro 데스크톱에서 Windows의 작업 관리자나 Mac의 활성 상태 보기에 들어가면, 실행 중인 프로그램들이 나열된다. 이렇게 실행 중인 프로그램이나 어플리케이션을 프로세스라 한다. 프로세스 내에서는 실행되는 소스 코드의 실행 흐름들이 존재하는데, 이를 스레드(Thread)라 한다. 하나의 프로세스에는 하나의 스레드를 가질 수 있고, 여러 개의 스레드를 가질 수 있다. 하나의 스레드를 가지는 프로세스를 싱글 스레드 프로세스, 여러 개의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라 한다. 이를 해석하면, 멀티 스레드 프로세스는 프로그램 또는 어플리케이션이 동시 작업을 할 수 있다는 것이다. 즉, 여러 코드를 각 스레드에 분배하여 동시에 실행시키는 것이다. 자바에서도 소스 코드 내에서 따로 스레드..

[Java] 자바 파일 클래스(File Class) 개념 정리 및 활용

File File 클래스는 자바에서 파일 File 클래스를 통해 파일과 디렉토리에 접근할 수 있다. 파일에 접근하기 위해, hello.txt라는 파일을 작성하여 저장한다. // hello.txt hello 다음은 자바에서 hello.txt 파일에 접근하는 예제이다. 만약, hello.txt 파일이 존재하지 않더라도 컴파일 에러가 발생하지는 않는다. import java.io.File; import java.io.IOException; public class FileEx { public static void main(String args[]) throws IOException { File file = new File("../hello.txt"); System.out.println(file.getPath()..

[Java] 자바 파일 입출력 스트림 FileReader와 FileWriter 개념 정리 및 활용

FileReader와 FileWriter FileReader와 FileWriter는 바이트 기반 스트림인 FileInputStream과 FileOutputStream의 단점을 해결하는 문자 기반 스트림이다. 따라서 문자 기반 스트림 FileReader와 FileWriter는 문자 데이터를 다룰 때 사용한다. 문자 기반 스트림과 그 하위 클래스는 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16) 간의 변환을 자동으로 처리한다. 바이트 기반 스트림의 FileInputStream은 문자 기반 스트림의 FileReader 바이트 기반 스트림의 FileOutputStream은 문자 기반 스트림의 FileWriter로 대응된다. 즉, FileReader는 인코딩을 유니코드로 변환, FileWriter는..

[Java] 자바 파일 입출력 스트림 FileInputStream과 FileOutputStream 개념 정리 및 활용

InputStream과 OutputStream 자바에서는 입출력을 다루기 위한 InputStream과 OutputStream이 있다. 스트림은 단방향으로만 데이터를 전송할 수 있기 때문에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다. 입출력 스트림은 어떤 대상을 다루느냐에 따라 종류가 나뉜다. 예를 들어 파일(File)을 다룰 때에는 FileInputStream과 FileOutputStream을 사용하고, 프로세스를 다룰 때에는 PipedInputStream과 PipedOutputStream을 사용한다. FileOutputStream 먼저 FileInputStream을 활용하기 전, 자바 프로그래밍으로 파일을 생성하여 저장한다. import java.io.FileOutputStrea..

[Java] 자바 옵셔널(Optional) 개념 정리 및 활용

Optional 옵셔널(Optional)은 NPE(NullPointerException) 문제를 해결할 수 있는 방법을 제공한다. 즉, null 값으로 인해 에러가 발생하는 현상을 효율적으로 방지하는 것이다. 연산 결과를 Optional에 담아서 반환하는 것으로, 따로 조건문을 작성하지 않아도 NPE가 발생하지 않도록 할 수 있다. 옵셔널 클래스(Optional Class) 옵셔널 클래스는 모든 타입의 객체를 담을 수 있는 래퍼 클래스이다. Optional 객체를 생성하려면 of() 메서드 또는 ofNullable() 메서드를 사용한다. 참조 변수의 값이 null일 가능성이 있다면, ofNullable() 메서드를 사용한다. isPresent() isPresent() 메서드는 Optional 객체의 참조..

[Java] 자바 스트림 생성과 중간 연산, 최종 연산의 개념 정리 및 활용

스트림 자바의 스트림은 데이터를 연속적으로 전달하는 통로로 표현할 수 있다. 스트림(Stream)은 다양한 데이터 소스(배열, 컬렉션)를 표준화하여 다루는 방식으로 통합된 방식으로 데이터 핸들링이 가능하다. 컬렉션 또는 배열에서 스트림을 생성하고, 중간 연산을 거친 뒤 최종 연산에 도달할 수 있다. 스트림 생성 Collection 인터페이스에는 stream() 메서드가 정의되어 있다. 따라서 Collection 인터페이스를 구현한 객체(List, Set 등)들은 stream() 메서드를 통해 스트림을 생성할 수 있다. public class StreamCreate { public static void main(String[] args) { List list = Arrays.asList("a", "b", ..

[Java] 자바 스트림 파이프라인 개념 정리 및 활용

리덕션(Reduction) 대량의 데이터를 가공하여 축소하는 것을 리덕션이라 한다. 데이터의 합계, 평균값, 카운팅 등 연산의 결괏값을 나타내는 것이 리덕션의 결과물이라 할 수 있다. 그러나, 컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 때에는 필터, 매핑, 정렬, 그룹화와 같은 중간 연산이 필요하다. 파이프라인(Pipelines) 리덕션의 결과물을 위해 중간 연산과 최종 연산을 수행하도록 하기 위해 파이프라인을 사용한다. 파이프라인은 여러 개의 스트림이 연결되어 있는 것을 뜻한다. 연결된 스트림에서 최종 연산을 제외하고는 모두 중간 연산 스트림이다. 중간 스트림이 생성될 때 요소들이 바로 중간 연산이 되는 것은 아니다. 최종 연산이 시작되기 전까지는 지연되며, 최종 연산이 시작되는 시점부터 ..

반응형