클래스의 배경이 되는 여러 가지 요소들을 클래스의 기본 배경에서 알아보았다. 데이터타입, 변수, 상수, 할당을 클래스라는 관점에서 어떠한 관련이 있는지를 알아보자. 그리고 클래스의 전신이라 할 수 있는 구조체가 어떻게 관련이 있는지에 대해서 알아보고 실제 클래스가 어떻게 만들어지고
어떻게 사용되어지는지 살펴보자.
이번 글에서 소개하는 내용은 다음과 같다.
    - 클래스란?
    - 구조체로 데이터 타입을 생성하는 방법
    - 클래스로 데이터 타입을 생성하는 방법
    - 클래스만의 특징
    - 클래스 변수를 생성하는 법의 차이

클래스와 객체의 의미는 혼동되는 요소들이다. 처음으로 객체와 클래스를 접했을 때, 이 개념을 이해 하는데 거의 1년 이상 걸린다고 하다. 프로그래머로서 가장 잘 다루어야 하는 부분이지만 너무나도 간단히 책장을 넘겨버리기 때문에 대충 넘어가기 쉬운 부분이기도 하다. 프로그램을 한참 배우고 난 후, 진정한 클래스의 의미에 대해 다시 생각해 볼 때쯤에 이해 할 법한 부분이다. 보통의 자바 Beginner의 경우, 이 개념을 안다면 자바의 절반이상을 깨닫고 있다고 해도 과언이 아니다. 이 장에서 설명되는 대부분의 것들은 앞장의 데이터 타입을 습득하지 않으면 거의 이해 할 수 없게 설명되어 있다. 앞장의 데이터 타입을 한번 읽어보는 것은 좋다.

1 클래스란?

1.1 클래스란?
클래스란 새로운 데이터 타입을 만드는 데이터 타입 생성기이다. 기존의 데이터 타입을 이용하여 새로운 데이터 타입을 만들어내는 것이 바로 클래스의 역할이다. 클래스가 데이터 타입 생성기라는 말만 이해하고 있어도 많은 부분이 해결되는 느낌을 가질지도 모른다.
여러분은 지금까지 클래스로 새로운 데이터타입을 만들고 있었던 것이다. 보통 뭔가를 탐구하면서 뭘 하는지 모르고 일을 하고 있을 때만큼 답답한 순간은 없다. 자바 언어를 조금 공부해 보면 수없이 클래스를 만들고, 그 클래스로 작업을 한다. 그런데 정작 클래스가 뭘 하는 건지 모르고 작업하는 경우가 많다. 여기서 정확하게 정의를 내려 두자.

클래스는 새로운 데이터 타입을 만드는 데이터 타입 생성기이다.

이 명제는 자바뿐만 아니라 C++ 관련 언어를 한다면 누구나 다 기억해야 하는 객체지향언어의 제1조의 원칙에 해당 된다.

1.2 클래스의 지위와 구조
앞장에서 설명한 데이터 타입과 변수와 상수의 구조는 계층구조로 되어 있다. 이 구조를 알고 있다면 쉽게 클래스의 개념에 접근 할 수 있다. 그 구조를 다시 살펴보면 다음과 같다.

데이터 타입과 변수와 상수의 구조

데이터 타입

변수

상수

 무 존재

존재

실존

데이터 타입의 하위에는 변수가 존재하며 변수의 하위에는 상수가 존재하다. 각각의 역할이 없으면 프로그램은 수행 될 수 없다. 그렇다면 클래스는 어느 부분에 속하는 것일까? 위의 구조에서 제일 상위에 존재하는 것이 바로 클래스이다. 클래스는 데이터 타입의 윗부분에 자리를 차지하고 있으며
데이터 타입과 관련이 있다. 그 구조를 다시 만든다면 아래와 같이 나타낼 수 있다.

데이터 타입과 변수와 상수의 구조

클래스

데이터 타입

변수

상수

 무 존재

존재

실존

무엇에 사용하는 것이길래 제일 위에 있을까? 답은 데이터 타입을 새로 하나 만드는 역할을 담당하고 있다. 데이터 타입은 형태는 있지만 존재하지 않기 때문에 무존재라고 칭했다. 그렇지만 클래스는 그 상위레벨에 있기 때문에 아예 무에서 무존재, 즉 무형을 만드는 역할을 한다. 그래서 위의 표에서 무(無)라고 표시했다. 클래스는 신(神)이라고 생각된다. 신은 인간이라는 데이터 타입을 만들었다. 그리고 인간이라는 데이터 타입에 각각의 이름을 부여하여 하나의 객체(변수)로 만들었다. 인간이라는 데이터 타입을 만든 이는 바로 클래스이다. 그래서 클래스는 신이다. 개인적인 생각이다.!! 현재에서 가장 핵심적인 사항은 “클래스는 데이터 타입 생성기의 역할을 한다“라는 것이다. 주제는 잊지말자.

자바에서 제공하는 기본적인 데이터 타입은 int, long, float, double, char…. 등이 있는데 이러한 데이터 타입을 우리는 기본 데이터타입이라고 부른다. 기본데이터 타입의 한계는 하나의 데이터만을 넣을 수밖에 없다는 단점이 있다. 각각의 형태에 해당되는 데이터를 하나만을 담을 수 있는 것이다. 현실 세계의 데이터들은 제일 밑바닥에는 이러한 기본 데이터들로 이루어져 있겠지만 알고 보면 기본적인 데이터를 묶어서 또 다른 형태의 틀을 만든다. 예를 들어 인간이라는 데이터 타입이 있다. 이 데이터 타입의 형태는 여러분이 어렴풋이 생각하는 인간의 형태 그 자체이다. 여기에 변수를 붙이면, 즉 이름을 홍길동이라고 준다면 홍길동은 현실 세계에 공간을 차지하는 하나의 변수가 된다.
    - 인간 홍길동;

