객체 지향 언어인 자바를 시작하면서 제일 먼저 접하게 되는 것은 바로 객체와 클래스라는 단어이다. 이 두 단어는 객체지향언어의 기본이며 가장 중요한 부분이기 때문에 올바른 클래스의 배경 지식 없이 접하게 된다면 자바는 점점 어려워진다.
먼저, 클래스의 개념을 파악하기 위해서는 데이터타입, 변수, 상수의 의미를 제대로 아는 것이 중요하다. 그리고 변수와 상수의 관계에서 나타나는 할당의 법칙을 이해함으로서 각각의 관계에 대하여 안다면 우리는 언어적인 기초를 가지고 있다고 할 수 있다. 이러한 면에서 지금부터 하는 내용은 아주 기초적인 사항들이다. 그 기초적인 개념들은 아래와 같다.
    - 데이터 타입
    - 변수
    - 상수
    - 할당의 법칙
각각의 내용들은 클래스의 개념 이해를 돕기 위한 언어적인 기초를 설명하고 있으며 이들을 이용해서 클래스와 객체라는 단어에 점차적으로 접근하고 있다. 클래스라는 것은 새롭게 탄생된 것이 아니라 기존 언어를 바탕으로 하여 보다 효율적인 방법론을 제시하고 있기 때문에 컴퓨터 언어의 배경지식을 습득한다면 클래스의 개념을 보다 효율적으로 이해할 수 있다.
어떻게 보면, 이것은 모든 컴퓨터 언어 설명서에서 가장 정확하게 설명하려고 하는 부분이다. 하지만 정확한 뜻을 파악하기 힘든 것은 언어적인 배경에 대하여 약간은 등한시하는 분위기가 있고, 이미 알고 있다는 전제 하에 설명이 이루어지고 있기 때문이다. 그래서 클래스라는 단어가 컴퓨터 언어에서 어떻게 만들어졌는지 밑바닥부터 따져 보고자 한다.


1 데이터 타입이란?

1.1 데이터 타입의 의미?

데이터 타입이란 자료의 형태를 의미한다. 현실 세계에 존재하는 모든 데이터들은 그 나름대로 의미가 있고 어느 정도 사람이 알 수 있는 구분이 있다. 이러한 실세계의 데이터들이 컴퓨터에 사용될 때에는 더 명확하게 구분된다. 데이터의 형태들이 모호하면 컴퓨터가 헷갈리기 때문이다. 데이터를 분류하는 방법이란 것은 컴퓨터 언어에 정의되어 있으며, 그 분류 원칙에 따라 데이터를 사용하게 된다. 컴퓨터 내에 데이터를 구분하는 방법을 제시해 주고 있는 것이 바로 데이터 타입이다. 그래서 데이터 타입을 자료에 대한 형태를 지정해주는 것이라고 부를 수 있으며, 영어 철자 그대로 Data Type이라고 부른다.


기본적인 데이터 타입들은 언어의 컴파일러를 만든 사람들이 구분 짓고 있다. 기본적인 구분은 수와 문자의 분류이며 수는 정수와 실수로 구분되고, 정수는 작은 수와 큰 수 그리고 실수는 정밀한 실수와 덜 정밀한 실수로 나누고 있다. 이러한 구분은 일반적으로 컴퓨터 내에서 하나의 데이터를 표현하기 위해서 어느 정도의 메모리를 사용하고 있느냐에 따라 분류된다. 그리고 각각의 구분법은 이미 언어 내에 정의되어 있으며 우리는 그 규칙을 지키면서 사용하여야 하다. 그렇다면 데이터 타입이 어떠한 역할을 하는지 정확하게 따져 보자.

1.2 데이터 타입의 역할

데이터라는 관점에서 두 가지 분류를 할 수 있다. 즉, 다음과 같이 데이터를 구분 짓는 데이터 타입과 데이터 자체로 나눌 수 있다.
    - 데이터 타입
    - 데이터
