JVM 메모리구조


메서드 영역 - 프로그램 실행 중 클래스가 사용되면 JVM은 해당 클래스의 클래스파일을 읽어서 클래스에 대한 정보(클래스 데이터)(클래스변수)를 저장한다.

 

힙 영역 - 인스턴스가 생성되는 공간(인스턴스 변수)

 

호출스택(call , execution) - 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 메모리가 할당되며, 이 메모리는 메서드의 지역변수, 매개변수 등 중간결과들을 저장하는데 사용되고 끝나면 할당된 메모리 공간은 반환되어 지워진다.

 

호출스택은 먼저 호출된 메서드가 맨 아래에 위치하게된다.

즉 다음 코드를 보면

firstMethod();

}
static void firstMethod() {
    secondMethod();
}
static void secondMethod() {
    System.out.println("second");
}

main -> firstMethod -> secondMethod -> seconMethod종료 -> firstMethod종료 -> main종료 순으로 진행이 되게된다.

 

기본형 매개변수와 참조형 매개변수


참조형 매개변수의 경우에는 인스턴스의 주소가 복사된다.

기본형 매개변수 -> 변수의 값을 읽기만 할 수 있다.

참조형 매개변수 -> 변수의 값을 읽고 변경할 수 있다.

 

기본형 매개변수의 변수값을 변경 시도한것이다.

   Data1 d = new Data1();
        d.x = 10;
        System.out.println("main" + d.x);

        change(d.x);
        System.out.println("after change");
        System.out.println("main" +d.x);

    }
    static void change(int x){
        x=1000;
        System.out.println("change" + x);
    }
}

    class Data1 {
        int x;
    }

d.x의값이 변경된 것이 아니라 복사본이 변경된 것이라 원본에는 영향을 미치지 못해 바꾸어도 10이 출력된다.

 

참조형 매개변수의 변수값을 변경 시도한 것이다.

  Data1 d = new Data1();
        d.x = 10;
        System.out.println("main" + d.x);

        change(d);
        System.out.println("after change");
        System.out.println("main" +d.x);

    }
    static void change(Data1 d){
        d.x=1000;
        System.out.println("change" + d.x);
    }
}

    class Data1 {
        int x;
    }

change메서드의 매개변수가 참조형이라서 값이 아니라 값이 저장된 주소를 change메서드에게 넘겨주었기 때문에 값 변경이 가능해 1000이 출력된다.

 

 

참조형 매개변수로 반환값이 없는 메서드 이용 시도

  object_oriented r = new object_oriented();
    int[] result1 = new int[1];
   // System.out.println(result1.length);
    r.add(3,5,result1);
    System.out.println(result1[0]);
}
    void add ( int a, int b, int[] result){
        result[0] = a + b;
    }

void로 return값이 없지만 참조형 매개변수는 주소를 가르키기 때문에 값이 변경된다.

 

참조형 반환타입


    Data1 d = new Data1();
    d.x=10;

    Data1 d2 = copy(d);
    System.out.println(d.x);
    System.out.println(d2.x);
}
static Data1 copy (Data1 d) {
    Data1 tmp = new Data1();
    tmp.x = d.x;
    return tmp;
}

 

메서드의 return값으로 tmp라는 객체가 제공된다.

copy메서드가 호출되어 종료되면 tmp는 사라지지만 종료되면서 반환된 tmp는 참조변수 d2에 저장되어 d2라는 새로운 객체를 다룰 수 있다.  -> 반환타입이 참조형 이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.

+ Recent posts