[Java] 클래스와 객체의 개념

윤여준·2023년 8월 2일
0

자바[Java]

목록 보기
2/4

이번 글에서는 클래스와 객체의 개념적인 부분을 다룬다. 클래스와 객체의 정의부터 시작하자.

클래스와 객체의 정의

자바 공식 문서에서는 클래스를 뭐라고 정의하고 있을까?

class is the blueprint from which individual objects are created. (클래스는 개별 객체가 생성되는 설계도이다.)
출처 : https://docs.oracle.com/javase/tutorial/java/concepts/class.html

자바 튜토리얼 문서에서는 클래스를 설계도라고 정의하고 있다.

설계도가 있다면, 그 설계도를 이용해서 무언가를 만들 수 있을 것이다. 클래스라는 설계도를 이용해 객체(object)라는 것을 만드는 것으로 이해할 수 있다.

그렇다면 자바에서 객체는 무엇일까?

An object is a class instance or an array. (객체는 클래스 인스턴스 또는 배열이다.)
출처 : https://docs.oracle.com/javase/specs/jls/se20/html/jls-4.html#jls-4.3.1

즉, 객체는 둘 중 하나다. 클래스 인스턴스이거나 배열이다.

배열은 이전에 작성한 글이 있으니 배열에 대해서 잘 모른다면 참고 바란다. (https://velog.io/@yyj8771/자바Java-배열Array)

그렇다면 클래스 인스턴스는 무엇일까? 인스턴스는 객체와 비슷한 개념이기 때문에 다음 절에서 객체와의 비교와 함께 서술하겠다.

객체 Vs 인스턴스

인스턴스의 정의도 자바 공식 문서나 공신력 있는 문서에서 찾으려고 하였으나 나의 검색 능력의 한계로 인해 찾지 못하였다. 대신 내가 현재 읽고 있는 책인 자바의 정석을 참고해서 작성하도록 하겠다.

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
출처: 자바의 정석 3판 232p

위의 정의를 읽어보면 객체 중에서도 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 함을 알 수 있다.

객체는 클래스 인스턴스와 배열을 모두 포함하는 포괄적인 의미를 갖고 있고, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 가지고 있다고 볼 수 있다.

객체의 구성요소

자바 튜토리얼 문서에서는 객체의 구성 요소를 다음과 같이 서술하고 있다.

Software objects are conceptually similar to real-world objects: they too consist of state and related behavior. An object stores its state in fields (variables in some programming languages) and exposes its behavior through methods (functions in some programming languages)
[소프트웨어 객체는 개념적으로 실제 객체와 유사하다. 소프트웨어 객체도 상태 및 관련 동작으로 구성된다. 객체는 필드(일부 프로그래밍 언어의 변수)에 상태를 저장하고 메서드(일부 프로그래밍 언어의 함수)를 통해 동작을 노출한다.]
출처 : https://docs.oracle.com/javase/tutorial/java/concepts/object.html

위의 내용을 정리해보자.

객체는 상태(state)와 동작(behavior)으로 구성된다. 객체의 상태는 변수에 저장되고, 객체의 동작은 함수를 통해 노출된다. 즉, 객체는 상태와 동작의 집합이라고 볼 수 있을 것이다.

자바의 정석에서는 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원, member)라고 정의하고 있다.

또한 자바의 정석에서는 다음 용어들이 모두 같은 뜻이라고 한다.

상태(state) = 속성(property) = 멤버변수(member variable) = 특성(attribute) = 필드(field)

동작(behavior) = 기능(function) = 메서드(method) = 함수(function)

TV를 예로 들어보겠다. TV라는 객체의 상태와 동작은 다음과 같다.

속성크기, 길이, 높이, 색상, 볼륨, 채널 등
기능켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기

아까 위에서 본 것처럼 속성은 변수로, 기능은 메서드로 표현할 수 있다.

따라서 위의 표를 토대로 TV 클래스를 만들어보면 다음과 같다.

class Tv {
	String color; // 색깔
	boolean power; // 전원상태
	int channel; // 채널

	void power() { power = !power; }
	void channelUp() { channel++; }
	void channelDown() { channel--; }
}

클래스 인스턴스의 생성과 사용

Tv 클래스를 선언한 것만으로는 Tv를 사용할 수 없다. 앞서 다룬 클래스의 정의에 의하면 클래스는 설계도에 불과하기 때문이다. 설계도를 바탕으로 실제 객체를 만들어야 클래스가 설계한 것을 실제로 사용할 수 있다.

클래스 인스턴스는 명시적으로 생성될 수도 있고, 암묵적으로 생성될 수도 있다.

암묵적으로 생성되는 경우는 다음 링크를 참고하면 된다. https://docs.oracle.com/javase/specs/jls/se20/html/jls-12.html#jls-12.5

이 글에서는 명시적으로 생성하는 방법만 다룬다.

클래스 인스턴스를 명시적으로 생성하는 방법은 일반적으로 다음과 같다.

클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t; // Tv 클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv 인스턴스를 생성한 후, 생성된 Tv 인스턴스의 주소를 t에 저장

여기서 Tv 클래스는 위에서 정의한 Tv 클래스이다.

코드 설명은 다음과 같다.

  1. Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.
  2. 연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 이 때, 각 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
  3. 생성된 객체의 주소값이 대입 연산자 =에 의해 참조변수 t에 저장된다. 이제 참조변수 t를 통해 Tv 인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.

위 코드를 요약하면 다음과 같다.

  1. 클래스를 선언한다.
  2. 해당 클래스 인스턴스를 담을 수 있는 타입의 참조 변수를 선언한다.
  3. 선언한 참조변수에 클래스 인스턴스의 주소값을 대입한다.

클래스 인스턴스는 참조 변수를 통해서만 다룰 수 있다는 사실을 기억하자.

참고자료

profile
Junior Backend Engineer

0개의 댓글