오늘의 요약
1. 내부 클래스 ( Inner Class <-> Outer Class )
클래스 안의 클래스
(1) 객체 생성 방법 (외클 = 외부클래스, 내클 = 내부클래스
1) 외클.내클 변수 = new 외클().new 내클();
2) 외클.내클 변수 = new 외클.내클();
(2) main 위치
1) 제3클래스나 외부클래스에 있을 때는 동일하게 사용 가능
2) static 내부클래스에서만 main을 정의할 수 있으나 호출은 어려움, 하지만 일반 메소드는 사용 가능
( 이유 : static 내부클래스에서만 static 자원(멤버/메소드)을 정의할 수 있기 때문 )
3) static 내부클래스에서는 외부클래스의 static 자원만 접근 가능 (B.java 예제 참조)
(3) 쓰는 이유 (*****)
외부 클래스의 자원(심지어 private 자원도 포함)을 '자기 것'처럼 사용하기 위해서
2. 쓰레드 ( Thread )
프로세스를 구성하는 '제어의 흐름'
(1) Process 와 Thread
1) Process: 프로그램의 '실행 단위'
2) Thread: Process 를 구성하는 '작업 단위'
(2) 장점
쓰레드 '경량 프로세스'라고 불림
이유는 프로세스의 공통 Resource 를 공유하기 때문임
(3) 생성법
1) java.lang.Thread 상속법
2) java.lang.Runnable 상속법
(4) 시작
쓰레드객체.start();
(5) 비유: '피고용인 Employee'
(6) LifeCycle
1) 5가지 상태
2) 각 상태는 '메소드'나 '스케줄러'나 '시간'에 의해 이동함
3) 한 번 죽으면 다시는 살아나지 못함
* Scheduler 로 직접 핸들링을 할 순 없으나, 스케쥴러가 뽑아갈 수 있도록 우선순위를 부여할 수는 있다
(7) Priority
1) Ready 상태의 쓰레드 중에서
우선적으로 CPU를 점유할 수 있는 쓰레드를 판별하기 위한 LEVEL 값
2) 범위
1 ~ 10
3) 상수
MAX_PRIORITY : 10
MIN_PRIORITY : 1
NORM_PRIORITY : 5
(8) 동기화
1) 비유: 화장실의 문고리
* static을 많이 사용할 수록 데이터의 무결성이 해쳐질 수 있음 (무결성 : 데이터의 결함이 없는 성질)
2) 하나 이상의 쓰레드가 어떤 연산 or 로직에 동시 접근했을 때,
그 연산에 대한 값의 무결성을 보장하기 위해서 수행 영역에 대한 lock을 걸어주는 것
3) 예
int i = 0;
i++;
# CPU의 연산 단계 #
<1> 현재 i값을 읽음 i==0 i==0
<2> i값을 증가 i==0 i==0
<3> 증가된 i값을 i에 저장 i==1 i==1
4) 방법
1> synchronized void m(){
동기화가 필요한 로직;
}
2> synchronized(this){
동기화가 필요한 로직;
}
3. I/O ( Input/Output )
* 어디서부터 시작해서 어디서부터 끝날지 항상 생각해야 함
(1) 스트림( Stream ): '데이터의 흐름'
Data Source (근원지) ===> Data Destination (목적지)
* 방향이란 것은 바뀌지 않는다. 즉, 한 번 굳어진 객체는 방향을 바꿀 수 없다.
(2) 스트림 특징
* 마셜링( 데이터를 자르는 행위 )
* 언마셜링( 데이터를 조립하는 행위 )
1) FIFO ( First In First Out )
2) 지연성
* 데이터를 입력하고 난 뒤 커서가 깜빡이는 것을 보면 데이터가 지연되고 있음을 알 수 있음
3) 단방향성
4) 유연성
(3) 표준입력/표준출력
키보드( System.in ) -----> 모니터( System.out )
(4) 구분
1) 전송단위
<1> 바이트 스트림 ( 1 byte stream )
ex: XXXStream
<2> 문자 스트림 ( 2 byte stream )
ex: XXXReader, XXXWriter
2) 특성
<1> 근본 스트림 ( node stream )
<2> 다리 스트림 ( bridge stream )
InputStreamReader (인풋스트림을 Reader로 바꾸겠다는 스트림)
OutputStreamWriter (아웃풋스트림을 Writer로 바꾸겠다는 스트림)
<3> 목적 스트림 ( filter stream ) (==응용 스트림)
3) 입출력
<1> 입력 스트림
ex: XXXInputStream, XXXReader
<2> 출력 스트림
ex: XXXOutputStream, XXXWriter