자세히 들여다보면 인간이라는 데이터 타입의 밑바닥은 변수로 이루어져 있으며, 많은 변수가 뭉쳐서 하나의 데이터 타입을 이루고 있다. 이와 같이 여러 개의 변수를 묶어서 하나의 데이터 타입으로 생성하는 역할을 하는 놈이 바로 class이다. 인간이 만들어지기 위해서는 클래스에서 아주 다양한 형태의 작업을 해주어야 하다 클래스로 간단히 인간이라는 . 데이터 타입을 만드는 것을 보여주고 있다.

인간 클래스의 디자인
    class 인간{
        String name;
        int age;
        float height;
        float weight;
        등등….
    }

이쯤에서, 다시 한번 class에 대해서 정의를 내리면, 많은 변수들이 뭉쳐서 새로운 데이터 타입을 만들어 내는 역할을 하는 것이 클래스라고 정의를 내린다. 그런데 왜 데이터가 아니고 변수일까? 그것은 인간이 태어나면 각각의 이름과 나이, 키 등을 부여 받는다. 각각이 생성되기 전 단계이기 때문에 생성되는 순간 어떠한 값이 할당 될지 알 수 없으니 즉, 데이터 타입은 형태에서 만들어지는 순간 각각 다른 값을 가져야 하기 때문에 변수의 형태로 데이터 타입 내에 들어가는 것이다.

자바에서는 클래스를 사용하지만, 자바 이전의 C 언어에서는 구조체라는 것을 사용한다. 구 조체는 자바의 전 단계에 데이터 타입을 만드는 놈이었다. 클래스의 할아버지 정도 되는 구조체의 의미를 이해한다면 클래스의 정확한 특징을 이해 할 수 있을 것이다.

1.3 결론
클래스는 데이터 타입을 만들며 그리고 데이터 타입은 변수를 생성하며 변수에는 상수를 할당할 수 있다. 클래스는 새로운 데이터 타입을 만드는 데이터타입 생성기이다. 그리고 다음 장에서 구조체와 클래스 그리고 데이터 타입 생성기라는 측면에서 클래스를 살펴보자.


2 구조체로 데이터타입을 생성하는 방법

2.1 구조체란?
구조체는 클래스가 없던 표준 C에서 시절에 새로운 데이터 타입을 만드는 역할을 담당하고 있었다. 현재 우리가 언급한 데이터 타입은 분명히 하나만의 데이터를 담을 수 있는 데이터 타입이다. “int a=3“ 이라고 했을 때 우리는 a라는 변수에 다른 수를 담고자 한다면 3이라는 값은 사라진다. 즉,
a=5라고 했을 때 a에 들어 있던 3은 없어지고 다시 5라는 수가 a의 메모리에 자리를 잡게 된다. 이러한 측면에서 기본 데이터 타입의 문제점은 단 하나의 데이터를 넣을 수 있다는 것이다. 데이터 타입이 2개의 수를 담을 수 있다고 한다면 어떨까? 표준 C(ANSI C)언어에서는 이를 구조체라는 것을 사용하여 해결하고 있다. 물론, 자바 언어에서는 사용하지 않지만 구조체의 의미는 객체 언어의 역사를 말해 주고 있기 때문에 구조체에 대해 약간의 지식을 가지고 있으면 자바 언어가 어떠한 구조로 되어 있는지 쉽게 이해 할 수 있다 . 구조체의 정확한 문법 구조는 알 필요가 없다. 단순히 아~ 이렇게 만드는구나 정도를 이해하면 된다. 일단 구조체의 예를 살펴보자.

2.2 구조체를 만드는 방법
클래스로 데이터 타입을 만든다고 했다. 구조체는 데이터타입을 생성하는 데이터 타입 생성기 역할을 하고 있기 때문에 클래스와 같은 레벨에 존재한다. 그래서 구조체는 클래스와 동급이다. 구조체는 완벽하게 클래스와 그 의미는 같다. 그리고 초기 구조 또한 클래스와 아주 흡사하다. 구조체의 위치는 아래에서와 같이 제일 위에 존재한다.

구조체, 데이터 타입, 변수, 상수의 구조

구조체

데이터 타입

변수

상수

 무 존재

존재

실존

구조체로 데이터 타입을 생성하는 예를 살펴보자.

구조체 사용의 예
    struct PERSON {
        int age;
        long height;
        float weight;
    }
        family_member;
        struct PERSON sister; // C style structure declaration
        PERSON brother; // C++ style structure declaration
        sister.age = 13; // assign values to members
        brother.age = 7; 

자바 언어는 C++의 문법 구조를 따르고 있으며 C++는 C 언어를 기반으로 하고 있다. C 언어의 구조체는 C++에 와서 완전하게 다른 모습인 class라는 이름으로 발전하여 원래의 구조체와 공존하게 된다. 현재 소개되는 C, C++문법을 잘 살펴보면 특정한 Rule을 찾을 수 있다. 그리고 이러한 Rule은 자바 언어에서도 그대로 사용하게 된다.
위의 구조체에 대한 예를 하나씩 따져 보자. 구조체라는 것은 앞에 struct이라는 키워드를 사용하며 이름을 지정하고 있다. 즉 PERSON이라는 이름으로 구조체를 만든다는 의미이다. 그리고 그 내부에는 3개의 변수를 포함하고 있다. struct 키워드를 이용하여 3개의 변수를 묶어서 PERSON이라고 부르겠다는 것이다. 하나씩 분해해서 보면 다음과 같다.

