[소.자.바] 3장. The Class(21 ~ 23, 완료)

2019. 11. 14. 13:49더 쉽게 쓴 자바(소.자.바)19.11.07

* 본 블로그는 개인 공부용으로 해당 내용은 자북의 '최영관'님이 저자이신 소설같은 자바를 읽고 정리한 내용으로써 문제가 있을 시 모두 내리도록 하겠습니다.

 

클래스의 개념을 파악하기 위한 기초적인 작업을 1장과 2장에서 다루어 보았다.

 

 그래서 이 장에서는 클래스 그 자체에 초점을 맞추어 알아보고자 한다.

일반적인 클래스의 설명은 은폐성, 상속성, 다형성의 관점에서 이루어지고 있지만 이 책에서는 다른 시각으로 클래스를 접근하려 한다.

 

 클래스는 근원적으로 객체지향의 개념을 그대로 내포하고 있기 때문에 오히려 철학적인 면이 상당 부분 포함되어 있다. 그렇기 때문에 개념적인 접근없이 프로그램 코드만 짜다보면 오히려 클래스 디자인 차원에서 많은 어려움을 겪게(경험하게) 된다. 아무래도, 이미 이것을 경험하신 분들이 이 책을 본다면 좀 더 만족스러운 결과를 얻을 수 있을 것이고, 처음으로 접하는 분들에게는 (어떠한 혼선 없이)  혼선을 빚지 않고 자바를 배울 수 있는 기회가 되지 않을까 한다.

 

 클래스는 데이터 타입 생성기(데이터 타입을 생성하는 그 무엇)이다. 보통 여러분이 클래스를 생성한다면 그 클래스를 우리는 사용자 정의 데이터 타입이라고 한다. 이것을 자바에서는 그저 클래스라 칭하고 있지만 정확한 표현은 사용자 정의 데이터 타입이다. 이 사용자 정의 데이터 타입은 C++, Visual C++, J++, C#에 이르기까지 다양한 분야에 적용이 가능하다.

또한 제대로만 알아 둔다면 여타 언어를 배우는데 상당한 도움을 얻을 수 있을 것이다.

 

이 장에서 소개하는 내용들은 다음과 같다.

 

■ 프로그램의 기초

■ 접근제어

■ 메소드란?

■ 메소드의 매개변수

■ 메소드의 클래스 삽입

■ 메소드와 접근제어

■ private의 진정한 의미

■ 메모리 관점에서 객체의 생성

 

 위와 같은 관점에서 객체를 바라보는 것은 많은 설명을 필요로 하지만, 몇 줄의 소스를 배우는 것보다도, 이와 같은 것들이 앞으로 프로그래밍을 하는데 있어 상당한 도움이 되리라 생각한다. 자! 그렇다면 이제부터 클래스가 무엇인지 한번 탐험해 보도록 하자.

 

3.1 프로그램의 기초

 

3.1.1 객체의 용어

 

 용어적인 차원에서 변수, 객체, 인스턴스(instance)라는 말들을 여러 책에서 사용하고 있다. 이러한 용어는 그 나름대로의 뜻을 내포하고 있기 마련인데, 어떤 부분에서는 사람들이 이 뜻을 헷갈려하기도 한다. 그러므로, 이것 때문에 혼동되는 요소들이 있다면 당연히 제거해 버려야 한다.

 

 그럼 이제부터 변수, 객체 그리고 인스턴스라는 용어에 대해서 알아보고 그에 관련된 지식들을 습득해 보도록 하겠다.

 

3.1.2. 변수, 객체, instance의 구분

 

 일반적으로 클래스로 만든 데이터 타입이든지 기본 데이터 타입이든지 간에, 데이터 타입으로 만든 이름은 모두 변수라고 부를 수 있다. 기본 데이터 타입은 변수의 이름을 선언함과 동시에 메모리가 할당되지만 클래스는 그렇지 않다.

 

 2장에서 이미 언급한 것과 같이 클래스는 변수의 이름과 변수에 대한 메모리의 할당이 분리되어 있다. 2장의 5절을 한번 복습해보자. 클래스를 선언하고 메모리를 할당하는 부분인 "PERSON brother = new PERSON()"을 아래와 같이 분해할 수 있다고 배웠다.

 

- 21 -

 

 * 자바 클래스 데이터 타입의 변수 선언과 메모리 할당

■ PERSON   : 클래스로 생성한 데이터 타입