자바에서 사용되는 데이터 타입은 수를 표현하는 int, long, float, double 등, 문자를 표현하기 위한 char 그리고 참과 거짓을 표현하기 위한 boolean이 있다. 이러한 데이터 타입을 사용하는 것은 그렇게 어렵지 않다. 단지 어떤 식으로 사용하느냐가 문제이다. 간단하게 정의를 내린다면, 데이터 타입은 데이터의 형태가 이렇다고만 지정할 뿐 그 자체를 사용하는 것은 아니다. int 자체를 사용할 수는 없다. 데이터 타입은 저 혼자서 아무 일도 할 수 없다.
데이터는 보통 우리가 말하는 정보 그 자체이다. 예를 들어, 3은 데이터이다. 그리고 ‘a‘라는 문자 또한 데이터이다. 이러한 데이터를 구분 짓는 것이 바로 데이터 타입이다.
데이터타입의 쓰임새와 데이터의 관계는 다음과 같다.
    - 변수에 데이터의 형태를 지정한다.
    - 데이터 타입은 변수를 만드는 역할을 한다.
    - 데이터 타입이 지정되어진 변수에는 데이터를 넣을 수 있다.
데이터 타입은 모양만을 지정하기 때문에 데이터 타입 스스로 아무 일도 할 수 없다. 말 그대로 형태만 있을 뿐 보이지도 않고 스스로 존재할 수도 없는 아주 불쌍한 놈이다. 일단, 자바에서 사용되는 데이터 타입이 어떤 것이 있는가를 보고 넘어가자. 자바 언어에서 사용하는 대표적인 데이터 타입은 다음과 같다.

 

 정수형

실수형 

 문자형

 논리형

데이터 타입

int

long

float

double

char

boolean

데이터

0

0L

0.0f

0.0d

'a'

false

byte 수

4

8

4

8

2

1

이 이외에도 약간씩 변형된 기본 자료형이 몇 가지 더 존재한다. 위의 표에서 알 수 있듯이 데이터 타입은 데이터의 분류법이다. 그런데, 이상하게도 각각의 데이터 타입에 "byte 수"라는 것을 표시하고 있다. 이 의미는 “데이터 타입은 변수에 데이터의 형태를 지정한다. 데이터 타입은 변수를 만드는 역할을 한다”라고 말한 부분과 관련이 있다. 하나의 변수를 만드는데 그냥 만들 수는 없다. 즉, 컴퓨터내에 사용할 변수를 만드는데 그 변수에 어떠한 데이터가 들어 갈 수 있는지는 명시해야 하지 않을까 그래서 변수를 만들 때 어떠한 데이터가 들어가며 ? 메모리는 몇 바이트나 차지하는지를 명시해주는 것이다. 메모리를 차지하는 바이트 수는 데이터 타입에 따라 다르게 지정된다.
데이터 타입은 형태이기 때문에 모양만을 가지고 있다. 실제 사용하기 위해서는 다른 방법을 사용한다. 이미 설명했듯이 변수라는 것을 사용한다. 컴퓨터의 메모리 속에서 형태 그 자체만으로는 아무런 의미가 없다. 형태에 이름을 부여한다면 컴퓨터의 메모리 속에서 특정한 형태의 메모리가 생성되며 이 메모리를 가르키는 이름이 바로 변수가 된다. 그래서 데이터 타입은 변수를 만드는 일을 한다고 한 것이다.
정리를 해 보자. 데이터 타입은 형태만을 나타낼 뿐 메모리 속에서는 존재할 수 없다. 존재할 수 없다는 것은 답답한 일인데 이것을 존재하게 만들 수 있도록 만드는 방법은 바로 변수라는 것을 만들어 존재하게 한다. 이름을 주는 것이다. 데이터 타입이 하는 일은 바로 변수를 생성하는 일이다. 어떠한 모양의 변수를 만들지를 결정하는 것이 바로 데이터 타입을 결정하는 일이다. 아래의 예제에서 int a라고 한 부분에서, int는 데이터 타입이 된다. 그리고 a는 변수이다. 이렇게 하면, int 모양의 메모리를 가진 a라는 이름의 변수가 생성되어지고 이제부터 a에는 int 모양의 값을 넣을 수 있다. 데이터 타입에 관련된 간단한 예제를 하나 살펴보자.

1.3 Test.java
변수의 개념을 설명하기 위한 예제

    public class Test1{
        public static void main(String[] args) {
            int a = 1; // int type의 a 변수선언
            int b = 2; // int type의 b 변수선언
            int c = a + b; // int type의 c 변수선언
            System.out.println("a b 의 합은 : " + c); // c의 결과 출력
        }
    }

   이 예제를 컴파일 후 실행하면 다음과 같은 결과가 나올 것이다.

   a b 의 합은 : 3

