이 글은 Inflearn 강의 중 김영한님의 김영한의 실전 자바 - 기본편을 감상하며 작성하였습니다.
자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 으로 나누어진다.
메서드영역

스택영역
힙 영역
new 키워드를 사용하면 이 메모리영역에 인스턴스가 생성된다. 클래스의 인스턴스 뿐 아니라 new 로 생성하는 배열 등 모든 자료구조가 여기에 생성된다. String 도 new 키워드를 사용하여 인스턴스화 하면 힙 영역에 생성되고 리터럴로 생성하면 메서드영역의 상수풀에 생성된다.
static 키워드는 멤버변수와 메서드에 사용된다.
public class Test {
public static int a;
public static showA () {
System.out.println(a);
}
}
static 키워드가 붙은 멤버변수와 메서드의 정보는 메서드영역의 static 영역 에 생성된다.
이제 static 키워드가 사용된 멤버변수 a 와 showA 메서드는 Test 클래스를 인스턴스화 하지않고 사용할 수 있다.
public static void main(String[] args) {
Test.a = 10;
Test.showA();
}
왜 이런 키워드와 영역을 만들게 되었을까?
어떤 객체가 생성될 때 생성자를 통해 생성된 인스턴스를 카운팅하는 변수를 생성해보자.
public class Test {
public int count;
Test () {
count++;
}
}
이제 객체를 생성하면 count 변수의 값이 하나씩 증가한다.
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();
System.out.println(test1.count);
System.out.println(test2.count);
System.out.println(test3.count);
//결과
1
1
1
이는 당연한결과이다.
Test 객체의 인스턴스가 3개 생성되었고 count 라는 변수의 공간도 3개가 생성되어가 각각 관리된다.

이를 해결하기위해 Count 클래스를 설계하고 인스턴스화한 Count 인스턴스를 통해 count 변수를 관리할 수 있지만 힙 메모리영역을 낭비하게 된다.
static 변수 및 메서드는 정적변수, 정적메서드 또는 클래스변수, 클래스메서드라고 부른다.
static 키워드가 붙지 않은 변수와 메서드는 인스턴스변수, 인스턴스메서드 라고 부른다.
static 변수와 메서드는 메서드영역의 static 영역에 보관된다. static 영역의 메서드에서 인스턴스 변수와 메서드를 포함하는 클래스가 힙 영역에 인스턴스화 되지않아 인스턴스변수와 메서드가 생성되지 않았기때문에 사용할 수 없다.
public class Test {
private int a;
static int b;
public void showA () {
System.out.println(a);
showB();
}
static void showB () {
System.out.println(b);
showA(); //클래스메서드(정적메서드) 에서 인스턴스 메서드를 호출하여 컴파일에러 발생
}
}