클래스는 설계도, 객체는 그 설계도로 만들려는 대상, 인스턴스는 생성자를 거쳐 메모리에 실체가 된 것이다. 이 구분이 객체지향의 출발점이다.

설계도와 실체

절차 지향은 일어나는 일을 시간 순서대로 프로그래밍한다. 객체 지향은 객체를 만들고 객체 사이에 일어나는 일을 구현한다.

자동차를 갖고 싶다는 말이 설계 도면을 달라는 뜻은 아니다. 도면대로 만들어진 차 한 대를 원한다는 말이다. 클래스만으로는 아무것도 못 하고 클래스를 기반으로 인스턴스를 만들어야 쓸 수 있다.

멤버 변수와 메서드

클래스는 객체의 속성과 기능을 구현한 것이다. 속성이 멤버 변수(필드), 기능이 메서드다.

public class Student {
    int studentID;      // 멤버 변수
    String studentName;
    int grade;
 
    void study() { }    // 메서드
}

이름과 패키지 규칙

public 클래스의 이름은 자바 파일 이름과 대소문자까지 같아야 한다. 클래스 밖에는 package 선언과 import 말고 아무것도 쓸 수 없다. 클래스 이름을 대문자로 시작하는 것은 코딩 컨벤션이다.

클래스 이름이 같아도 패키지가 다르면 전체 이름이 달라서 다른 클래스다. StudentView의 전체 이름은 domain.student.view.StudentView다.

new가 잡는 힙 공간

Person personLee = new Person();

newheap에 공간을 잡고 그 주소를 참조 변수에 담는다. 참조 변수는 객체 자체가 아니라 객체가 있는 곳을 쥐고 있고, 이 차이가 기본형과 참조형을 가른다. 참조할 변수 없이 new Book();만 쓰면 힙에 인스턴스는 생기지만 다시 꺼내 쓸 방법이 없어 가비지 컬렉터가 수거해 간다.

인스턴스를 여러 개 만들면 저마다 다른 힙 공간을 차지한다. 멤버 변수를 저장하는 자리가 생성할 때마다 따로 생기므로 멤버 변수를 인스턴스 변수라고도 부른다. 참조 변수를 그대로 출력해보면 chapter05.Student@1b6d3586처럼 클래스 이름과 해시 코드 값이 나온다.

관련

출처