이 예제는 데이터 타입이 존재하는 방식을 증명해 주고 있다. a, b, c는 int 형태의 데이터 타입이며 a, b, c라는 이름으로 메모리에 존재하게 되는 것이다. 이것은 아주 간단해 보이지만, 데이터 타입을 사용하는 방법을 잘 보여 준다. 먼저 변수 이름을 정하기 전에 타입을 명시해 준 후 개별적인 이름을 부여하고 있다. 이름은 어떻게 부여하느냐? 사소한 규칙 몇 가지만 지킨다면 이것을 만드는 사람 임의로 만들 수 있다. 그리고 int a라고 한다면, int 타입의 4바이트의 메모리가 a라는 이름으로 생성이 되었다는 것을 의미한다. 그리고 다시 b, c라고 했기 때문에 전체 12바이트의 메모리를 할당한것이다.

1.4 결론
결론적으로 데이터 타입 변수 데이터의 관계는 필연적인 관계이다. 데이터 타입은 변수를 생성하는일이다. 변수를 생성할 때 데이터 타입은 어떠한 형태의 변수를 지정할 지, 몇 바이트나 되는 메모리를 할당할 지를 결정하는 역할을 한다. 그리고 만들어진 변수에는 데이터를 넣는다.
데이터 타입에 대해서 자세하게 설명을 붙이는 이유는 다른데 있다. 지금까지는 만들어져 있는 데이터 타입만을 사용했다. 그런데, C++이후의 언어에서는 우리가 직접 만든 데이터 타입을 사용하게 된다. 이것을 사용자 정의 데이터 타입이라 부르며 자바에서는 클래스라고 부른다.
자바 프로그래머를 시작하는 대부분의 사람들이 데이터 타입의 역할을 이해 못하고 있고, 데이터 타입을 제대로 이해한다고 해도 많은 혼선을 경험하고 있기 때문에 데이터 타입에 대하여 정확한 설명을 붙이고 있다. 참고적으로, 이 데이터 타입의 의미는 모든 언어에 공통적으로 사용되는 아주 기본적인 사항이다. 이것만을 알고 들어가도 자바는 쉬워진다.


2 변수

2.1 변수란?
변수란 데이터를 담을 수 있는 그릇이다. 데이터 타입이 변수를 만든다면 변수는 그 속에 데이터 타입에 명시된 형태의 데이터를 담을 수 있다. 데이터 타입으로 변수를 만든다는 것은 메모리 속에 데이터 타입에서 명시한 모양의 메모리를 생성할 수 있다. 그리고는 그 메모리에 어떠한 데이터를 넣는데, 그 데이터는 데이터 타입에 명시된 데이터라야 된다는 것이다. 이것을 정리하면
    - 데이터 타입이 변수를 만들 수 있다.(변수 생성)
    - 변수가 만들어진다는 것은 메모리 생성의 의미이다. (변수 생성 = 메모리 생성)
    - 생성된 변수에는 해당 데이터 타입의 데이터를 넣을 수 있다.(할당)

이러한 방식으로 데이터, 데이터 타입의 중간자 역할을 하는 변수 그리고 데이터 타입으로 세분화시켜 볼 수 있다.

2.2 변수의 존재
변수는 데이터타입 없이는 홀로 존재할 수 없다. 즉, 데이터타입이 자신(변수)의 형태를 지정해 주기 때문에 존재하는 것이다. 이것은 반드시 지켜져야 되는 규칙이며, 이 규칙을 깨는 법은 절대 용납되어서는 안 된다고 생각하면 된다. 데이터타입의 허락을 얻어야만 하나의 변수로서 역할을 할 수 있으며, 변수는 메모리에 존재의 의미를 그대로 담고 있다. 데이터타입은 홀로 메모리를 생성 할 수 없는 불쌍한 놈이다. 자신이 존재하기 위해서는 변수라는 것을 통해서 자신의 형태를 존재하게 하는것이다.
철학적으로 정리를 해 보자. 데이터타입은 모양만을 가지고 있는 무존재이며, 변수는 데이터타입을 정해주면 메모리에 존재할 수 있는 존재의 의미를 담고 있다. 이것을 잊어버리면 거의 프로그램을 만든다는 의미는 없다고 봐도 과언이 아니다. 보통의 변수가 존재하는 법은 다음과 같다.

