객체(object) : 사용할 수 있는 실체
클래스 : 객체를 만들기 위한 설계도
struct Score{
int[] scores = {80, 67, 92, 44};
double avg = 72.3;
}
필드 VS 지역 변수(local variable)
스택 메모리에 저장되는 변수는 때가 되면 가비지 컬렉터가 자동으로 삭제하지만, 힙 메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않는다.
스택 메모리의 변수는 자신이 선언된 메서드의 중괄호가 닫혀 메서드가 종료되면, 그 메서드 안에 선언된 모든 지역 변수가 메모리에서 통째로 삭제된다.
또 다른 차이점은 초깃값이다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 힙 메모리에 위치하는 필드는 강제로 초기화되고, 스택 메모리는 강제로 초기화되지 않는다. 따라서 필드는 초깃값을 따로 지정하지 않아도 되지만, 지역 변수는 초깃값을 설정하지 않으면 에러를 발생한다.
클래스는 바로 사용할 수 없고 반드시 객체를 생성해 객체 안에 있는 필드, 메서드 및 이너 클래스를 사용해야 한다.
클래스는 인스턴스화되기 전까지는 파일 형태로 하드 드라이브에 저장될 뿐 메모리의 힙 영역을 소모하지 않는다.
객체는 new 키워드로 생성할 수 있다.
A a = new A();
클래스명 참조 변수명 = new 생성자();
참조 변수는 실제 데이터를 저장하는 것이 아니라,
실제 데이터가 있는 힙 메모리의 위칫값을 가리키는 변수를 말한다.
A() 생성자로 만든 객체를 힙 메모리에 넣고, 위칫값을 A타입의 참조 변수 a에 저장하라
클래스 A는 메모리의 클래스 영역, 참조 변수는 스택 영역에 들어간다.
내부 공간에는 실제 데이터(객체)의 위칫값을 저장한다.
생성자로 만들어진 객체는 힙 메모리에 위치하며, 내부에는 클래스의 멤버(필드, 메서드, 이너 클래스)가 위치한다.
하지만 실제 메서드 구현 코드는 클래스 영역 안에 저장해 놓고, 객체 안에는 메서드 영역의 위치만 가리키고 있다. 그 이유는 1개의 클래스로 만든 모든 객체는 속성(필드)는 달라도 기능(메서드)는 동일하기 때문이다.
예를 들어 자동차 클래스로 빨간색 자동차 객체와 파란색 자동차 객체를 만들면 힙 메모리에 각 객체가 저장되고, 각 개체는 서로 다른 색(속성)을 가지고 있지만 둘 다 기능(메서드)는 동일하다.
즉, 객체를 1000개 만들어도 메서드는 한 번만 만들면 된다.
생성된 객체에서 필드값은 실제 저장 공간이 객체 내부에 있고, 메서드는 메서드 영역에 있는 하나의 메서드를 공유하고 있다.
자바에서는 힙 메모리에 직접 접근할 수 없어서, 위치 정보를 포함하고 있는 참조 변수를 이용해서만 객체에 접근할 수 있다.