티스토리 뷰

반응형

추상화와 메모리

 

이번에는 추상화를 통한 클래스 모델링을 하고 클래스의 인스턴스가 생기는 과정에 대해 메모리에는 어떤 식으로 할당이 되는지에 대해서 알아 보겠습니다.

 

'새'라는 클래스를 모델링 해보겠습니다. 추상화를 통해 내가 관심 있는 역역에 대해서만 '속성'과 '기능'을 가져와 보겠습니다.

 

Bird Class

 

속성 - 이름, 날개의 개수

 

기능 - 날다

 

실제 코드로 정의하게 되면 다음과 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Bird {
 
    public String name;
    public int countofwing;
 
    public void fly()
    {
        System.out.println("날다");
    }
 
}
 

 

실제 테스트를 위한 main을 포함하는 클래스도 구현 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
public class BirdTest {
    public static void main(String[] args)
    {
        Bird Pizon = new Bird();
        Pizon.name="피존";
        Pizon.countofwing=2;
 
        Pizon.fly();
        Pizon=null;
    }
 
}
 

 

간단하게 Bird 클래스의 인스턴스를 생성 한 후 멤버 변수를 초기화하고 메서드를 호출 한 뒤에 객체 참조 변수에 null 값을 할당하는 코드 입니다.

 

이제 코드가 실행 될 때 마다 메모리가 어떻게 변하는지 살펴 보겠습니다.

 

BirdTest의 4번 째 줄 직전까지는 사용하는 모든 클래스, java.lang이 static 영역에 할당이 됩니다. 그 모습은 아래와 같습니다.

 

 

Bird 클래스의 name과 countofwing 속성은 이름만 존재 할 뿐 저장 공간이 할당은 되지 않습니다. 왜냐하면 이 두 속성은 클래스 속성이 아닌 객체에 해당되는 속성이기 때문에 객체가 생성 되었을 때 힙 영역에 변수 저장을 위한 공간이 할당이 됩니다.

 

이제 5Line부터 순서대로 실행 하였을 때 메모리가 어떻게 변하는지 확인해 보겠습니다.

 

● 5Line new Bird() 실행 후

 

 

main() 메서드의 '{'를 만나게 되면 스택 영역에 main()을 위한 스택 프레임이 형성이 되고, new 연산자를 통해 생성 된 객체가 힙 영역에 할당이 됩니다.

 

● 5Line 대입 연산자 실행 후

 

 

Pizon 객체 참조 변수에는 힙 영역에 할당 된 Bird 클래스의 인스턴스의 시작주소가 대입되게 됩니다. 그림으로는 화살표로 해당 객체를 가르킨다고 표현을 해서 화살표로 표시를 하였습니다.

 

● 6~7 Line

 

 

객체 멤버 변수의 name 변수와 countofwing 변수의 값을 초기화합니다.

 

● 10 Line

 

 

Pizon = null 값을 추가하게 되면 객체 참조 변수인 Pizon은 더 이상 힙 영역에 존재하는 객체 인스턴스를 참조하지 않게 되고 가비지 컬렉터에 의해서 인스턴스 공간을 회수해 갑니다.

 

Static

 

위의 Bird 클래스의 countofwing 변수는 새의 날개의 개수를 나타내는 변수입니다. 하지만 Bird 클래스의 모든 인스턴스는 같은 날개의 개수를 가지게 됩니다. 즉 여러개의 인스턴스가 생성 되었다고 가정을 하면 쓸데없이 모든 객체가 같은 countofwing 변숭에 대한 메모리 공간을 가지고 있게 됩니다.

 

이러한 문제점을 없애기 위해 static 변수를 제공합니다. static(정적) 변수는 클래스 영역으로 메모리 공간 중에 static 영역에 할당이 됩니다. 즉 모든 해당 클래스의 인스턴스는 같은 변수를 참조 할 수 있게 됩니다.

 

 

출처 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해

반응형