데이터 타입과 변수와 상수의 구조
    - struct : 구조체를 만드는 키워드
    - PERSON : 구조체로 만들어진 새로운 데이터 타입
    - int age : PERSON 내부의 멤버
    - int height : PERSON 내부의 멤버
    - int weight : PERSON 내부의 멤버

이 부분에서 구조체에 대해 헷갈리지 않게 이해를 잘 해야 한다. 구조체는 새로운 형태의 데이터 타입을 만드는 역할을 한다. 이러한 점에서 구조체는 클래스와 같은 역할을 한다. 여기서 PERSON은새로운 데이터 타입이며 struct은 표준 C 언어에서 제공하는 데이터 타입 생성기이다.

    - 누가 만들었을까?
      그것은 누구나 만들 수 있으며 여기서는 제가 임의의 이름으로 하나 만들었다.

    - PERSON이라는 이름은 무엇일까?
      새로운 데이터 타입의 이름이다.

    - struct는 무엇을 하는 것일까?
      새로운 데이터 타입을 만들 수 있게 해주는 키워드이다.

    - age, height, weight는 새로운 데이터 타입 내부에 존재하는 멤버이다.

정리를 해보자. 기존에는 주어진 데이터타입으로 데이터를 하나만 넣을 수 있는 변수를 선언하여 하나의 데이터만을 넣어 사용했다. 이제는 달라졌다. 구조체를 이용하여 PERSON이라는 새로운 데이터타입을 만들었으며, 그 속에는 3개의 변수를 포함하고 있으며, 3개의 변수들을 대표하는 이름을 바로PERSON으로 하겠다는 것이다.

앞에서 언급한 데이터 타입을 상기시켜보자. 데이터 타입은 어디에 사용한다고 했나? 바로 변수를 선언할 수 있다는 것이다. 위의 만들어진 데이터 타입 PERSON을 이용하여 아래와 같이 변수를 선언했다.
    PERSON brother;
이와 같이 변수를 하나 만들었을 때 메모리가 하나 생성된다. 여기서, 변수이름은 누가 뭐래도 brother이다. 하지만 아주 곤란한 문제가 발생한다. 기존의 방식대로라면 이 속에 있는 3개의 변수에 값을 넣을 수가 없다. 그래서 나온 것이 점의(.) 원리이다. 그냥 단순히 이해하자면 소속이라는 의미
이다.
    PERSON brother;
    brother.age =100
    brother.height=170L
    brother.weight=67.5F

이와 같이 사용자가 임의로 새로운 데이터타입을 만들며 그리고 그 타입을 사용할 수 있게 하는 것이 의 구조체이다 구조체의 의미는 여기까지만 ANSI C . 알아 두자. 더 이상 구조체는 자바에서 사용 되지 않는다. 하지만 이 구조체야 말로 자바 언어에 대한 핵심의 의미를 그대로 담고 있으니 그 느낌 만큼은 정확히 알아 두어야 한다.

2.3 결론
구조체가 클래스와 사용방법이 동일하다면 왜 굳이 구조체를 이용하지 않고 새로운 형태의 클래스를 만들었을까? 바로 이 차이점이 클래스만의 특징이며 객체 지향언어의 장점이다. 앞으로 구조체보다 왜 클래스가 나은가를 알게 된다면 클래스의 개념을 어느 정도 파악하고 있는 것이다.
뭐가 다른지 답부터 보고 다음으로 넘어가자. 구조체와 클래스는 데이터 타입의 생성이라는 측면에서는 같은 역할을 한다. 클래스가 구조체보다 강력한 점은 접근 제어, 상속의 개념 그리고 메서드의 활용 부분이 클래스에 추가 되었다는 점이다. 자바를 배운다는 것은 바로 클래스의 장점을 배우는 것이다.

3 클래스로 데이터 타입을 만드는 방법

3.1 배경
위에서는 구조체로 데이터 타입을 만드는 방법에 대하여 알아보았다. 이 데이터 타입을 만드는 방법을 자바의 클래스라는 측면에서 살펴보자. C 언어의 구조체와 자바의 클래스가 같은 역할을 한다면 확장된 클래스가 아닌 기본적인 자바 클래스는 구조체와 그 모습이 동일하다는 것을 밝히면서 클래스의 의미를 다시 한번 상기 시켜 보자.

3.2 클래스 만들기
먼저, 앞에서 만들어 본 구조체와 똑같은 데이터 타입을 자바 클래스로 만들어 보자. 아래의 클래스는 앞 절에서 나온 구조체와 철자도 틀린 것이 별로 없다.
PERSON.java
    public class PERSON {
        public int age;
        public long height;
        public float weight;
    }
C:\examples\1.클래스의 개념>javac PERSON.java
C:\examples\1.클래스의 개념>dir
C:\examples\1.클래스의 개념 디렉터리
2001-06-03 09:29p <DIR> .
2001-06-03 09:29p <DIR> ..
2001-06-03 09:29p 246 PERSON.class
2001-06-03 09:29p 90 PERSON.java

