본문 바로가기

프로그래밍 언어/Java

[자바의 정석] (Ch6. 객체지향개념) 클래스의 정의

클래스의 정의: 데이터 + 함수

클래스의 간단한 정의는, 보는 관점에 따라 3가지로 설명할 수 있다.

  • 설계도
  • 데이터 + 함수
  • 사용자 정의 타입

앞서서 클래스는 설계도라고 했다. 그러나 그 외에도 다른 관점에서 보면, 클래스를 데이터와 함수의 결합이라고 볼 수도 있다.

(혹은 사용자 정의 타입이라고도 할 수 있다.)

 

아래는 데이터와 저장 공간의 발전 단계이다.

배열은 같은 타입의 변수밖에 저장할 수 없다는 한계가 있다.

이를 보완하여 서로 관계가 있는 다른 타입의 변수도 함께 저장할 수 있는 구조체가 생겼다.

 

이 구조체에서 더 발전한 것이 클래스이다.

구조체까지는 변수만 담을 수 있었지만, 클래스에는 변수와 함수를 함께 저장할 수 있다.

'관련있는 다양한 데이터를 담는 것을 넘어서 이 데이터를 가지고 작업할 때 필요한 함수를 함께 묶어놓자!'는 것이다.

 

클래스의 정의: 사용자 정의 타입

사용자 정의 타입은 말 그대로 우리가 정의한 타입을 말한다.

자바에서는 우리가 원한다면, 우리가 원하는 타입을 직접 만들 수 있다.

 

만약 단순 정수, 실수가 아닌 '시간' 이라는 대상을 표현하고 저장할 필요가 있다고 하자.

// 시, 분, 초를 저장하는 int 타입 변수 선언
int hour;
int minute;
int second; 

이처럼 시, 분, 초를 저장하는 int 타입 변수를 선언하는 것도 괜찮겠지?

 

근데 만약 저장해야 하는 시간이 3개라면 어떻게 해야할까?

int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3; 

방식을 그대로 유지한다면, 이렇게 3개를 만들어야할 것이다.   

 

그러나 만약 3개 이상의 n개라면?

int[] hour = new int[n];
int[] minute = new int[n];
int[] second = new int[n];

이번에는 조금 더 머리를 써서 배열을 만들었다.

 

근데 ‘시간’ 이라고 하면 시, 분, 초가 한 세트인데 이건 다 따로따로 저장되어 있잖아?

뭔가 활용성 측면에서 적합하지가 않은 느낌이다. 

 

만약, 시간 저장만을 목적으로 하는 타입의 객체가 있다면 어떨까?

우리는 이를 직접 정의해볼 수 있다. 

(사실 자바에는 시간을 제공하는 클래스가 있음.. 그러나 일단 패스)

class Time {
	int hour;
	int minute;
	int second;
}

3개의 변수를 묶어서 Time이라는 클래스를 정의했다.

그럼 위에서처럼 시, 분, 초를 각각 선언하지 않고, 아래와 같이 하나의 객체로 대신할 수 있다.

Time t = new Time();

 

Time 클래스를 정의해줌으로써, 코드가 가운데 블록 -> 오른쪽 블록들로 바뀐다. 보다 간결하고 명확해졌다. 

 

구조적 차이를 보자.

참조변수가 각각 3개냐 1개냐의 차이는 있지만 결국 저장공간은 동일하다.

다만 하나의 참조변수로 컨트롤할 수 있고, 목적에 따라 잘 묶여있어 더 객체지향적이라고 할 수 있다.