[11.30] 내일배움캠프[Spring] TIL-22

박상훈·2022년 11월 30일
0

내일배움캠프[TIL]

목록 보기
22/72
post-thumbnail

[11.30] 내일배움캠프[Spring] TIL-22

1. Jvm 이해하기( Java Virtual Machine )

  • 개발자가 쓴코드.java -> 자바 컴파일러 -> 바이트 코드.class -> JVM
  • JDK( Java Development ToolKits + JRE( Java Runtime Environment+JVM )
    👉 오라클은 자바 11부터 JDK만 제공한다.
  • JRE
    👉 자바에서 제공되는 기본 라이브러리들이 포함
  • 코드 실행과정 다시보기
    👉 내가 쓰는 InteilJ가 소스를 컴파일 해주는 것이다.
  • JVM의 구조

  • JVM - Class Loader Subsystem

👉 Loading : 클래스 로더가 .class파일을 읽고 데이터를 'Method Area'영역에 저장
👉 메소드 영역에 저장하는 데이터들 : FQCN( Fully Qualified Class Name ): package를 포함한 Class이름 ( java.lang.String )
👉 클래스, 인터페이스, 이늄( 밑에서 정리할 것 )
👉 메소드와 변수

👉 Linking :
1) Verify : 바이트 코드 확인자가 생성된 바이트 코드가 적절한지 여부를 확인하고 실패시 오류
2) Prepare : 모든 static변수에 대해 메모리가 할당되고 기본값으로 할당된다.
3) Resolve : 모든 심볼릭 메모리 참조가 메서드 영역의 원래 참조로 대체된다.
-> 심볼릭 레퍼런스? : 프로그램 실행을 위한 API를 클래스가 직접 가지는 것이 아닌 이름을 통한 참조값을 이용해서 실행할 때 메모리상에서 API를 호출할 수 있도록 이름을주소로 대체하는 방식

👉 Initialization :
1) Static 붙은 친구들 초기화 Static 블럭 실행

  • 코드로 보는 Initialization 예시
...

public class Practice {
    public static String STATIC_MESSAGE = "응애";

    static {
    	//static 코드 블럭
        System.out.println("I'm Loading");
        System.out.println(STATIC_MESSAGE + "2");
    }
}

...
import ...Practice;

public class Main {
    public static void main(String[] args) {
        String staticMessage = Practice.STATIC_MESSAGE;

        System.out.println("Hello");

        System.out.println(staticMessage);
    }
}
  • 출력 순서 Hello가 먼저 나올 것 같지만 static코드 블럭이 먼저 출력됨!
  • 메모리 영역
    👉 Method Area는 클래스 영역 또는 스태틱 영역이라고 한다.
    👉 Stack영역은 Thread영역이라고 한다.
  • 메모리를 사용하는 방식
    👉 가장 간략하게 프로그램이 메모리를 사용하는 방식
  • 데이터 저장 영역 세분화
public class Main {
    public static void main(String[] args) {
        String url = "https://";
        url += "beststar-1.tistory.com";
        System.out.println(url);
    }
}


👉 Static영역 : 클래스와 Static
👉 Stack영역 : 메서드들
👉 Heap영역 : 객체(Instance)들

  • main(String[] args) ?
    👉 자바 프로그램을 실행하기 위한 진입점, 프로그램에 이미 세팅되어있다.
    (조작이 가능하다는 뜻)
    👉 JRE는 PSVM 메서드가 있는지 먼저 찾는다.
    👉 PSVM 존재 == true -> JRE는 JVM부팅
    👉 부팅된 JVM는 바이트파일( 컴파일러가 변경해준 파일 ) 실행
    👉 JVM 전처리 java.lang패키지 로드 : 데이터 저장 영역의 Static영역에 올린다.
    -> System.out.println()같은 메서드를 쓸 수 있게 되는 것

👉 개발자가 작성한 클래스와 Import package를 데이터 저장영역의 Static영역에 올린다.

👉 데이터 저장 영역의 Stack영역에 main() 스택 프레임이 올라간다.