이 파일을 컴파일 했을 때 우리는 확장자를 .class 가진 파일을 하나 얻을 수 있다. 약간 다르긴 하지만 public을 모두 제거하고 struct 키워드를 class로 바꾼다면 모든 면에서 구조체와 똑같다. 3개의 변수를 담고 있는 새로운 데이터 타입이 만들어진 것이다.
위의 class 키워드로 만든 데이터 타입을 실제 자바로 실행해 볼 수 있는 main 메서드를 포함한 코드를 제작해 보자. 자바에서는 main 메서드를 포함하고 있는 클래스가 실행 클래스가 되며 실행은 “java 클래스의 이름“으로 하고 있다. main 메서드를 포함한 코드는 다음과 같다.

Test3.java
    public class Test3 {
        public static void main(String[] args) {
            PERSON brother = new PERSON();
            brother.age =100;
            brother.height = 170L;
            brother.weight = 67.0F;
            System.out.println("age:" + brother.age);
            System.out.println("height:" + brother.height);
            System.out.println("weight:" + brother.weight);
        }
    }
    C:\examples\1.클래스의 개념>javac Test3.java
    C:\examples\1.클래스의 개념>java Test3
    age:100
    height:170
    weight:67.0

구조체와 클래스의 차이점은 현재의 자바 소스에서는 전혀 찾아 볼 수 없다. 아직 클래스의 장점들이 나타나고 있지 않기 때문에 별다른 차이점을 느끼지 못할 것이다. 하지만 그 차이점들이 객체 지향언어의 매력이라는 것을 미리 짐작 할 수 있을 것이다.

이제, 클래스와 구조체를 비교해 보자. 아래의 표는 클래스와 구조체의 비교를 잘 보여 주고 있다.

클래스와 구조체의 비교

클래스

구조체

종류 

클래스

클래스로 만든 데이터 타입

클래스 변수

상수

구조체

구조체로 만든 데이터 타입

구조체 변수

상수

무 존재

존재

실존


이 표에서 나타내고자 하는 것은 클래스와 구조체는 차이가 없다는 것이다. 클래스는 구조체의 복사 판일 정도로 그 개념은 비슷하다.

3.3 결론
결론적으로, 클래스는 구조체를 발전시켜 만든 것이라고 봐도 될 것이다. 여기서 클래스는 당연히 최고 상위에 존재하는 신적인 존재이며 객체 지향적인 개념에서 새로운 데이터 타입을 만든다는 것은 당연한 일이지만 고전 프로그래머에게는 약간 생소한 접근 방식일 수도 있다. 그렇다면 과연 차이점은 무엇일까? 그 차이점이 자바의 큰 힘이며 매력인 것이다. 다음 장에서는 클래스와 구조체의 차이점인 클래스만의 특징을 알아보자.

4 클래스만의 특징

4.1 클래스만의 특징 소개
구조체에는 없지만, 클래스에만 있는 특징이 바로 클래스와 구조체의 차이점이다. 클래스만의 특징은 아주 다양하게 열거할 수 있지만 구조체와의 차이점에서 찾아 볼 수 있는 단순하면서 중요한 개념들만 열거한다면 다음과 같다.
구조체와 다른 클래스만의 특징들
    - 선언과 메모리 할당
    - 데이터의 접근 방법(private와 public)
    - 멤버로 메서드 포함
    - 상속의 개념 적용

간단해 보이지만 자바 언어의 모든 특징을 전부 내포하고 있다. 메모리의 할당의 문제는 어차피 구조체이든 클래스이든 만들어지면 변수를 선언하고 메모리를 할당해야 하는 것은 마찬가지이다. 사용 방법만 약간 다를 뿐이다. 데이터의 접근과 메서드의 포함, 상속개념의 적용은 기존의 절차적 프로그래밍 기법에 반기를 드는 혁명적인 일이다. 클래스의 특징들을 알아보자.

4.2 클래스의 특징들
기본적으로 구조체에서는 메서드를 포함하지 않고 일반적인 데이터타입의 변수를 포함할 수 있다. 하지만 클래스는 한 단계 더 나아가 메서드까지 포함하고 있다. 그리고 구조체로 새로운 데이터 타입을 만들었다면 새로운 데이터 타입 내에 들어 있는 모든 요소들은 기본적으로 public이다. 하지만 클래스에서는 private와 public의 차원에서 접근제어를 구분하고 있다. 점찍고 값을 할당할 수 있다면 public이고 없다면 private이다. 마지막으로 상속의 개념은 클래스만의 막강한 힘을 주고 있다. 만들어져 있는 데이터 타입에 대한 재사용이란 측면에서 상속은 꿈의 기술이다.
C++ 언어의 창시자인 Bjarne Stroustrup은 여러 개의 변수를 조합하여 많은 양의 데이터를 담을 수 있는 새로운 데이터 타입을 만드는 방법을 제안하였으며, 그것을 확장하여 변수들의 관계를 정의하는 메서드를 포함시킴으로써 새로운 모델을 만들었는데 이것이 바로 클래스이다. 그리고 각각의 데이터 타입들간의 상속구조를 포함시키면서 Object Oriented Programming 기법의 발전된 모델을 제시하고 있다.

4.3 결론
클래스 내부에 접근제어, 메서드, 상속의 개념이 들어가면 그 규칙을 유지하고 지키기 위해서 보다 복잡한 객체개념이 들어가게 된다. 클래스 구조를 유지하기 위한 규칙을 배우는 것이 바로 자바 언어를 배우는 것으로 보아도 될 것이다. 앞으로 여러분들은 접근제어, 메서드 그리고 상속을 활용하여 새로운 클래스를 디자인하고 그 클래스를 잘 사용하는 방법, 즉 다른 사람들이 만들어 둔 클래스를 활용하여 자신의 클래스로 확장하는 방법을 배우게 된다.

