-클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고함 (클래스를 인스턴스화 → 인스턴스(객체))
-인스턴스: 클래스로부터 만들어진 객체
-하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우는 가능 vs 여러 인스턴스를 하나의 참조변수가 가리키는 것은 불가능
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고함 (클래스를 인스턴스화 → 인스턴스(객체))
-자바 파일 하나에 여러 개의 클래스가 존재할 수도 있음. 단, public 클래스는 하나이고 public 클래스와 자바 파일 이름은 동일해야함.
변수와 메서드
-변수는 클래스변수, 인스턴스 변수, 지역변수 3종류가 있음
public class VariableTest{ //클래스 영역
int instanceVariable; //인스턴스변수
static intclassVariable; //클래스변수(static 변수, 공유 변수)
void method(){
int localVariable = 0; // 지역변수, 메서드 영역
}
}

1) 인스턴스변수
→ 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐, 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야함
2) 클래스변수
→ 인스턴스 변수 앞에 static을 붙이면 됨
→ 모든 인스턴스가 공통된 저장공간(변수)을 공유하게됨, 인스턴스를 생성하지 않고도 언제라도 바로 사용(클래스이름.클래스변수)
→ 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지 (전역변수의 성격)
3) 지역변수
→ 메서드 내에 선언되어 메서드 내에서만 사용 가능, 메서드가 종료되면 소멸되어 사용할 수 없게됨
*인스턴스가 생성될 때 마다 생성되므로 인스턴스 마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.


1) 메서드 영역
-타입 정보
-런타임 상수 풀: 타입의 모든 상수 정보
-필드 정보
-메서드 정보
-클래스 변수(static)
2) 힙
-인스턴스가 생성되는 공간(인스턴스변수들이 생성되는 공간), GC 동작 대상
3) 스택
-메서드의 작업에 필요한 메모리 공간을 제공, 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수, 파라미터, 메소드 정보, 임시데이터, 연산의 중간결과를 저장하는데 사용됨
-메서드가 작업을 마치면 메모리공간은 반환되어 비워짐
4) PC 레지스터
-쓰레드가 시작될 때 생성되어 쓰레드의 명령어 실행을 기록, JVM의 명령어 주소를 가진다.
5) 네이티브 메서드 스택
-바이트 코드가 아닌 Binary Code 실행 영역
-JNI(Java Native Interface)를 통해 호출되는 C/C++의 코드를 실행하는 영역이다.
-기본형 매개변수: 변수의 값을 읽기만 할 수 있음
-참조형 매개변수: 변수의 값을 읽고 변경할 수 있음
-메서드 호출 시 기본형인 경우 값이 복사되지만, 참조형이면 인스턴스의 주소가 복사됨
(메서드 종료 시 매개변수(기본형)는 스택에서 제거됨)
-반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미함
생성자
-객체를 생성할 때 new 키워드와 함께 호출 (객체 생성 외에는 호출할 수 없음)
-인스턴스를 초기화하는 코드가 구현됨 (주로 멤버변수 초기화)
-반환값이 없고, 상속되지 않음
-생성자는 클래스 이름과 동일
-하나의 클래스에는 반드시 하나 이상의 생성자가 존재해야함
-> 생성자를 구현하지 않으면 컴파일러가 생성자 코드를 넣어줌 (기본 생성자, 디폴트)
-> 기본 생성자는 매개 변수가 없고, 구현부가 없음
-> 만약 클래스에 다른 생성자가 있는 경우 디폴트 생성자는 제공되지 않음
-> 디폴트 생성자를 구현하고(사용하고) 싶지 않은 경우 다른 생성자를 구현하고 기본 생성자를 만들지 않으면 됨
참조 자료형
-클래스형으로 변수를 선언함 (ex) String name)
접근제어자
-public, protected, private, 아무것도 안 쓰는 경우(기본 접근 제어자, package-private)
-기본 접근 제어자는 같은 패키지 내에서만 참조할 수 있음
-private을 사용하면 클래스 외부에서는 접근할 수 없음
-protected는 상위 클래스에서 선언한 멤버변수/메서드를 하위 클래스에서도 public하게 오픈하고 싶을 때 사용
-정보 은닉: private 변수를 외부에서 접근하게 하려면 public 메서드를 제공함 (클래스 내부 데이터를 잘못 사용하는 오류를 방지할 수 있음)

this의 역할
-자신의 메모리를 가리킴
-생성자에서 다른 생성자를 호출할 때 사용
-> this()를 통해 다른 생성자를 호출할 때 fisrt statement여야함
-인스턴스 자신의 주소를 반환할 때 사용
static 변수와 메서드
-static 변수는 처음 프로그램이 로드될 때 JVM 메서드 영역에 메모리를 할당한다.
-인스턴스의 생성에 상관 없이 사용할 수 있으므로 클래스 이름으로 참조
-클래스 변수, 정적 변수라고함
-static 변수를 일단 일반 메서드에서는 사용 가능, 하지만 static 메서드 안에서는 인스턴스 변수를 사용할 수 없음 (인스턴스 생성과 관련없이 호출됨)
-static 메서드는 클래스 이름으로 참조하여 사용하는 메서드 (클래스 메서드, 정적 메서드)