자바공부하기 64

JVM 메모리 모델

 

메소드 영역(Method area)

- 공유 메모리 영역이라고도 한다.

 

- 클래스의 메소드에 대한 바이트코드, 클래스의 전역변수인 클래스 병수(static)위치

 

- JVM에서 실행되고 있는 모든 스레드에 의해 공유

 

- JVM은 복수개의 스레드가 메소드를 정상적으로 사용하기 위해 동기화(synchronization)기법 제공

 

- static 필드(클래스 변수)

: 각 클래스의 static 필드가 확보

: 사용을 위해 클래스 이름으로 호출 시 메모리에 적재

 

- 바이트 코드(메서드)

: 메서드의 실행 로직에 대한 바이트코드가 메모리로 적재되는 공간

: 실행 로직이 메모리에 적재되야 cpu가 fetch할 수 있음

: 자바의 모든 로직은 메서드에만 존재

* 클래스는 ㅣㄹ드와 메서드로만 구성되어있기 때문

: 메서드에 대한 바이트코드도 static 필드와 마찬가지로 클래스를 객체 생성할 시점에 메모리에 적재(예외: main())

 

- 장점

: 기동시간의 단축

: 끝까지 사용되지 않은 클래스(필드, 메서드)가 있을 경우 메모리를 절약

 

- 메서드 영역은 프로그램이 시행되기 시작되기 시작할 때부터 끝날 때까지 계속 존재하는 것이라고 보면 된다.

 

- 다른 메모리 영역과의 차이

: 스택(Stack)과 같이 필요에 의해 임시적으로 생성되고 사라지지도 않고 힙(Heap)안의 객체와 같이 실행 시 확보되지 않고 계속해서 정적으로 존재

: 또한 스택은 스레드 별로 존재한다.

 

 

 

자바공부하기 63

 

JVM 메모리 모델

 

- 어플리케이션 프로그램을 만들 때 메모리나 어드레스 같은 낮은 수준의 사항을 너무 의식하면 안된다.

 

- 그것을 의식하지 않은 언어일수록 고급언어이며, JAVA도 그러한 고급언어에 속한다.

 

- 그러나 JAVA를 확실하게 이해하려면 메모리의 사용법을 어느정도 이해하는 것이 좋다 생각한다.

 

 

자바공부하기 62

 

생성자 예

 

public class platoon { //소대

private String name;

public Platoon() { //보통 4분대

name= "Platoon";

}

public Platoon(String name){

this.name=name;

}

public String getPlatoonName(){

return name;

}

public void showPlatoonName(){

System.out.println("The "+name+" platoon. ");

}

}

 

 

 

 

자바공부하기 61

 

생성자 예제_1

 

 

 

생성자 예제_2

 

 

 

자바공부하기 60

 

생성자

 

생정자 메서드

- 객체가 생성될 때 호출되어 실행하는 메서드

- 메서드 이지만 유일하게 리턴형이 없음

- 생성자 메서드의 이름은 클래스의 이름과 동일

- new 연산자가 호출된 직후에 호출

: new 연산자가 메모리를 생성하면 멤버변수들이 메모리를 할당받음

: 따라서 변수들에 대한 초기화 작업이 가능해짐

 

- 클래스에 기본 생성자 메서드가 없다면 컴파일러가 자동으로 생성해줌

: 컴파일러가 생성해주는 기본 생성자 메서드는 매개변수가 없고 블록이 비어있음

 

- 생성자 메서드의 사용이유

: 할당 받은 멤버변수를 초기화 할 때

: 객체가 생성되기 전의 미리 해야 할 작업이 있을 때

 

 

 

 

 

자바공부하기 59

 

private의 진정한 의미

 

Encapsulation

- 자료의 보호

- 내부적으로만 사용하기 위해

* "사과와 위 그리고 먹다(씹다)"

* 사과 : 외부 데이터

* 위 : private 변수

* 먹다() : public 메서드

* 그냥 집어넣으면 입 찢어지고 가슴 찢어짐

- 내부의 자료가 변경되어도 외부에 영향을 주지 않는다.

 

 

 

 

- 내부의 데이터 또는 로직이 변경되어도 외부에 영향을 주지 않는다.

 

- 액세서(accessor)

* getXXX(), setXXX()

 

- 데이터필드는 반드시 private으로 하고 엑세서를 경유하여 접근해야 한다.

단점은 번거롭고 소스가 엑세서에 묻힐 수 도 있다.

자바공부하기 58

 

메서드를 이용한 접근제어

- public 메서드를 이용하여 private 멤버필드에 데이터를 전달한다.

 

- private 멤버필드에 값 전달하기

: 값 입력받기

* 외부로부터 데이터를 매개변수 형태로 받아서 내부의 멤버에 전달

 

: 값 전달하기

* 메서드의 리턴을 통해서 멤버필드에 전달

 

- getXXX() , setXXX()

 

Class Test6 {

private int top_secret;

public void setMyTop(int x){

top_secret = x;

}

public int getMyTop() {

return top_secret;

}

}

public class Test6Main {

public static void main(String[] args) {

int s;

Test6 t6 = new Test6() ;

t6.setMyTop(1000);

s = t6.getMyTop();

System.out.println("private멤버의 값은: " +s);

System.out.println("private멤버의 값은: " + t6.getMyTop());

}

}

 

 

public메서드를 통한 private메서드의 접근

다음글에선 private에 대해 알아볼꺼에요 ^^

 

자바공부하기 57

접근제어

 

 

Class Father {

public int age;

public long height;

private float weight;

}

 

class Son extends Father {

float getWeight() {

return weight;

}

}

 

public class AccessControlMain {

public static void main(String[] args) {

Son son = new Son();

// Upcasting

Father son1 = son;

son1.age= 100;

son1.height = 170L;

son1.weight = 49.0F;

System.out.println("age". + son1.age);

System.out.println("height" + son1. height);

System.out.println("weight" + son1.weight);

System.out.println("weight:" + son.getWeight());

}

}

 

+ Recent posts