5 클래스 변수를 생성하는 방법의 차이
5.1 서론
구조체와 클래스의 차이점 중 여기서는 변수를 생성하는 방법의 차이에 대하여 알아보자. 구조체와 클래스는 생성하는 방법에 있어서 차이점을 보인다. 아주 기본적인 사항이지만 클래스를 알겠다고 한다면 이것을 무시할 수는 없다.

5.2 클래스 변수를 생성하는 법
일단 구조체와 클래스의 생성의 방법의 차이점에 대해서 알아보자. 구조체와 클래스의 생성방법은 아래와 같다.

사용자 정의 데이터 타입의 생성하는 방법

구조체 변수의 생성 클래스 변수의 생성

PERSON brother;

PERSON brother =  new PERSON()

이 두 가지에 분명 다른 방법을 사용하고 있다. 구조체에서는 선언만 해 주었다. 하지만, 클래스에서는 new 연산자라는 것을 사용하고 생성자 메서드를 명시해 주어야 한다.

자바의 클래스 개념에서는 반드시 연산자로서 new 메모리를 생성하는 부분이 나와야 한다. 만약 “PERSON brother“처럼 단순히 선언만 해 준다면 절대 메모리는 생성되지 않는다. 이것은 기존의 C와 C++의 차이점이다.
참고로 C++ 언어에서는 new를 했다면 반드시 delete를 해서 메모리를 해제해 주어야 하지만 자바 언어에서는 이것을 쓰레기 수집기를 사용하여 메모리를 자동으로 해제 해 주기 때문에 delete 연산자는 사용하지 않는다.
생성자 메서드라는 것을 호출해 주어야 하는데 이 생성자 메서드는 무조건적으로, 반드시 호출해 주는 것을 원칙으로 한다. “PERSON()“이란 놈이 바로 생성자 메서드인데 여기서는 생성자 메서드라고만 언급하고 다음의 The Class에서 아주 심도 깊게 다루게 될 것이다. new와 생성자 메서드의 기능은 new 연산자를 이용하여 메모리를 생성하고 생성자 메서드를 이용하여 멤버필드의 초기화 작업을 해 주는 것이다. 자바에서 사용하는 클래스에 대한 변수선언을 하는 부분인 “PERSON brother =
new PERSON()“을 분해 해 보면 다음과 같다.
자바 클래스 데이터 타입의 변수 선언과 메모리 할당
    - PERSON : 클래스로 생성한 데이터 타입
    - brother : PERSON 데이터타입으로 선언한 변수
    - new : 메모리를 생성하는 연산자
    - PERSON() : 메모리 생성 후 초기화 작업을 담당하는 생성자

아주 간단하다. 하지만 보통의 책에서는 그냥 new라고 설명하고 있으며 생성자 메서드와 같이 사용 한다고 되어 있지만 그 내부의 의미는 아주 조직적이다. 이 부분은 뒤에 new 연산자와 생성자 메서드를 다룰 때 자세하게 언급하도록 하겠다.

5.3 결론
이 절에서는 클래스 변수를 만드는 방법에 대하여 알아보았다. 클래스는 변수이름만 주는 것이 아니라 new를 이용하여 메모리까지 생성 시켜주어야 한다는 것을 배워 보았다. 이점에서 클래스는 기존의 언어에서보다 메모리의 핸들을 보다 더 정확하게 하겠다는 의미를 내포하고 있다. 그리고 메모리가 있느냐 없느냐는 자바를 공부할 때 아주 중요한 부분을 차지한다. 프로그램할 때 가장 많이 접하게 되는 에러가 바로 메모리가 없다는 Null Point Exception이다. 이 에러는 객체에 메모리가 없는데 사용하였다는 에러이다. 이것은 프로그램을 보다 명확하게 해주는 역할을 한다.

6 마무리
자바의 가장 기본적인 원리인 데이터 타입의 이용, 변수의 선언, 메모리의 할당 그리고 초기화 작업을 한꺼번에 전부 보여주는 부분이 바로 “PERSON brother = new PERSON()“이라는 한 줄의 소스이다. 이 글에서 설명할 수 있는 클래스의 기초 개념 또한 포함하고 있기 때문에 여러분은 이 한 줄의 의미를 제대로 아는 것이 무엇보다 우선한다. 클래스의 특징인 선언과 메모리의 할당이라는 관점에서 클래스의 특징을 먼저 알아보았으며 다음 장으로 넘어가면서 데이터의 접근제어(private와 public), 멤버로 메서드 포함에 대해서 자세하게 알아본다. 구조체와 구별되는 클래스의 접근제어와 클래스내의 메서드 포함은 3장의 The Class에서 상세하게 다루게 될 것이며, 4장에서는 상속과 함께 클래스의 재사용이라는 측면에서 클래스의 개념을 배우게될 것이다. 3, 4장에서 진정한 클래스의 느낌을 얻어보자.

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


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

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

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

  자바 개발에 필요한 개발도구는 엄청 유명하기도 하지만 많이 사람들이 사용하는 개발 도구입니다. 이클립스를 설치하기전 자바(Java)는 설치가 완료되어 있어야 됩니다.

 

 자바는 오라클 홈페이지에서 간단하게 설치할 수 있으며, 설치가 완료 되어있다 생각하고 포스팅을 진행하도록 하겠습니다.

 

간단한 검색으로 접속에 될 수 있게 구글 검색을 이용하도록 하겠습니다.

 

 

