- 시작하게 된 계기 및 다짐 😮
이번 코드스테이츠의 백엔드 엔지니어링 개발자 부트캠프
에 참여하게 되면서 현직개발자 분들의 빠른 성장을 위한 조언 중 자신만의 블로그를 이용하여 배운 것 들을 정리하는게 많은 도움이 된다 하여 시작하게 되었다.
- 학습 목표 😮
목표 | 결과 |
---|---|
파일 클래스 이해 / 사용 | O |
바이트/문자 기반의 스트림 이해 및 활용 | O |
Thread란 무엇인가? | O |
Multi-Thread 이해 및 사용 예제 이해 | O |
JVM이란 무엇인가? | O |
JVM_메모리 구조 | O |
- 정리
# FileInputStream
- 파일을 열어 해당 파일의 내용을 읽을 때 사용하는 방법
- 바이트 기반 스트림
ex)
FileInputStream 변수명 = new FileInputStream("파일명");
-> 변수명.read()를 통해 한글자씩 파일을 읽음
-> 변수명.close() 해당 파일을 닫음
# BufferedInputStream
- 파일을 읽는 보조 스트림으로써, 여러 바이트를 한번에 저장하여 데이터를 출력하는 임시공간
- 해당 버퍼 스트림에 파일에서 읽은 데이터를 저장하였다가 출력하는 형식
- 바이트 기반 스트림
ex) BuffredInputStream 변수명 = new BufferedInputStream(FileInputStream의 변수명)
# FileOutputStream
- 데이터를 생성하여 파일을 생성 및 저장
- fileOutput.write(b) :
- 바이트 기반 스트림
ex) FileOutputStream 변수명 = new FileOutputStream("저장할 변수명");
byte[] b = word.getBytes();
fileOutput.write(b);
fileOutput.close();
# FileReader
- 파일을 읽기 위한 문자 기반 스트림
- char 타입의 2byte 문자 기반 스트림
- FileInputStream에 대응
# BufferedReader
- .read() 와 .readLine()
- .readLine()의 반환값은 문자열로
ex) (str = 변수명.readLine()) != null
# FileWriter
- 파일에 쓰기 위한 문자 기반 스트림 함수
- char 타입의 2byte 문자 기반 스트림
- FileOutputStream 대응
# BufferedReader
- .flush()로 버퍼를 비워주고 출력
- .close()로 닫아줘야함
===
File 클래스
- 파일과 디렉토리에 접근하기 위한 클래스
- .getPath() : 파일의 위치
- .getParenet() : 파일의 디렉토리 위치
- .getCanonicaPath() : 파일의 절대경로
- .canWrite() : 이 파일에 쓸수 있는지 여부
- .startWith()
- .endWith() :
- .listFiles() : 파일들을 리스트에 담아줌 File[] list 에
ex) File file = new File("파일경로", "파일명"); -> 직접적으로 파일을 생성하지는 않고 파일의 정보저장
file.createNewFile(); -> 파일을 실제로 생성하는 코드
스레드
- 하나의 코드의 실행 흐름 (한 프로세스 내에 2개의 스레드가 존재시 2개의 실행 흐름이 생김)
- start() : Runnable의 run() 실행
멀티 스레드
- 하나의 프로세스에 두개 이상의 다중 스레드가 사용되는 형태로, 처리시간을 줄이고 병렬처리를 위함
- 임계영역 : 단 하나의 스레드만 실행할 수 있는 코드 영역
메인 스레드
- 가장 먼제 실행되는 스레드로, 이 스레드 내의 코드들을 다른 작업 스레드가 병렬 처리하는 방식
- 각 스레드가 모두 종료 되어야지 프로세스가 종료가 됨
- java.lang.Thread에서 직접 객체화하여 생성하여도 되지만, Thread를 상속해여 하위 클래스를 만들어 생성도 가능
스레드 동기화
- 한 스레드가 객체를 작업중 일때 다른 스레드가 사용할 수 없도록 락을 걸어놓음
- 동기화 메서드와 동기화 블록을 제공
- 메서드/블록에 들어갈 시 잠금을 걸어 다른 스레드가 임계영역에 못들어오게 하는 방법
- synchronized 키워드 : 인스턴스와 정적 메서드 어디든 붙일 수 있음
- Thread.State state = getState()를 통해서 스레드 상태 확인 가능
스레드 풀
- 스레드들의 실행의 개수제한을 위한 처리작업
- 큐를 통해 풀에 자리가 있을시 Thread를 가져와 실행시키고 나머지는 큐에서 대기 형식
- ExecutorService 클래스를 통한 쓰레드 풀
- Executors 클래스를 통한 객체 생성 -- > ThreadPoolExecutor
==>(1) newCachedThreadPool() : 초기 스레드= 0, 코어 스레드=0, 최대 스레드 수=Integer.MAX_VALUE;
(2) new FixedThreadPool(int) : 초기 스레드=0, 코어 스레드=num, 최대 스레드 수 =num;
- 스레드 풀 종료
==>(1) shutdown() : 큐의 모든 작업 처리 후 종료 :: Void
(2) shutdownNow() : 큐의 처리 못한 목록 리턴 :: List
(3) awaitTermination(long timeout, TimeUnit unit) : shutdown()호출 후 모든 작업 시간안에 처리 유무 :: Bollean
- executorService.execute(runnable) 을 통한 작업 처리 요청 -> Runnable의 run() 메서드 실행
===
스레드 실행과정
(1) start() : 스레드가 실행 대기 상태 ( 스케줄링이 되지 않아 실행 기다리는 상태)
==> 실행 대기에서 스케줄링되어 선택되믄
(2) run() : 메서드를 통해 실행상태로 변경 (run() 코드를 모두 하지 않아도 대기 상태로 돌아갈 수 있음)
==> 실행 대기 상태
==> 실행 중지 상태 (getState() 를 통한 상태 확인 가능)
==> 이후 종료 상태
스레드 상태 제어
- interrupt : 일시정지 -> 실행대기/종료상태
- notify(), notifyAll() : 일시정지 -> 실행대기 (wait() 에 의한 일시정지 해제)
- sleep(long millis) / sleep(long millis, int nanos) : 실행 -> 일시정지상태
- join() / join(long millis) / join(long millis, int nanos) : 실행 -> 일시정지 상태 // join()메서드 종료 or 시간지남
- wait() / wait(long milis) / wait(long millis, int nanos) : 실행 -> 일시정지 상태 // notify()에 의한 대기 상태
- yield : 실행 -> 대기상태
★ wait/notify 만 Object , 나머지는 Thread 클래스
★ wait/notify()를 통한 두 스레드간 순차반복실행, 동기화메서드/블록 내에서만 사용 가능
# 사진참조
===
Thread_Class
- Runnable 을 implement로 상속 받은 클래스이다.
- Thread를 extends 하면 따로 Runnable의 run()를 무조건 제정의 할 필요는 없다.
- Thread 생성자 매개변수로 Runnable을 매개변수로 갖는 생성자 호출
- 변수명.start(); -> 로 인하여 Runnable의 run() 실행 -> 작업 스레드가 대기상태가 됨
- .setName() :
- .getName() : 을 통해서 Thread 이름 생성 및 참조 가능
1. Thread 클래스로부터 직접 생성
(1) Runnable tast = new Tast(); => Task클래스는 Runnable 상속을 받은 클래스(run() 오버라이딩함)
Thread thread = new Thread(tast)
(2) Thread thread = new Thread(new Runnable(){
public void run(){
오버라이딩
}
});
(3) Thread thead = new Thread( () -> { 스레드 실행코드;}); -> 람다식 ( Thread의 생성자로 Runnable 이있기에)
2. 하위 클래스로 부터 생성
(1) Thread thread = new Thread_extends(); -> Thread_extends 클래스는 Thread를 상속받고, run() 정의
(2) Thread thread = new Thread(){
오버라이딩 -> 익명 클래스 이용
};
JVM
.java -> compiler -> .class(어셈블리어) -> 클래스 로더 -> JVM에 던져줌 // 런타임 시작
클래스 로더에서 클래스를 정리시키기 위해 JVM의 Runtime Data Area 에 로드함
Runtime Data Area
★★ constant pool은 Method or heap영역에 버전에 따라 다른곳에 존재한다.
1. Method Area : 인스턴스를 만들기 위한 데이터들 저장
- 클래스 구조,생성자,필드(전역변수),스태틱,상수,메서드,접근제어자
2. Stack : 메서드에 사용되는 데이터 값들
- 매개변수,지역변수,return 값
3. Heap : Java에서 만들어진 모든 객체
- 인스턴스,배열,String(new String("wr") == char[]과 같음) ( 공간을 잡아 사용하는 것들)
4. pc register/Native Method Area : 자바 프로그램 실행 시 필요한 도구들
- JVM 명령어, 다른 언어 기능 호출
# Garbage Collector : 사용되지 않는/버려진 객체의 공간을 비워주는 역할
- 피드백 😮
Java의 코드들의 실행흐름(Thread 이용)과 이를 이용하여 File을 조작하는 File클래스를 학습하였다.
File클래스의 경우 우리가 작성한 코드를 기반으로 원하는 데이터/내용을 실제 파일로 저장하거나 불러오고 이를 사용하는 클래스이다.
Thread의 경우 하나의 코드의 실행흐름인데 멀티 쓰레드를 이용하여 한번에 여러 실행흐름을 사용할 수 있다. 프로그램이 하나의 사람이면 쓰레드를 손발로 비유 할 수있다. 이 쓰레드를 사용하면 멀티 프로세스를 사용하는 것 보다 비용이 훨씬 적어진다. 대신에, 쓰레드를 사용함으로써 발생되는 데이터의 동기화 문제를 잘 해결 해 주어야 한다.
JVM의 경우, 우리가 작성한 .java 파일을 컴퓨터가 이해할 수 있는 기계어로 바꿔주고 메모리관리/Garbage Collection등 효율적인 메모리 관리에도 사용된다.
- 앞으로 해야 될 것 😮