TIL

2024_12_26 TIL

hi_i 2024. 12. 26. 22:47

오늘의 할 일

  • Quiz 풀기
  • "자바의 정석" 객체지향 (JVM메모리구조~ 기본/참조형 매개변수)

JVM 메모리 구조

JVM(Java Virtual Machine) - Java가 OS환경에 영향을 받지 않고 실행시켜 주는 가상 환경.

  1. 메서드 영역(Method area) : 프로그램 실행 중 클래스가 사용되면 JVM은 해당클래스를 분석하여 클래스에 대한 정보들을 해당 영역에 저장한다. 동시에 클래스 변수(Class Variable)도 함께 생성된다.
  2. 힙 영역(Heap) : 인스턴스가 생성되는 공간. 인스턴스 변수(Instance variable)도 함께 생성된다.
  3. 호출스택(Call Stack) : 메서드가 작업에 필요한 공간을 제공, 메서드가 작업을 수행하는 동안 변수들과, 중간 결과 등을 저장하였다가 메서드가 종료되면 할당되었던 공간은 반환되어 비워진다.
  각 메서드를 위한 메모리 공간은 구별되며 메서드가 다른 메서드를 호출하면 이는 Stack 구조로 쌓이게 된다(FILO)

기본형/ 참조형 매개변수

  • 기본형 매개변수 : 값을 읽어오는 것만 가능 (매개변수로 넘어올때 을 복사)
  • 참조형 매개변수 : 값을 읽고/쓰는 것 가능(매개변수로 넘어올때 값의 주소값을 복사)

기본형 매개변수

//2024_12_26 기본형 메서드
//
package class1.Test;

class Data{int x;}

public class Exam {
    public static void main(String[] args) {
        // Data타입의 d객체 생성
        Data d = new Data();
        // x의 10 할당
        d.x = 10;

        //change() 사용이후 원래의 d.x 값에 변동있는지 확인하는 과정.
        //현재 change는 기본형(int)형이기 때문에 매개변수로 활용되는 int x의 값은
        // 복사가 되어 활용됨
        System.out.println(d.x);
        change(d.x);
        System.out.println(d.x);
    }
    static void change(int x){
        //복사해온 x의 값이기때문에 메서드 내에서 값을 변경시켜도
        //복사된 값이 변경되는 것이므로 원래의값(d.x)의 값은 변화 X
        x = 1000;
        System.out.println(x);
    }
}

참조형 매개변수

package class1.Test;

public class Exam2 {
    public static void main(String[] args) {
        // Data타입의 d객체 생성
        Data d = new Data();
        // x의 10 할당
        d.x = 10;

        //change() 실행 전과 후의 값 비교 과정
        System.out.println(d.x);
        change(d);
        System.out.println(d.x);
    }
    // change는 매개변수로 Data타입을 받음
    // Data타입은 기본형에 포함이 되지 않기때문에 참조형으로 분류
    static void change(Data d){
        //복사된 것은 값이 아닌 d.x가 가르키는 주소값을 받아왔기때문에
        //원래 d.x와 메서드 내의 d.x는 같은 주소값을 가짐.
        //메서드 내에서 값을 바꾸면 원래 d.x의 값도 같이 바뀜.
        d.x = 1000;
        System.out.println(d.x);
    }
}

# 위의 코드에서 change() 는 매개변수로 Data 타입을 받아옴. d는 Data타입으로 생성된 객체 이므로 change의 매개변수로 입력할 수 있다. ( 타입의 일치)

# 참조형 매개변수는 메서드 실행이 종료되면 메모리에서 메서드에 대한 내용이 지워지기 때문에 값을 반환(main에서 사용) 하고 싶다면 새로운 객체에 반환되는 주소값을 할당해 주어야한다.