알고리즘 공부 및 테스트가 있었고  

금요일 부터 주특기 Spring 본격 시작하였다.

 

  • 기간 9월 23일(금)~29일(목)
  • 알고리즘 문제 해결 및 코딩 테스트 준비, 자바 문법 익숙해지기

 

JVM, JRE, JDK의 차이

자바에서 사용하는 용어 중 혼동하기 쉬운 JVM, JRE, JDK에 대해서 정리해 보자.

JVM

JVM은 자바 가상머신(Java Virtual Machine)의 약자이다.

JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있다. 또한 JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우즈의 JVM은 다르다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있다.

JVM은 다음과 같은 역할을 한다.

  • 바이너리 코드를 읽는다.
  • 바이너리 코드를 검증한다.
  • 바이너리 코드를 실행한다.
  • 실행환경(Runtime Environment)의 규격을 제공한다. (필요한 라이브러리 및 기타파일)

JRE

JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.

JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다.

JDK

JDK는 자바 개발도구(Java Development Kit)의 약자이다.

JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

A2 JVM, JRE, JDK의 차이 - 점프 투 자바 (wikidocs.net)

 

메모리

 

 

출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

 

메서드 영역

 

메소드 영역은 Class Area, Code Area, Static Area로 불려지며, 의미상 공유 메모리 영역이라고도 불린다. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스 별로 런타임 상수 풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 메소드 영역은 JVM이 동작해서 클래스가 로딩될때 생성되고, 모든 스레드가 공유하는 영역이다.

 

1. 클래스 내부에서는 직접 접근이 가능하다.(왜? 라고 생각 되면, 위의 내용을 다시 한번...)

public class StaticExample { 
  static int count = 0;

  StaticExample() {}

  public void increase() {
    count += 1;
  }
}

 

 

2. 클래스 이름으로 접근, 인스턴스 생성 후 접근(인스턴스 변수와의 구분이 어렵다. 권장하지 않는다.)

 

public class Main { 
  public static void main(String[] args) {
    StaticExample.count++; //클래스 이름으로 접근

    StaticExample staticExample = new StaticExample();
    staticExample.count++;  //인스턴스 생성 후 접근(권장하지 않음.)
}

 

스텍 영역

 

Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • 지역변수들은 scope 에 따른 visibility 를 가진다.
  • 각 Thread 는 자신만의 stack 을 가진다.

Stack 에는 heap 영역에 생성된 Object 타입의 데이터들에 대한 참조를 위한 값들이 할당된다. 또한, 원시타입(primitive types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당된다. 이때 원시타입의 데이터들에 대해서는 참조값을 저장하는 것이 아니라 실제 값을 stack 에 직접 저장하게 된다.

 

Heap area(힙 메모리 영역)

 

 인스턴스를 생성하는 방법은 "클래스 변수 =  new 클래스();" 라는 것을 기억하면서 밑에 내용을 확인해 보자.
 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값) new 연산자를 통해 리턴 받는다. 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.

 
public class HeapAreaEx01 {
    public static void main(String[] args) {
        int[] a = null; // int형 배열 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new int[5]; // Heap 영역에 5개의 연속된 공간 할당 및 
        // 변수 a에 참조값 할당
        System.out.println(a); // 결과 : @15db9742 (참조값)
    }
}

 설명은 소스 코드의 주석 처리된 부분과 같다. 결국 a변수는 데이터가 저장된 Heap영역의 참조 값을 리턴 받아 갖고 있다는 것이다. 다른 예제도 확인해보자.

 

 
public class HeapAreaEx02 {
    public static void main(String[] args) {
        String str1 = new String("joker");
        String str2 = new String("joker");
        if(str1 == str2){
            System.out.println("같은 주소값 입니다.");
        }else{
            System.out.println("다른 주소값 입니다.");
        }
    }
}

 

 문자열을 저장하는 String도 참조형이다. new 연산자를 이용해서 생성하면 데이터는 Heap 영역에 저장되고 str1과 str2는 참조 값을 리턴 받는다. 저장된 주소가 다르기 때문에 "=="으로 비교 시 "다른 주소값 입니다."가 출력되는 것이다. 마지막으로 예제를 하나 더 살펴보자.

 

 

class A{}

public class HeapArea {
    public static void main(String[] args) {
        A a = null; // A타입의 a객체 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new A(); // Heap 메모리에 공간 할당 및 객체(a)에 참조값 할당
        System.out.println(a); // 결과 : @15db9742
    }
}

 소스 코드에 주석 처리한 내용으로 설명은 대신하겠다. 결국 객체가 참조 값을 갖는다는 것이다.

 참고로 Heap에 저장된 데이터가 더 이상 사용이 불필요하다면 메모리 관리를 위해 JVM(자바 가상머신)에 의해 알아서 해제된다. 이러한 기능을 가비지컬렉션(GC, 쓰레기 수집)이라고 한다. 
 메모리 관련 내용은 여기서 마무리하겠다. 메모리는 중요한 부분이고 인스턴스 등을 정의할 때 왜 이렇게 사용하는지 이해하는 것이 코딩하는데 있어 많은 도움이 될 것이다. 

배운 것

알고리즘 문제 해결을 통한 구체적인 구현력과 사고력을 향상시킬수 있는 주였고,

JVM 및 세부사항 및 JAVA WEB의 꽃인 SPRING BOOT 가 기본적으로 어떻게 실행 되고 작동되는지 알수 있었다.

 

아쉬웠던 점/느낀점

알고리즘 문제를 풀면서 처음에는 문제를 잘 이해하지 못하고 어떻게 문법을 써야하는지도 잘 알지 못했다.

남들보다 더 많은 시간을 투자해서 공부를 해 주어진 40문제를 풀긴 했지만,  짧은 시간인 만큼 정말 이해가 가지 않는 문제의 경우 그냥 풀의만 보고 해석해보고 정 안되면 그냥 넘겨버린 문제들이 있다.  알고리즘 주를 보내면서 내 실력에 대해 잘 알게 되었고 , 앞으로도 알고리즘 문제는 조금씩이라도 풀어보며 더 익숙해질 것이라고 다짐했다.

또한 사용자의 요구사항을 주어진 기능적으로 구현을 해야하는 것에 대해 조금은 이해를 할 수 있는 시간이엿다.

 

 

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 3주차 WTL 회고  (0) 2022.10.09
항해 99 (9기) 1주차 회고  (1) 2022.09.25

+ Recent posts