위의 이미지와 같이 이클립스를 검색 후 "Eclipse Downloads" 를 눌러서 접속해 줍니다.

 

 

주황버튼 아래 회색글씨 "Download Packages" 를 누룹니다.

 

Eclipse IDE for Java EE Developers 가 보이시는데요. 사용하시는 운영체제 맞게 눌러줍니다.

- 윈도우7 32비트, 윈도우XP : 32bit
- 윈도우7 64비트, 윈도우8  : 64bit

 

다들 아시겠지만 운영체제와 다르게 설치한다면 정상적으로 설치가 이루어지지 않거나 설치가 되더라도 동작을 하지않을 수 있습니다.

 

 

eclipse-jee-neon-2-win32.zip 를 눌러줍니다.

 

 

저장을 하시거나 다른이름으로 저장합니다.

 

 

파일을 다운받으면 압축이 되어있을텐데요. 압축을 풀면 위의 이미지처럼 파일과 폴더가 보입니다. 표시된 파일 eclipse 를 실행하여 설치하시고 사용하시면 됩니다.

'프로그래 언어 > JAVA' 카테고리의 다른 글

자바] 기본 클래스의 제작  (0) 2017.05.13
자바] 클래스의 기본 배경  (0) 2017.05.11
2장 Hello Basic Java - JDK 설치  (0) 2017.02.08
1장 프로그래밍이란 무엇인가?  (0) 2017.02.07

자바 학습 환경 준비

  Java를 이용한 프로그래밍을 시작하기 전에 갖추어야할 조건들이 몇가지 있는데 그 중 하나가 PC 내에 개발환경을 구성하기 위해서 필요로 하는 JAVA JDK 이다. 개발환경이란 자바로 프로그램을 만들 수 있는 컴퓨터 환경을 말한다. 즉 프로그램 소스를 작성하는 툴, 작성한 소스를 컴파일 하는 프로그램 등을 설치해야 하는 것이다.  

1. www.oracle.com 에서 JDK 설치 파일을 다운 받습니다. Java SE 다운로드 페이지에서 Oracle Binary Code License Agreement for Java SE 에 동의한 후 자신의 플랫폼에 맞는 설치 파일을 다운로드 합니다. 여기서는 윈도우즈에 설치할 것이기 때문에 32ibt 또는 64bit 중에서 선택을 합니다. ( jdk-8u111-windows-x64.exe ) 참고로 64bit 컴퓨터에는 32bit JDK도 설치할 수 있습니다. 과거에 개발된 프로그램을 유지보수할 경우 구버전의 JDK 가 필요할 경우가 있습니다. 이런 경우 필요한 버전의 JDK를 여러 종류 설치해 두고 사용할 수 있습니다. 다른 방법으로는 상위버전의 JDK 를 설치하고 컴파일시에 생성되는 class 파일을 특정 VM version 으로 지정하여 컴파일 하는 방법도 사용할 수 있습니다. 

2. 설치할 곳을 결정합니다. 기본 설치 위치는 C:\Program Files\Java  이지만, 여기서는 C:\util\java 에 설치 하겠습니다. 예전에는 설치시 "Program Files" 처럼 폴더명에 스페이스가 있거나, 한글이 있을 경우 응용프로그램이 문제를 일으키는 경우가 있었습니다. 요즘은 문제가 되는 경우가 잘 없는 것 같습니다. 설치 위치는 자신이 마음에드는 곳에 설치하거나 C 드라이브의 용량등으로 결정되는것 같습니다. 설치 프로그램을 더블클릭하여 실행합니다. 환영화면에서 Next>버튼을 누릅니다.

 

 3. 설치위치를 지정하는 곳입니다. Change... 버튼을 눌러 위치를 지정합니다. 설치될 항목을 선택할 수 있습니다. JDK, 소스파일, JRE 가 설치되는데 기본으로 모두 설치합니다. 소스파일이 설치가 되면 이클립스와 같은 개발툴에서 개발 도중 소스를 볼 수가 있습니다. 다음에 Next> 버튼을 누릅니다.

 

 4. Change... 버튼을 눌렀을때 설치위치를 고르는 화면 입니다. 위치를 선택한 후 OK 를 누릅니다.

 

 5. 진행 막대가 보입니다.

 

 6. 설치중 새로운 창이 뜨면서 jre 를 설치하라고 합니다. 여기서 jre의 위치를 변경 버튼을 눌러서 바꿔줍니다. 그리고나서 다음 버튼을 누릅니다.

 

 7. jre 설치 진행중입니다. 인터넷이 연결되어 있지 않을 경우 JRE 설치에 문제가 발생하는 경우가 있었습니다. 설치가 더이상 진행되지 않고 현재 상태로 멈춰 버리는 경우인데, 윈도우 작업관리자에서 강제로 종료하면 jre는 설치가 안되고  JDK 는 설치가 되어 있는 상태가 됩니다. jre가 필요 없다면 이후 JDK는 제대로 동작을 하였습니다.

 

 8. 설치가 모두 완료 되었습니다. Close 버튼을 눌러서 마칩니다.

 

 9. 설치 확인을 해봅니다. Window +R 버튼을 눌러  cmd 를 입력해서 명령창을 띄웁니다. 프롬프트에서 java -version 을 입력해서 출력 내용을 확인합니다. 아래와 같이 나오면 제대로 설치가 된것 입니다.