2.3 변수의 생성
    int x;
    int a, b;
    long z;
앞에서 언급한 것과 같이 데이터타입 변수명 의 “ “ 형식을 따르게 된다. 이러한 방식으로 데이터 타입과 변수를 사용하는 것이다. 한번 더 밝혀 두지만, 데이터타입 혼자서만은 아무 것도 할 수 없으며 변수가 존재하기 위해서는 반드시 데이터 타입을 지정해야만 한다. 이것은 불변의 규칙이다.

2.4 결론
변수를 만드는 이유는 데이터를 보관하기 위해서 이다. 데이터 타입으로 변수를 만들며, 변수는 데이터를 담을 수 있는 그릇의 역할을 하다. 변수에 아무 것도 넣지 않으면 필요가 없다. 그렇다면 뭔가를 변수에 넣어야 변수의 역할을 하게 된다. 데이터 타입은 단순히 해당하는 형태의 메모리를 생성할 뿐 더 이상의 일은 하지 않고, 변수는 데이터를 보관할 수 있는 일을 한다. 여기에 들어가는 데이터는 반드시 변수를 만들 때 명시한 데이터 타입에 맞는 데이터의 형을 넣어야 한다는 것이 핵심이다.
변수는 데이터타입의 주어진 형태대로 메모리를 생성한 후 컴퓨터 내에 존재하며, 변수가 생성 된 후에는 주어진 형태에 맞는 데이터를 넣을 수 있다. 그리고 변수를 아무리 많이 만들어도 어떠한 데이터를 넣지 않으면 필요가 없다. 이 데이터는 변수를 만들 때 사용한 데이터타입에 맞는 형의 데이터를 넣어야만 한다는 것은 모든 언어의 아주 기본적인 특징이다. 계속해서, 우리는 변수에 들어가는 데이터이라는 측면과 특정 데이터를 변수에 넣는 방법이라는 측면에서 상수와 할당이라는 것에 대해 자세히 알아보자.

3 상수

1.3.1 상수란?
상수는 그 자체가 데이터라는 것을 의미한다. 다른 말로 하면 상수는 항상 수, 항상 데이터라고 할 수 있다. 변수의 의미는 데이터를 보관하는 일이지만 데이터 그 자체를 말할 때 우리는 상수라는 단어를 사용한다. 상수가 데이터라고 한다면 당연히 자료의 구분 즉, 데이터 타입의 분류가 있다. 모든
자료는 데이터 타입의 관점에서 분류할 수 있으며 분류에 따른 표현법도 있다. 이러한 분류법과 표현법에 따라서 해당 데이터 타입에 관련된 각각의 상수들이 존재한다. 물론 이렇게 세분화시켜서 분류하는 이유는 바로 보다 인간보다 컴퓨터가 더 까다롭기 때문이다. 컴퓨터는 정확하게 가르쳐주지 않으면 모르는 바보이다.

3.2 상수의 분류와 표현
자료의 데이터 타입에 따른 분류와 표현은 아주 간단하다. 앞에서 배운 데이터 타입, 그 자체가 분류가 되며 그 분류에 따라서 표현되어지는 방법이 다르다. 이것을 구분 지어보면 다음과 같다.

데이터의 분류와 표현법

 

정수형

실수형

문자형

논리형

데이터타입

int

long

float

double

char

boolean

byte 수

4

8

4

8

2

1

표현법

0, 100

100L

0.0f

0.0d

'a', 'c'

false, true

 * float d = 0.0f; // f를 붙이지 않으면 디폴트로 double이 된다.

변수에 할당하는 상수의 표현
    - int : 10진수로 표현
    - char : 작은 따옴표로 묶는다.
    - long : 숫자 뒤에 l(영문자L)을 붙인다.
    - float : 숫자 뒤에 f를 붙인다.
    - double : 숫자 뒤에 d를 붙인다.
* int형과 long형 모두 1이라는 숫자를 포함하고 있다. 이러한 구분을 하기 위해서 상수 뒤에 형에 맞는 문자를 붙이게 된다. float형과 double형도 같은 원리에 의해서 구분된다.

