2018-3-13 TIL Java Memory Model

자바의 메모리모델과 Object클래스

  • 자바 가상머신 메모리 관리 방식을 ‘자바 메모리 모델’이라고 한다

자바의 메모리모델

자바의 메모리모델은 크게 메소드영역, 스택영역, 힙영역으로 나눌 수 있다.

  • 메소드영역(Method Area) : 메소드영역은 클래스의 정보가 메모리 공간에 옮겨질 때 채워지는 영역이다.
  • 스택영역(Stack Area) : 지역변수, 매개변수가 저장되는 공간이다. “중괄호가 구분되는 지역 내에서만 유효한 변수들이다” 매개변수와 지역변수는 선언되는 순간에 스택에 할당이 되었다가 자신이 할당된 영역을 벗어나면 소멸이된다.
  • 힙영역(Heap Area) : 인스턴스가 할당이 된다. 자바의 인스턴스 소멸 방식을 ‘가비지컬렉션(Garbage Collection)”이라한다.

Object클래스

  • 인스턴스 비교 equals 메소드
package yoon;

class INum {
    private int num;

    public INum(int num) {
        num = this.num;
    }

    @Override
    public boolean equals(Object obj) {
        if(this.num == ((INum)obj).num)
            return true;
        else
            return false;
    }
}

public class ObjectEquals {
    public static void main(String [] args) {
        INum num1 = new INum(10);
        INum num2 = new INum(12);
        INum num3 = new INum(10);

        if(num1.equals(num2))
            System.out.println("num1, num2 내용이 동일하다.");
        else
            System.out.println("num1, num2 내용이 다르다.");

        if(num1.equals(num3))
            System.out.println("num1, num3 내용이 동일하다.");
        else
            System.out.println("num1, num3 내용이 다르다.");

    }
}
//result
num1, num2 내용이 동일하다.
num1, num3 내용이 동일하다.
package yoon;

public class StringEquality {
    public static void main(String [] args) {
        String str1 = new String("So Simple");
        String str2 = new String("So Simple");

        //참조 대상을 비교하는 if ~ else
        if(str1 == str2)
            System.out.println("str1, str2 참조 대상 동일하다.");
        else
            System.out.println("str1, str2 참조 대상 다르다.");

        // 두 인스턴스 내용을 비교하는 if ~ else
        if(str1.equals(str2))
            System.out.println("str1, str2 내용 동일하다.");
        else
            System.out.println("str1, str2 내용 다르다.");
    }
}
//result
str1, str2 참조 대상 다르다.
str1, str2 내용 동일하다.
  • 두 인스턴스의 내용 비교를 원한다면 Object클래스의 equals메소드를. 단순 참조변수의 값을 비교하려면 == 연산을 사용하자.
Written on March 13, 2018