스레드의 동기화는 무엇이며, 어떻게 사용할까? 스레드의 동기화 --멀티 스레드 프로세스는여러 스레드가 같은 자원을 공유해서 사용하기 때문에다른 스레드의 작업에 영향을 미칠 수가 있다.(A스레드가 작업 도중에 B스레드로 차례가 넘어갔을 경우 B스레드에 영향을 줄 수 있다.) 이를 방지하기 위해서는 "동기화"가 필요하다.(진행 중인 작업이 다른 스레드에게 간섭을 받지 않게 하는 것) 즉, 스레드의 동기화는한 스레드가 진행 중이던 작업을 다른 스레드가 접근하지 못하게 막는 것이다. 동기화하는 방법은?간섭을 받으면 안되는 코드들을 "임계 영역"으로 묶어서 설정한다. 임계 영역이란?락(Lock)이라는 자물쇠를 얻은 단 하나의 스레드만 출입이 가능하도록 하는 영역이다.(객체 하나당 1개의 락을 보유) --..
스레드의 상태 종류는 무엇이 있고, 어떻게 제어할까? 스레드의 상태 종류 -- 동작 흐름스레드 객체 생성 => "NEW"start() 메서드를 통해 스레드 호출 => 바로 실행되는 것이 아니라 "실행대기(RUNNABLE)"상태에서 자기 차례를 기다린다."실행대기"에서 자기 차례 도달=> 자동으로 "실행(RUNNABLE)"상태로 이동하여 실행한다."실행" 상태에서 주어진 실행시간이 완료되거나 yield() 호출=> 다시 "실행대기"로 돌아가 다시 차례를 기다린다."실행" 상태에서 도중에 [suspend(), sleep(), wait(), join(), I/O block 등]이 발생=> "일시정지"상태로 이동하여 잠시 해당 작업을 보류한다. "일시정지" 상태에 보류중인 ..
스레드는 어떻게 동작할까? 프로세스와 스레드 --프로세스는실행 중인 프로그램을 의미하고,이때 프로세스는 "자원(메모리, CPU 등)"과 "스레드"로 구성되어 있다. 스레드는프로세스 내에서 "자원"을 가지고 실제 작업을 수행하는 무언가로모든 프로세스는 무조건 하나 이상의 스레드를 가지고 있다. 비유프로세스 = 공장스레드 = 직원(일꾼)-- 싱글 스레드 & 멀티 스레드 --싱글 스레드하나의 프로세스가 하나의 스레드만 사용하는 방식이다. 특징작업을 하는 스레드가 하나뿐이라서 모든 작업이 순차적으로 처리된다.(A작업을 하고 있었다면 해당 작업을 모두 끝내야 다음 작업을 할 수 있다.)구현이 단순하고 디버깅이 쉽다.다만 모든 작업이 순차적으로 처리되기 때문에 작업 시간이 긴 작업이 있으면 다..
제네릭은 무엇이고 어떻게 사용할까? 제네릭 (Generic) --제네릭은다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에서컴파일 시에 타입을 체크해 주는 기능으로클래스, 인터페이스, 메서드에서 다양한 타입을 처리할 수 있도록 만들어준다. 간단하게 설명하면원래 클래스에서 사용할 타입은 코드 작성할 때 명시해줘야 하지만제네릭을 사용하면 사용할 때 외부에서 원하는 타입으로 지정하여 유동적으로 사용할 수 있다. 그래서 제네릭을 사용하면컴파일 시의 타입을 검증할 수 있어서 코드의 안정성과 재사용성을 높일 수 있다. 제네릭의 주요 목적타입 안정성 : 잘못된 타입을 사용하는 오류를 컴파일 단계에서 발견코드 재사용성 : 하나의 코드로 다양한 타입을 처리 가능가독성 향상 : 명시적 캐스팅을 줄..
Arrays 클래스에서는 어떤 메서드를 제공할까? Arrays 클래스 --Arrays 클래스는배열을 다루기 편리한 메서드들을 제공하고 모두 static으로 되어있다. Arrays 클래스뿐만 아니라Objects, Collections와 같이 마지막에 's'가 붙은 클래스들은모두 편리한 static 메서드들을 제공하고 있다.-- 배열 비교 및 출력 - equals(), toString() --equals() : 두 배열의 요소가 동일한지 비교toString() : 배열의 내용을 문자열로 반환 (이때 각 요소를 ", "로 구분하며 처음과 마지막은 "[", "]"로 묶는다.) int[] a = {1, 2, 3};int[] b = {2, 3, 4};int[] c = {1, 2, 3}..
Iterator는 무엇이고 어떻게 사용할까? Enumeration / Iterator / ListIterator --컬렉션에 저장된 데이터에 접근하기 위해 사용되는 인터페이스로컬렉션 요소를 순회하는 데 사용된다. Enumeration컬렉션의 요소를 읽는 기본적인 방법을 제공하는 인터페이스로요소를 읽기만 가능하며, 수정 기능이 없다.일반적으로 Vector, Hashtable 같은 레거시 컬렉션에서 사용된다.현재는 "Iterator"로 대체되어 사용되지 않는다.즉, Enumeration은 Iterator의 구버전이라고 할 수 있다. Enumeration의 메서드 Iterator와 ListIteratorIterator : Enumeration을 대체하며 컬렉션 요소를 순회하고 수정..
java에서 Stack과 Queue를 어떻게 사용할까? 스택 & 큐 --스택과 큐는단순하면서 유용한 자료구조로 대부분의 자료구조는 배열 or LinkedList를 이용해서 만들어졌다. 스택(Stack)은LIFO(Last In First Out) 구조로마지막에 저장된 데이터를 먼저 꺼내는 방식이고 큐(Queue)는FIFO(First In First Out) 구조로먼저 저장된 것을 먼저 꺼내는 방식이다. 스택과 큐 (+ 깊이 우선 탐색, 너비 우선 탐색)스택은 무엇이고큐는 무엇인가? 스택 (Stack) --스택은후입선출 (LIFO, Last In First Out) 자료 구조로마지막으로 들어간 데이터가 맨 처음으로 나가는 구조다. 이때 데이터를 담는 연산(데이nijy.tistory.com..
Vector, ArrayList, LinkedList의 차이는 무엇일까? Vector --List 인터페이스를 구현한 클래스로순서를 유지하고, 중복 요소를 허용하는 컬렉션이다. 특징동기화를 지원하는 list 구현 클래스내부적으로 동적 배열을 사용하여 데이터를 관리배열이 가득 차면 기존 용량의 2배로 증가시킨다. 간단하게 설명하자면Vector는 그냥 객체 저장용 배열이다. 동적 배열이어도 배열이기 때문에크기를 변경하려면 새로운 배열을 생성 후, 데이터를 복사하고 주소를 옮겨서 증가시키는 것처럼 보이게 한다.그래서 처음부터 충분한 배열 크기를 생성하여 사용해야 좋다. 동기화는 멀티스레드 환경에서만 필요한 것으로싱글스레드 환경에서 vector를 사용하게 되면 성능이 떨어지게 된다.그리고 동기화 오버헤..