객체(object)는 사용할 수 있는 실체를 의미하며, 클래스는 객체를 만들기 위한 설계도와 같다. 따라서 1개의 정의된 클래스를 이용해 여러 개의 객체를 만들 수 있다.
객체지향의 개념을 사용하기 전에는 순서에 맞춰 단계적으로 실행하도록 명령어를 나열하는 방식인 절차지향형 프로그래밍(PP: Procedural Programming)방식이 사용되었다. 클래스를 사용한 후에는 객체지향형 프로그래밍(OOP: Object-Oriented-Programming)방식이 주로 사용되는데, 이는 프로그램을 객체 단위로 수행하는 방식을 말한다.
위 그림에서 볼 수 있듯이 절차지향형 프로그램은 말 그대로 이야기를 순서대로 써 나가듯이 프로그램을 구성하는 방식이다. 반면 객체지향형 프로그램은 이 프로그램에서 사용되는 객체(자동차, 엔진, 운전자)를 생성하고, 각 객체에 포함된 데이터(컬러, 엔진, 종류, 이름, 면허번호)와 기능(전진하기, 정지하기, 구동하기, 운전하기, 장애물 감지하기)을 상호 호출함으로써 프로그램을 구성하는 방식을 말한다. 이 때 각 객체에 포함된 데이터는 '속성' 또는 '필드'라 하고, 기능은 '메서드'라고 한다.
자바 소스 파일은 클래스의 외부 구성 요소와 내부 구성 요소로 나누어 생각할 수 있다.
클래스의 외부 구성 요소는 총 3가지이며, 다음 3가지만이 클래스의 외부에 올 수 있다.
- 패키지(package): 프로젝트를 생성할 때 패키지를 지정했다면 이 구성 요소에 패키지명이 포함되며, 반드시 주석을 제외하고 첫 번째 줄에 위치해야 한다. 클래스의 생성 과정에서 패키지를 생성하지 않았다면, 즉 디폴트 패키지를 사용하면 생략된다.
- 임포트(import): 다른 패키지의 클래스를 사용하고자 할 때 포함된다. 패키지 다음에 위치한다.
- 외부 클래스(external class): 클래스 외부에 또 다른 클래스가 포함될 수 있다. 즉, 1개의 .java 파일에 여러 개의 클래스가 포함될 수 있다. 단, 외부 클래스에는 public 키워드를 붙일 수 없다.
클래스의 내부 구성 요소는 총 4가지이며, 다음 4가지만이 클래스의 내부에 올 수 있다.
- 필드(field): 클래스의 특징(속성)을 나타내는 변수다.
- 메서드(method): 클래스가 지니고 있는 기능(함수)을 나타낸다.
- 생성자(constructor): 클래스의 객체를 생성하는 역할을 담당한다.
- 이너 클래스(inner class): 클래스의 내부에도 클래스가 포함될 수 있으며, 이 클래스를 '이너 클래스'라고 한다.
클래스는 직접 사용할 수 없다. 클래스의 모든 특징(필드)과 기능(메서드)들을 사용하려면 클래스를 이용해 객체를 만든 후 그 객체 속의 필드와 메서드 등을 사용해야 한다. 클래스의 생성자로 객체를 만드는 과정을 '인스턴스화(instantiation)'라고 하고, 인스턴스화로 만들어진 객체를 '인스턴스(instance)'라고 한다. 객체 속에는 클래스의 내부 구성 요소 중 생성자를 제외한 나머지 요소가 포함돼있는데, 이를 '인스턴스 멤버(instance member)'라고 한다.
그렇다면 클래스로 객체를 생성했을 때 메모리에는 어떻게 저장될까?
A a = new A();
클래스 A는 메모리의 클래스 영역에 들어가고 참조 변수 a는 스택 영역에 들어가면서 실제 데이터(객체)의 위칫값을 저장한다. 생성자로 만들어진 객체는 힙 메모리에 위치하며, 객체 내부에는 클래스의 멤버(필드, 메서드, 이너 클래스)가 위치한다.
그런데 메서드를 살펴보면, 실제 메서드 구현 코드는 클래스 영역 안에 저장해 놓고, 객체 안에서는 메서드 영역의 위치만 가리키고 있다는 것을 알 수 있다. 왜냐하면 1개의 클래스로 만든 모든 객체는 속성(필드)은 달라도 기능(메서드)은 동일하기 때문이다.
Reference
- 자바 완전 정복 | 김동형 지음
댓글