2022-05-20(Java_Effective)

이상수·2022년 5월 23일
0

TIL Java/Git/etc

목록 보기
17/17
post-thumbnail
  1. 시작하게 된 계기 및 다짐 😮
  • 이번 코드스테이츠의 백엔드 엔지니어링 개발자 부트캠프에 참여하게 되면서 현직개발자 분들의 빠른 성장을 위한 조언 중 자신만의 블로그를 이용하여 배운 것 들을 정리하는게 많은 도움이 된다 하여 시작하게 되었다.

    • 그 날 배웠던 것을 길지 않아도 좋으니 정리하며 복습하는 습관 기르기
    • 주말에 다음주에 배울 내용들을 예습
    • 코딩 문제와 java코드들은 꾸준히 학습
  1. 학습 목표 😮
목표결과
파일 클래스 이해 / 사용O
바이트/문자 기반의 스트림 이해 및 활용O
Thread란 무엇인가?O
Multi-Thread 이해 및 사용 예제 이해O
JVM이란 무엇인가?O
JVM_메모리 구조O
  1. 정리

파일 입출력(I/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();                                 -> 파일을 실제로 생성하는 코드






Thread_(Multi/Pool)


스레드 
 - 하나의 코드의 실행 흐름 (한 프로세스 내에 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_(Memory)


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 : 사용되지 않는/버려진 객체의 공간을 비워주는 역할






  1. 피드백 😮
  • Java의 코드들의 실행흐름(Thread 이용)과 이를 이용하여 File을 조작하는 File클래스를 학습하였다.

  • File클래스의 경우 우리가 작성한 코드를 기반으로 원하는 데이터/내용을 실제 파일로 저장하거나 불러오고 이를 사용하는 클래스이다.

  • Thread의 경우 하나의 코드의 실행흐름인데 멀티 쓰레드를 이용하여 한번에 여러 실행흐름을 사용할 수 있다. 프로그램이 하나의 사람이면 쓰레드를 손발로 비유 할 수있다. 이 쓰레드를 사용하면 멀티 프로세스를 사용하는 것 보다 비용이 훨씬 적어진다. 대신에, 쓰레드를 사용함으로써 발생되는 데이터의 동기화 문제를 잘 해결 해 주어야 한다.

  • JVM의 경우, 우리가 작성한 .java 파일을 컴퓨터가 이해할 수 있는 기계어로 바꿔주고 메모리관리/Garbage Collection등 효율적인 메모리 관리에도 사용된다.

  1. 앞으로 해야 될 것 😮
  • 매일 꾸준히 할 것
    • 꾸준히 velog 작성
    • Java 언어 및 Algorithm 공부(Coding-Test)
    • 틈틈히 운동 하기

  • 내일 해야 할 것
    • Java _Section1 기초를 마치면서 전체적인 회고
    • 회고 블로깅 작성
profile
Will be great Backend-developer

0개의 댓글