위의 표에서와 같은 표현법을 사용해서 상수를 표시하고 그 상수를 적절한 데이터형에 맞는 변수에 넣어야만 프로그램 언어에서 컴파일할 때 에러가 나지 않는다. 이 형에 대한 컴파일러의 점검은 아주 엄격하며, 이 규칙을 무시하고 사용했을 때는 컴파일러는 언제나 그런 것처럼 무차별적으로 에러를 발생시킨다.
‘a’, ‘b’, ‘A’, ‘B’ 등의 아스키코드와 1, 100, 200등의 정수 그리고 0.01f와 같은 실수는 프로그램 상에서 인식할 수 있는 상수이다. 이러한 상수의 개념은 이미 만들어져 있는, 우리가 바꿀 수도 없다는 의미에서 상수라고 부르기도 한다.
상수의 진정한 의미에 대해 한번 생각 해 보고 넘어가자. 상수는 그 자체가 수이며 내가 만든 것이 아니라 이미 만들어져 있는 것이다. 이미 만들어져 있는 것이라는 의미는 내가 만든 것이 아니며 내가 바꿀 수도 없는 것이라고 생각하면 된다. “100은 내가 만든 것이 아니며, 이미 존재하는 것이며,
내가 바꿀 수 없다”라는 말은 참이다. 일반적으로 우리가 알고 있으며 바꿀 수 없는 그러한 데이터를 상수라고 한다.
컴퓨터의 컴파일러는 이미 이러한 상수의 개념을 가지고 있다. 당연히 1, 2, 3, 100, 1000, 같은 수를
이미 알고 있으며 이것을 사용하여 계산을 한다. 즉 상수는 그 자체가 데이터의 의미를 담고 있으며 이 데이터는 바꿀 수 없는 진리의 데이터를 말한다.
상수의 느낌은 다음과 같다. “나무“라는 데이터가 있다. 물론, 이것은 스트링형의 데이터이다. 이제부터 “나무“를 “바보나무“라고 하겠다고 한다면, 어떻게 될까? 아마 현실세계에 이렇게 주장하고 다닌다면, 정말 바보 취급을 받을 것이다. 100이라는 숫자 형태의 데이터가 있다. 지금부터 100을 1000이라고 하겠다고 주장한다면 이 또한 같은 일이 발생한다. 결론적으로, 상수는 절대 바꿀 수 없으며, 그 자체로 데이터의 의미를 담고 있으며, 미리 우리가 알고 있는 진리라고 할 수 있다. 바로 이러한 면이 상수의 느낌이다.
앞에서 이미 언급했지만 데이터 타입은 무 존재로서 결코 혼자서는 존재할 수 없으며 이것이 존재하는 방식은 변수의 방식으로 존재하게 된다 이 존재의 . 공간에 담을 수 있는 데이터를 우리는 상수라고 부르며 상수 자체는 이미 존재하고 있는 실존의 의미를 담고 있다. 이러한 원리를 아래의 표와
같다.

종류

 존재여부

데이터 타입

변수

상수

 무 존재

존재

실존

컴퓨터 언어를 배우면서 이러한 아주 단순한 원리를 거의 무시하기 때문에 처음 접하는 이들이 당황하고 결코 쉽게 느낄 수 없을지도 모른다.

3.3 결론
데이터 타입은 변수를 생성하여 존재하게 하고, 존재하는 변수의 빈 그릇에는 상수를 넣는 것, 이것을 다시 컴퓨터의 언어와 연결하여 나타내면 다음과 같다.

int a = 3; 에 대한 분류

종류

존재여부

예 

데이터 타입

변수

상수

무 존재

존재

실존

int

a

위의 표에 표시되어 있는 “int a = 3;“에서 우리는 데이터 타입과 변수, 상수의 사용을 정확하게 볼 수 있다. 데이터 타입 int라는 것으로 변수 x를 선언하였으며 x에는 3을 할당하고 있다.
이쯤에서, 우리는 변수와 상수사이의 또 다른 관계를 찾아 볼 수 있다. 변수에 데이터를 넣은 방법이라는 관점에서 본다면, 우리는 이것을 할당이라는 말을 사용한다.

4 할당의 법칙

