
모든 자바 프로그램은 자바 가상 머신(JVM)을 통해서 실행된다.
자바 프로그램이 실행되면, JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.
이렇게 할당받은 메모리를 JVM은 용도에 따라 다음과 같이 구분하여 관리한다
자바의 클래스파일을 실행하면 클래스로더에서 클래스파일을 로드후 메모리 공간(Runtime Data Area)에 영역을 나눈다.

JVM 이 동작해서 클래스가 로딩될 때 생성한다.
JVM 이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀 , 멤버 변수(필드), 클래스 변수(Static 변수), 상수(static final), 생성자, 메소드 등을 저장하는 공간이다.
클래스 (원본) 을 저장한 공간이라고 생각하자.
Static 변수는 인스턴스 변수와 달리 클래스가 메모리에 올라갈 때부터 생성이 되어정적영역에 속한다.
final 필드는static final 상수와는 달리 객체마다 저장되기 때문에 정적 영역이 아닌Heap 영역에 속한다.
Method ( Static ) 영역에 있는 것은 어느곳에서나 접근 가능하다.
프로그램의 시작부터 종료가 될 때까지 메모리에 남아 있다.
그래서 Static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
그러나 Static 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어날 수 있게 된다.
그 외에도 Static을 무분별하게 사용할 경우 원본인 클래스에 접근하게 되어서
보안적인 측면에서도 좋지 않다.
JVM 이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
참조형 데이터 타입을 갖는 객체(인스턴스), 배열, 인스턴스 변수 등이 저장되는 공간이다.
Static 변수와 달리인스턴스 변수는객체가 생성 시메모리에 생성된다.
객체 ( 복사본 ) 이 저장된 곳이라고 생각하자.
이때, 객체 (인스턴스) 는 Heap 영역에 있고 그객체를 담는 변수는
Stack 영역에 있어 Heap 영역에 있는객체의 메모리주소를 참조한다.
Heap 영역은 Stack 영역과 달리 메모리 호출이 끝나도 삭제되지 않고 유지된다.
그러나 어떤 참조 변수도 Heap 영역에 있는 객체를 참조하지 않는다면 GC(가비지 컬렉터)에 의해 메모리에서 청소된다.
Stack 영역은 스레드 갯수마다 각각 생성되지만,
Heap 은 몇개의 스레드가 존재하든 단 하나의 Heap 영역만 있다.
기본 자료형에 해당하는 지역변수의 데이터 값이 저장되는 공간이다.
기본형 데이터 타입에 해당하는 지역변수, 매개변수 등이 저장된다.
메서드가 호출될 때 스택 영역에 스택 프레임이 생기고 그 안에 메서드를 호출한다.
메서드가 호출될 때 메모리에 할당되고 종료되면 메모리에서 사라짐
후입선출 (Last-In-First-Out) 특성을 가지며 스코프 범위에서 벗어나면 스택 메모리에서 사라진다.
'스택 프레임' : 하나의 메서드에 필요한
메모리 덩어리를 묶어논 것.
메서드 호출 직전 스택프레임을 자바 Stack 에 생성한 후 메서드를 호출한다.
스택 프레임에 쌓이는 데이터는매개변수,지역변수,리턴값등이 있다.
호출범위가 종료되면 스택에서 제거된다.
스택(stack) 영역 은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장 되는 영역이다.
JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장한다.
이렇게 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸한다.
이렇게 스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
Private : 같은 클래스 내에서만 접근 가능
default : 같은 패키지 내에서만 접근 가능 ( 기본 값 )
Protected : 같은 패키지 + 다른 패키지의 자손클래스 ( extends ) 에서 접근 가능
Public : 접근 제한 없음
클래스는 public class AcessTest {...} 나 (default) class AcessTest {...} 만 가능하다.
( private, protected 클래스는 X )
final class FinalTest {...} 와 같이 클래스 앞에 final 키워드가 붙으면 조상이 될 수 없다.
마찬가지로 final void finalTest(){...} 와 같이 메서드 앞에 final 키워드가 붙으면 오버라이딩으로 덮어쓸 수 없다.
OOP 의 4대 특성 중 하나
서로 연관된 것 들끼리만 하나의 캡슐에 담아 데이터를 외부로부터 보호한다는 의미.
외부에는 불필요한, 내부적으로 사용되는 부분을 감추기 위해 캡슐화 한다.
정보은닉 : 실수로 건들이면 안될 부분을 숨겨놔서 실수로 인해 의도와는 다르게 사용되는 것을 막아 사용자를 보호한다.접근제어자 사용getter/setter 사용
getter : private 한 멤버의 값을 외부에서 불러오게 하는 것 ( public 사용 )setter : private 한 멤버의 값을 외부에서 수정하게 하는 것 ( public 사용 )getter / setter 을 통해서만 간접 접근 을 가능하게 한다.