자바의 메모리 구조

- 메서드 영역(Method Area) : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리합니다. 이 영역은 프로그램의 모든 영역에서 공유합니다.
- 클래스 정보 : 클래스의 실행 코드(Byte Code), Field, Method와 생성자 코드 등 모든 실행코드가 존재합니다.
- static 영역: Static 변수들을 보관합니다.
- Runtime 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관합니다. 예를 들어 "hello"라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리합니다. 이 외에도 프로그램을 효율적으로 관리하기 위한 상수들을 관리합니다.
- 스택 영역(Stack Area) : 자바 실행 시, 하나의 실행 스택이 생성됩니다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함합니다.
- 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임입니다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거됩니다.
- 힙 영역(Heap Area) : 객체(인스턴스)와 배열이 생성되는 영역입니다. garbage collection이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거됩니다.
꼬리질문 1. Static이란 뭔가요??
정적(static)은 고정된이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 합니다.(클래스 멤버라고도 합니다.) 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리됩니다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있습니다.
static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다.
즉, 인스턴스(객체) 생성 없이 바로 사용 가능합니다.
모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.
다형성이란?
- "다양한 형태", "여러 형태", 즉, 여러 가지 형태를 가질 수 있는 능력을 의미
- 프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻합니다.
- 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현했습니다.
Java에서는 부모 타입은 물론이고, 자신을 기준으로 모든 자식 타입을 참조 할 수 있습니다. 이것이 바로 다양한 형태를 참조할 수 있다고 해서 다형적 참조라고 합니다. 다형성 참조의 핵심은 "부모는 자식을 품을 수 있다는 것"입니다.
꼬리질문 1. 메서드 오버라이딩?
Final이란?