4.1 할당이란
변수에 데이터를 넣는 것을 할당(assignment)이라고 한다. 할당의 법칙은 변수를 선언하고 난 후, 변수에 값을 넣는다라고 말할 수 있다. 이때 이용되는 연산자가 바로 “=“ 연산자이다. “=“ 연산자는 직접 할당의 의미를 가지고 있으며 이것은 변수에 값을 넣는다는 의미를 가지고 있지만 “=“ 자체에서 풍기는 맛은 바로 데이터 타입에 맞는 타입의 값을 할당해 달라는 의미를 가지고 있다.

4.2 할당의 기본 법칙
변수에 상수를 할당하는 방법론도 여러 가지 방식으로 가능하다. 이러한 방법을 알아보자.
가장 기본적인 방법론은 다음과 같다.
    - 오른쪽에서 왼쪽으로만 할당 가능하다.(절대적)
    - 변수끼리도 할당 가능하다.(오른쪽에서 왼쪽으로 할당)
    - 변수에 이미 상수가 존재하더라도 다른 것을 할당하면 마지막에 할당한 것이 할당된다.

우리는 쉽게 할당을 하지만 그 기본원리는 항상 있기 마련이다. 위의 규칙은 너무 단순하면서도 꼭 지켜지고 있는 규칙이다. 위의 규칙을 이용한 몇 가지 예를 살펴보자.

할당의 예
    - 선언과 할당을 동시에 : int a = 100
    - 선언과 할당을 분리 : int a; a=100
    - 여러 개를 동시에 선언과 할당 : int a=100, b=200;
    - 분리하여 여러 개를 동시에 선언과 할당 : int a, b; a=100, b=200;
    - 변수끼리의 할당 : int a=100, b; b=a;

위의 수식에서 우리는 지금까지 설명한 모든 것을 다 밝히고 있다. 선언하는 방법과 선언과 동시에 할당하는 방법 등.... 할당과 선언의 방법이 몇 가지 존재하지만 모두 같은 방식이며 일정한 규칙을 따르고 있다. 만약 다음과 같은 예를 본다면 할당의 완전한 법칙을 이해 할 수 있을 것이다.
할당의 기본 법칙의 예
    int sum = 100;
    sum = sum + 200 ;

위의 예에서 sum은 왼쪽과 오른쪽 모두 존재한다. 하지만 오른쪽에서 왼쪽으로 할당되기 때문에 “sum + 200“이 먼저 작업이 이루어진 뒤, 최종적으로 sum에 처리된 결과가 할당되는 것이다. 이러한 원리에 따라 처리하면 결과 값은 당연히 300으로 나오는 것을 짐작할 수 있을 것이다.

4.3 할당에 관련된 implementation
다음의 예제는 0부터 99까지의 합을 출력하는 프로그램이다. sum 변수와 i 변수의 역할을 지금까지 내용을 생각하며 관찰해 보자.
할당을 이해하기 위한 예제
    Test2.java
    public class Test2 {
        public static void main(String[] args) {
            int sum = 0;
            for (int i=0;i<100 ;i++ ) {
                sum = sum + i;
            }
            System.out.println("sum은 :" + sum);
        }
    }

sum은 :4950

4 마무리

데이터 타입(Datatype)이란 데이터에 대한 형태를 의미한다. 수많은 프로그래밍 도서등에서 같은 말을 반복하고 있지만 여전히 그냥 넘어가는 부분일지도 모른다. 데이터 타입, 변수, 상수의 관계를 확실히 이해한다면 자바 언어 자체를 편하게 이해 할 수 있을 것이다. 그 다음으로 변수와 상수에 대해 알아 보았으며, 마지막으로 변수와 상수의 관계에서 나타나는 할당이라는 것을 알아보았다.

이로써 클래스의 배경이 되는 몇 가지 기초 상식에 대해서 알아 보았다. 기초라고 해서 얕보기 쉬운데 약간의 자바 경험이 있다면 이 부분이 얼마나 무시하기 힘든 부분인지 정확하게 알게 될 것이다. 클래스의 배경에 대해서 설명하는 것은 클래스 그 자체를 설명하기 위해서는 데이터 타입과 변수, 상수, 할당의 개념을 반드시 이해해야 하는 내용이기 때문이다.

자바를 비롯하여 다른 어떤 언어를 시작한다고 해도 이 글과 다음 글에 있는 개념은 꼭 알려 주고 싶은 정보이다.

+ Recent posts