메소드 영역 : 클래스 정보를 보관(클래스의 실행 코드 ,필드, 메소드와생성자 코드 등 모든 실행 코드), static 영역
스택 영역 : 실제 프로그램이 실행되는 영역. 메서드를 실행할 때마다 하나씩 쌓인다.
힙 영역 : 객체가 생성되는 영역. new 명령어를 사용하면 이 영역을 사용한다. 가비지 컬렉션이 이루어지는 주요 영역
자바는 스택 영역을 사용해서 메서드 호출과 지역 변수를 관리한다.
멤버는 객체마다 별도로 존재한다.
객체 생성 시에 멤버가 생성된다.
객체가 생길 때 멤버가 생성되기 때문에 객체 생성 후 멤버 사용이 가능하다.
객체가 사라지면 멤버도 사라진다.
멤버는 객체 내에 각각의 공간을 유지하기 때문에 공유되지 않는다.
멤버는 클래스 당 하나가 생성된다.
멤버는 객체 내부가 아닌 별도의 공간에 생성된다.
클래스 로딩 시에 멤버가 생성되기 때문에 객체가 생기기 전에 이미 생성된다.
객체를 생성하지 않고도 사용할 수 있다.
객체가 사라져도 멤버는 사라지지 않는다.
멤버는 프로그램이 종류될 때 사라진다.
동일한 클래스의 모든 객체들에 의해 공유된다.
전역 변수나 전역함수는 static으로 클래스에 작성한다.
static 메서드는 non-static 멤버에 접근할 수 없다.
non-static 메서드는 static 멤버 사용가능하다.
static 메서드는 this 사용 불가하다.
public static void main(String[] args){...}
Java 프로그램이 실행되면 JVM은 클래스를 로드하고, 아직 그 클래스의 인스턴스를 만들지 못한 상태이다. 하지만 main 메서드는 프로그램의 진입점이기 때문에 아무 준비없이 접근할 수 있어야 한다. 따라서 JVM은 인스턴스가 없는 클래스인 main()을 호출해야하기 때문에 static이어야 한다.
변수나 메서드 또는 클래스가 '변경 불가능' 하도록 만든다.
기본형 변수에 사용하면 값을 변경할 수 없다.
참조형 변수에 사용하면 참조값을 변경할 수 없다(힙 내의 다른 객체를 가리키도록 변경x, 하지만 참조 대상의 객체 값은 변경할 수 있다.)
메서드에 사용하면 해당 메서드를 override할 수 없다.
클래스에 사용하면 해당 클래스의 하위 클래스를 정의할 수 없다.