출력된 내용을 보면 Java(TM) SE Runtime Environment 라고 표시된 것이 보입니다. JRE 의 java 프로그램이 실행된 것입니다. JRE의 실행파일이 있는 폴더가 자동으로 PATH에 등록이 된 것입니다. 필요하다면 JDK 가 설치된 곳 아래의 bin 디렉토리도 PATH 에 등록을 해두면 되겠습니다. JDK 가 설치된 폴더를 JAVA_HOME 환경 변수에 등록해 두어도 됩니다. JAVA_HOME 환경변수를 필요로 하는 응용프로그램들이 종종 있습니다. 물론 필요할 때 등록해도 됩니다.

JDK 를 설치하였는데, 중간에 jre 도 설치가 되었습니다. 두 가지를 간단히 설명을 하겠습니다. JDK 는 Java Development Kit 의 약자이고, jre는 Java Runtime Environment 의 약자 입니다. 말 그대로  JDK 는 개발용입니다. Java 소스코드를 컴파일 하는 기능이 있습니다. jre 실행환경이라고 불리는데, 컴파일된  class 파일을 실행하는 기능을 가집니다. 자바 관련 프로그램들이 JDK 가 필요한 것도 있고,  jre 만 있어도 되는 것도 있습니다. 보통 설치시 뭐가 필요합니다. 하는 메세지가 나오게 됩니다.

개발시에는 에러메세지와 친숙해질 필요가 있습니다. 에러메세지가 나오면 창을 닫는데 급급한 사람들이 많은데, 에러메세지를 잘 읽고 대처법을 찾아보는게 중요합니다. 개발을 하면 당연히 에러를 찾아서 수정하는 디버깅을 하게 됩니다. 디버깅을 도와주는 많은 툴과 기법들이 있지만, 경험만큼 중요한게 없는것 같습니다. 많은 에러메세지를 만나고 디버깅을 하다보면 감이라는게 생기는것 같습니다. 애매한 에러메세지들, 같은 메세지이지만 서로 원인이 다른 경우 등 디버깅이 어려운 경우더라도, 이러한 상황에서 이러한 에러는 이러한 경우에 주로 발생하더라 라는 경험이 더욱 빠른 디버깅을 도와 주게 됩니다.

Programming 의 P

  대부분의 집 현관에 있는 디지털 도어락에도 프로그램이 있다. 문을 열기 위해 비밀번호를 입력한다. 그러면 도어락에 있는 프로그램이 저장되어 있는 비밀번호와 동일한지를 확인해 본다. 만약 저장되어 있는 값과 입력한 비밀번호가 동일하면 문이 열린다.

프로그램을 작성하는 것은 이 디지털 도어락과 전혀 다르지 않다.

1. 미리 만들어 놓은 어떤 프로그램에 비밀번호를 전달하여 결과를 기다릴 수도 있고
2. 비밀번호가 맞는지 확인하는 것을 직접 작성할 수도 있다.

프로그래밍을 한다는 것은 모두 이러한 작업을 반복적으로 수행하면서 어떤 기능들을 만들어 내는 것이다.

  이렇게 어떤 값을 입력하고, 결과를 제공해 주는 프로그램을 만들려면 언어가 필요하다. 사람과 컴퓨터 사이에도 언어가 필요하다. 이러한 언어를 프로그램밍 언어라고 한다. Java라는 것도 프로그래밍 언어의 일종이다.

  인터넷을 통해서 매일 접하는 웹 페이지를 구성하는 것은 HTML이며, 이 페이지가 살아서 움직이도록 하려면 자바스크립트라는 것을 사용한다. (이름은 비슷하지만, 자바와 자바스크립트는 전혀 다르다) 이 웹 페이지에서 어떤 정보를 요청하기 위해서 클릭을 하면 서버에 데이터를 요청한다. 그러면 서버는 필요한 데이터를 가공해서 화면에 보여준다. 여기서 서버의 프로그램에 해당하는 부분에서 데이터를 가공하여 화면에 보여 줄 수 있도록 한다. 이 때 사용하는 것이 바로 자바, C, 파이선, PHP 등등의 프로그래밍 언어들이다.

 

자바 프로그램의 메소드 구성

  위에서 얘기했던 도어락의 비밀번호를 확인하는 것을 자바 프로그램으로 작성해 보도록 하자.

첫번째 입력한 비밀번호가 필요할 것이며, 두번째는 입력한 비밀번호가 저장된 비밀번호와 일치여부를 체크하는 부분이 있을 것이며, 마지막으로 결과값이 있을 것이다.

즉, password라는 비밀번호가 넘어가고, 중간에 계산을 하는 부분이 checkPassword()라는 것이다. 그리고, 그 결과로 boolean이라는 것이 나온다.

  이렇게 어떤 값을 주고 결과를 넘겨주는 것을 자바에서는 메소드라고 한다. 즉, checkPassword()라는 것은 메소드 이름이 된다. 여기서 password 라는 것은 매개 변수라고 부른다. 이 매개변수는 필수는 아니다. 마지막으로 boolean이라는 것을 리턴 타입이라고 부른다. 지금까지의 내용을 자바로 바꾸어보면 다음처럼 될것이다.

public boolean checkPassword(String password){

// 비밀번호 검증

}

public을 접근 제어자라고 한다는 것까지 기억해두고 다음으로 넘어가자

boolean : 리턴타입
checkPassword : 메소드
String password : 매개변수

 

자바의 가장 작은 단위 클래스 

  checkPassword() 라는 메소드는 소속이 필요하다. 자바 프로그램의 메소드는 홀로 존재 할 수는 없고, 반드시 클래스라는 것 안에 포함되어야 한다.