brother    : PERSON 데이터 타입으로 선언한 변수

■ new        : 메모리를 생성하는 연산자

■ PERSON() : 메모리 생성 후 초기화 작업을 담당하는 생성자

 

1. "PERSON brother = new PERSON()"은 한 줄이지만 이것을 두 줄로 만들어보면

 

2.  PERERSON brother;

                   brother = new PERSON(); 

 

 이렇게 두 줄의 코드로 나누어 사용할 수 있다. 한 줄로 사용하나 두 줄로 사용하나 그 결과는 같다.

하지만 "PERSON brother;"은 변수의 이름을 선언한다는 의미를 지니고 있고 "brother = new PERSON();은 만들어져 있는 이름에 메모리를 할당한다는의미가 부여되어 있다. 이렇게 본다면 변수의 선언과 메모리의 할당은 완전히 분리되어 있다. 하지만 메모리가 있거나 없거나 우리는 이것을 변수라고 부른다. 정확하게 표현한다면 메모리가 없는 변수와 메모리가 있는 변수라고 말할 수 있다.

 

 *  클래스의 변수의 종류

메모리가 있는 변수

■ 메모리가 없는 변수

 

 예를 들어보자. 아기를 낳기 전 보통의 경우, 부모는 아기의 이름을 지어둔다. 그리고 만약 아기가 태어나면 당연한 수순으로 만들어 둔 이름을 부여하게 될 것이다. 이렇게 되면 아기가 태어난 후의 이름은 태어나기 전과는 달리 진정한 의미를 갖게 된다. 이름은 있지만 아기가 태어나고 태어나지 않고는 엄연히 다른 것이다. 이러한 면에서 따지고 보면 변수도 메모리가 생성되기 전의 변수와 메모리가 생성된 후의 변수로 구분 지을 수 있다.

 

 기본 데이터 타입으로 무언가를 선언하면(= 변수를 만들면)  이를 변수라고 하는데, 이와 마찬가지로, 클래스로 만든(= 클래스로 생성한) 새로운 데이터 타입으로 무언가를 생성해도(= 변수를 만들어도) 우리는 이를  변수라고 한다. 물론 메모리 생성에 있어서의 문제는 남아있지만 일단 변수는 변수인 것이다. 그리고 새로운 데이터 타입으로 생성되어진 변수는 객체라고도 부른다.

이렇듯 객체도 변수의 한 형태이며, 클래스에서 만들어졌다하여 객체라고 불리운다. 

 

 객체도 당연히 변수처럼 객체의 선언과 객체의 메모리 할당에 있어서의 문제는 남아있다. 그래서 객체의 이름만 선언한다면 객체변수의 선언이라고 말하며 new 연산자를 이용하여 메모리까지 생성하였다면 객체의 생성이라고 한다. 그리고 객체가 메모리를 생성하였다면 instance가 하나 만들어졌다고 말할 수 있다. 

- 22 -

 

 * 객체변수, 객체, instance

■ 객체변수 선언                    : PERSON brother;

■ 메모리 생성, instance 생성   : brother             = new PERSON();

■ 동시에 객체변수 선언과 생성 : PERSON brother = new PERSON();

 

* new 연산자를 이용하여 메모리를 생성하였다면 우리는 instance를 생성하였다고 한다. PERSON brother;와 같이만 한다면 brother는 null 값을 갖게 된다. 메모리(의) 할당이 되지 않았다는 것이다. '형'(=모양)과 '이름'만 있지 아무것도 아니라는 이야기다.

 

3.1.3. 결론

 

 객체에 있어 메모리를 가지고 있느냐 가지고 있지 않느냐는 아주 중요한 문제로, 만약 우리가 메모리와 변수의 이름을 함께 생성하였다면 instance를 만들었다고 할 수 있다. 거의 대부분의 번역 서적들은 이것을 거의 동일 시 하고 사용하고 있지만 의미상의 차이는 분명히 존재하는 것이다. 이렇게 어감적인 면에서의 차이는 바로 여기 '메모리가 존재하느냐 하지 않느냐'의 차이에서 아주 두드러지게 나타나게 된다.

그렇기에 지금 이 글을 읽는 분들은 어느 정도 변수와 객체 그리고 instance의 어감적인 차이를 이해 하셨으리라 생각한다.

다음으로, 자바를 배울 때 중요하면서도 약간은 무시당하는 접근제어에 대하여 알아보도록 하자.

 

- 23 -