🚨 스텍 프레임??? : 스택 프레임(Stack Frame)이란 함수가 호출될 때, 그 함수만의 스택 영역을 구분하기 위하여 생성되는 공간이다. 이 공간에는 함수와 관계되는 지역 번수, 매개변수가 저장되며, 함수 호출 시 할당되며, 함수가 종료되면서 소멸한다.

  • 실행 엔진과 GC( Garbage Collector )
    🚨 ( 개인생각과 공부가 섞여있어 틀린 개념이 있을 수 있다. )
    👉 위와 같이 메모리에 올라간 byteCode를 실행하는 부분이 실행 부분!
    👉 아직 byteCode는 기계가 읽을 수 있는 상태가 아니므로, 기계가 읽을 수 있는 byteCode의 형태로 변환해야함.
    👉 실행 엔진은 byteCode를 한줄한줄 읽으며 기계의 byteCode로 변환한다.
  • 실행엔진( Execution Enginde )
  • Interpreter
    👉 byteCode를 기계가 이해할 수 있도록 NativeCode로 바꾸는 작업을 한다.
    👉 byteCode 한줄마다 컴파일을 하여 Navtive로 변환하는 작업을 하게 되는데, 중복되는 byteCode들도 매번 컴파일 하게 되면 비효율적이며, Running Time도 길어지게 된다.
    👉 이러한 중복되는 byteCode에 대해서는 JIT 컴파일러를 사용하면 된다.
  • JIT( Just In Time) Compiler
    👉 Interpreter의 효율을 높히기 위해 Interpreter가 반복되는 코드를 발견하면 JIT Compiler로 반복되는 코드를 모두 Native Code로 바꾼다.
    👉 그렇게 되면 반복된 byteCode는 Native Code로 바뀌어 있기 때문에 Interpreter가 바로 사용할 수 있게 된다.
  • GC ( Garbage Collector )
    👉 RuntimeDataArea의 Heap영역의 더 이상 참조되지 않는 객체를 정리한다.
    👉 이전의 C, C++은 free()를 통해 메모리를 명시적으로 해제해주어야 한다.
    👉 그렇지 않으면 매모리 부족현상이 발생하기 때문!
    👉 반면 자바는 OS의 메모리 영역에 직접적으로 접근하지 않고 JVM을 활용하여 간접적으로 접근하게 된다.
    👉 JVM또한 C로 쓰인 또 다른 프로그램인데, 오브젝트가 필요해지지 않는 시점에서 free()를 수행하여 메모리를 확보한다.
    👉 기본개념은 더 이상 사용되지 않는 오브젝트들은 가비지 컬렉션을 담당하는 Thread가 자동으로 메모리에서 제거하도록 하는 것
    👉 Heap영역의 오브젝트 중 Stack에서 도달 불가능한 오브젝트들은 가비지 컬렉션의 대상이된다.
  • Enum class??
    👉 기존의 필드 값 선언시 사용하던 방식
private final static int Bronze = 1;
private final static int Silver = 2;
private final static int GOLD = 3;
  • Enum 적용 방식과 확인
package io.memo;

import java.util.Arrays;

public enum Enum {

    BRONZE(1),SILVER(2),GOLD(3);
    private final int value;



    Enum(int value) {
        this.value = value;
    }

    public  int getValue(){
        return value;
    }

    public static void main(String[] args) {
        System.out.println(Enum.BRONZE.name());
        System.out.println(Enum.BRONZE.value);
    }
}

👉 분야 별로 정해져 있는 값을 지정해 놓고 사용한다면, enum class의 사용을 고려해 볼것
👉 배달의 민족에서는 결제 내역별로의 구분을 위한 필드명이 필요한데, 이 때 enum 을 사용해서 깔끔하게 정리했다.



👉 출처 : https://techblog.woowahan.com/2527/

2. 프로그래머스 java Level-1

3 ~ 50 의 길이의 중복되지 않는 숫자를 가진 배열을 받는다.
그 배열의 요소중 3개의 합으로 소수를 만들 수 있는 경우의 수를 구해라!

import java.util.HashSet;
import java.util.Set;

class Solution {

    //정수 배열로 숫자가 주어질 때 3개의 숫자를 버해서 만들 수 있는 소수의 갯수 구하기
    // 더하는 모든 경우의 숫자를 배열방에 저장해야될 것 같음.
    // 1,2,3,4
    // 3 1 4 4 5 7 6 10
    // 1,2,3  6
    // 1,2,4 7
    // 1,3,4 8
    // 2,3,4 9

    //1,2,7,6,4
    //1,2,7
    //1,2,6
    //1,2,4
    //2,7,6
    //2,7,4
    //2,6,4
    //7,6,4


    public int solution(int[] num) {
        int count = 0;
        int sum = 0;

        for(int i=0;i<num.length-2;i++){
            for(int j=i+1;j<num.length-1;j++){
                for(int k=j+1;k<num.length;k++){
                    if(i!=j&&i!=k&&j!=k){
                       sum = num[i]+num[j]+num[k];
                       for(int t=2;t<sum;t++){
                           if(sum%t==0){
                               break;
                           }
                           if(t==sum-1){
                               count++;
                           }
                       }
                    }

                }
            }
        }


        return count;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution(new int[]{1,2,7,6,4}));
    }
}
profile
기록하는 습관

0개의 댓글