public class DoorLockManager {

}

  여기서 DoorLockManager라고 적혀있는 것이 바로 클래스 이며, 클래스 이름 앞에는 반드시 class 라는 단어가 있어야 한다. 여기에도 메소드 앞에서 보았던 접근제어자 public 이 있는 점만 확인하도록 하자. 클래스를 선언하려면 "접근제어자 class 클래스 이름" 순서라는 것을 기억하자.

  그러면 지금까지 내용을 모아보면 다음과 같을 것이다.

public class DoorLockManager {

public boolean checkPassword(String password){

}

}

이렇게 클래스 안에 메소드를 위치시키면 된다. 하나의 클래스 안에는 여러개의 메소드가 존재할 수 있다. 도어락을 생각해보면 비밀번호를 변경할 수도 있고, 잊어버렸을 경우 초기화 하는 기능도 있다. 바로 이 비밀번호 변경과 초기화 기능이 각각의 메소드 형태로 존재하게 되는 것이다.

public class DoorLockManager {

public boolean checkPassword(String password){

}

public void setPassword(String password){

}

public void resetPassword(){

}

}

새롭게 추가된 비밀번호 변경(setPassword)과 초기화(resetPassword) 메소드의 리턴 타입으로 void 라고 정의되어 있는 것을 볼 수 있다. void 라는 리턴 타입은 이 메소드가 수행되어도 아무것도 돌려주는 것이 없다는 뜻이다.

 

클래스는 상태를 갖고 있어야 한다. 

  지금까지 얘기해온 클래스라는 것은 다음의 조건을 만족해야만 한다.

  클래스는 상태(state)와 행동(behavior)이 있어야만 한다.

그리 어려운 내용은 아니고, 지금까지 알아본 메소드가 바로 "행동"이다. 그렇다면 상태는? 상태라는 것은 클래스의 특성을 결정짓는 것을 말한다. 이 상태는 클래스 안에, 메소드 밖에 정의한다.

  앞에서 살펴본 클래스에는 다음과 같이 currentPassword라는 값이 존재할 수 있다.

public class DoorLockManager {

String currentPassword;

public boolean checkPassword(String password){

}

}

  이와 같이 어떤 값을 포함할 currentPassword와 같은 것을 변수라고 한다. 이 변수가 클래스의 특성을 결정짓는 "상태"에 해당한다.

  객체지향을 이야기할 때 앞서 정의한 것처럼,

클래스는 상태(state)와 행동(behavior)이 있어야만 한다.

라고 보통 이야기 하지만, 꼭 "상태"와 "행동"이 있어야 하는 것은 아니다. 클래스를 만들었는데  변수나 메소드가 없다고 클래스가 아니라고 할수는 없기 때문이다.

 

프로그램 기본 =를 이해하자. 

  일반적으로 산수를 할 때,

  1+2=3

  과 같이 계산을 왼쪽에, 결과를 우측에 지정한다. 하지만 프로그램을 할 때는 반대다. 프로그램에서는 아래와 같이 왼쪽에 대입을 할 변수를, 오른쪽에 계산식을 적어 주어야만 한다.

  int a;
  a=1+2;

  이렇게 적어주면 a라는 변수에 3이라는 값이 들어가게 된다. 여기서 int a 라고 적어준것은 a라는 정수형 변수를 선언한 것이다. 변수를 선언할 때는

  타입 변수명;

  과 같이 지정해 주면 된다.

public class Calculator {

public int add(int num1, int num2) {

int sum;

sum = num1 + num2;

return sum;

}

}

  위 코드에서 확인 할 수 있는 것처럼 a=1+2; 처럼 프로그램의 연산에서는 숫자만 더할 수 있는 것이 아니라, 숫자를 나타내는 변수도 더할 수가 있다.

  add() 메소드의 가장 마지막 줄에 있는 return이라는 것은 어떤 값을 돌려줄 때 지정한다.

  지금까지 위에 나온 소스들을 보면 줄 끝에 세미콜론(;)을 확인 할 수 있다. 자바에서 줄의 끝에 뜻하는 표시이다.

 

자바에서 사용하는 기본적인 사칙연산

더하기 +  , 빼기 -  , 곱하기 *  , 나누기 /

 

모든 프로그래밍 언어에는 예약어라는 것이 있다. 

public class Calculator {

public int add(int num1, int num2) {

int sum;

sum = num1 + num2;

return sum;

}

}

여기에 있는 예약어에는 public, class, int, return 이다. 예약어라는 것은 "예약되어 있으니까 다른 용도로 쓰지 못하는 단어"라고 이해하면 된다. 식당에서 예약석에 먼저온 다른 손님을 앉히지 않는 것 처럼 말이다. 일단 여기서는,

  예약어라는 것이 있고,

  예약어는 클래스, 메소드, 변수의 이름으로 사용할 수 없다.

는 정도만 기억하도록 하자.

 

연습문제

1. Calculator 라는 이름을 갖는 클래스를 텍스트 파일에 만들어 보자.

2. 다음과 같은 메소드를 만들어 보자(단, 그 결과를 리턴해 주도록 만들자)

   빼기 : public int subtract(int num1, int num2)
   곱하기 : public int multiply(int num1, int num2)
   나누기 : public int divide(int num1, int num2)

 

정리

1. 클래스란?

2. 메소드란?

3. 메소드의 매개 변수는 어디에 적어주지?

4. 메소드 이름 앞에 꼭 적어 줘야 하는 건?

5. 클래스가 갖고 있어야 하는 두 가지는?

6. 메소드에서 결과를 돌려주기 위해 사용하는 예약어는?

+ Recent posts