[소.자.바] 2.3 클래스로 데이터 타입을 만드는 방법(15 ~ 20, 완료)

2019. 11. 14. 10:00더 쉽게 쓴 자바(소.자.바)19.11.07

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

 

2.3.1 배경

 

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

 

2.3.2 클래스 만들기

 

 먼저, 앞에서 만들어 본 구조체와 똑같은 데이터 타입을 자바 클래스로 만들어 보자. 아래의 클래스는 앞 절에서 나온 구조체와 철자도 틀린 것이 별로 없다.

 

PERSON.java

 

   public class PPERSON{

   

      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

 

-15 -

 

 이 파일을 컴파일 했을 때 우리는 .class 확장자를 가진 파일을 하나 얻을 수 있다. 약간 다르긴 하나 public을 모두 제거하고 struct 키워드를 class로 바꾼다면(이거 반대 아닌가...? class 키워드를 struct로 바꾼다면) 모든 면에서 구조체와 똑같다. 3개의 변수를 담고 있는 새로운 데이터 타입이 만들어진 것이다.

 위의 class 키워드로 만든 데이터 타입을 실제 자바로 실행해 볼 수 있는 main 메소드를 포함한 코드를 제작해보자.

자바에서는 main 메소드를 포함하고 있는 클래스가 실행 클래스가 되며 실행은 "java 클래스의 이름"으로 하고 있다. main 메소드를 포함한 코드는 다음과 같다.

 

Test3.Java

public class Test3{

   

   public static void mian(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 : " + weight .age    );

   }

}

 

C:\examples\1.클래스의 개념>javac Test3.java

C:\examples\1.클래스의 개념>java Test3

age     : 100

height : 170

weight : 67.0

 

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

 

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

 

그림1. 클래스와 구조체의 비교

 

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

 

- 16 -

 

2.3.3 결론

 

 결론적으로, 클래스는 구조체를 발전시켜 만든 것이라고 봐도 무방할 것이다. 여기서(= 자바 프로그래밍의 측면에서) 클래스는 당연히 최고 상위에 존재하는 신적인 존재이며, 객체 지향적인 개념에서(도) 새로운 데이터 타입을 만든다는 것은 당연한 일이지만 고전 프로그래머에게는 약간 생소한 접근 방식일 수도 있다.

그렇다면 과연 이 둘의 차이점은 무엇일까? 그 차이점이 바로 자바의 큰 힘이며 매력일 것이다.

 

다음 장(= 2.4 즉, 다음 내용을 통해)에서는 구조체와는 구별되는 차이점인 클래스만의 특징을 알아보자.

 

2.4 클래스만의 특징

 

2.4.1. 클래스만의 특징 소개

 

 구조체에는 없지만, 클래스에만 있는 특징이 바로 클래스와 구조체의 차이점이라 할 수 있다.

클래스만의 특징은 아주 다양하게 열거할 수 있지만 구조체와의 차이점에서 찾아 볼 수 있는 단순하면서 중요한 개념들만 열거한다면 다음과 같다.    

 

 *  구조체와 다른 클래스만의 특징들

선언과 메모리의 할당

데이터(로)의 접근 방법(private와 public)

멤버로 메소드 포함

 상속의 개념 적용

 

 위에 열거된 항목들은 간단해 보이지만 자바 언어의 모든 특징을 전부 내포하고 있다.

메모리 할당의 문제는, 어차피 구조체이든 클래스이든 만들어지면 변수를 선언하고 메모리가 할당되어져야 하는 것은 마찬가지의 일로

사용 방법만 약간 다를 뿐 데이터의 접근과 메소드의 포함, 상속 개념의 적용은 기존의 절차적 프로그래밍 기법에 반기를 드는 혁명적인 일이 아닐 수 없다.

 

그럼 이제 클래스의 특징들을 알아보자.  

 

- 17 -

2.4.2 클래스의 특징들

 

 기본적으로 구조체에서는 메소드는 포함하지 않지만, 일반적인 데이터 타입의 변수를 포함할 수 있는 반면에, 클래스는 한 단계 더 나아가 메소드까지 포함 할 수 있다. 그리고 구조체로 새로운 데이터 타입을 만들었다면 새로운 데이터 타입 내에 들어 있는 모든 요소들은 기본적으로 public이지만, 클래스에서는 private와 public의 차원에서 접근제어를 구분하고 있다. 점을 찍고 값을 할당할 수 있다면 public이고 그럴 수 없다면 private이다. 

 마지막으로 상속의 개념은 클래스만의 막강한 힘을 부여하는데, 만들어져 있는 데이터 타입에 대한 재사용이란 측면에서 이 힘 다시말해 상속은 꿈의 기술이 아닐 수 없다.

 C++ 언어의 창시자인 Bjarne Stroustrup는 여러 개의 변수를 조합하여 많은 양의 데이터를 담을 수 있는 새로운 데이터 타입을 만드는 방법을 제안하였으며, 그것을 확장하여 변수들의 관계를 정의하는 메소드를 포함시킴으로써 새로운 모델을 만들었는데 이것이 바로 클래스이다. 그리고 각걱의 데이터 타입들간의 상속구조를 포함시키면서 Object Oriented Programming 기법의 발전 된 모델을 제시하고 있다.

 

2.4.3 결론

 

 클래스 내부에 접근제어, 메소드, 상속의 개념이 들어가면 그 규칙을 유지하고 지키기 위해서 '보다' 복잡한 객체의 개념이 들어가게 된다. 그렇기 때문에 클래스 구조를 유지하기 위한 규칙을 배우는 것이 바로 자바 언어를 배우는 것으로 보아도 될 것이다.

앞으로 여러분들은 접근제어, 메소드 그리고 상속을 활용하여 새로운 클래스를 디자인하고 그 클래스를 잘 사용하는 방법, 즉 다른 사람들이 만들어 둔 클래스를 활용하여 자신의 클래스로 확장하는 방법을 배우게 된다. 그렇다면 이제 차이점에 관련된 사항들을 다음 절에서 하나씩 알아보도록 하자.

 

2.5 클래스 변수를 생성하는 방법

 

 일단 구조체와 클래스 사이의 생성 방법에 있어서의 차이점에 대해서 알아보자.

구조체와 클래스의 생성 방법은 아래와 같다.

 

그림2. 사용자 정의 데이터 타입의 생성법

 

 보이는 바와 같이, 구조체와 클래스는 사용자 정의 데이터 타입의 생성에 있어 분명 다른 방법을 사용하고 있다.

구조체에서 변수를 선언만 해 준것과는 달리, 클래스에서는 new라는 연산자를 사용하여 생성자 메서드를 명시해 주어야 한다.

 

- 18 -

 

 자바에 있어 클래스의 개념에서는 반드시 new 연산자를 통해 메모리를 생성하는 부분이 나와야만 한다. 만약 "PERSON brother"처럼 단순히 선언만 해준다면 절대로 메모리가 생성되는 일은 일어나지 않는다. 이것은 기존의  C 와 C++과의 차이점이다.

 

 참고로 C++ 언어에서는 new를 통해 메모리를 생성해 주었다면 반드시 delete를 통해서 메모리를 해제해 주어야 하지만, 자바 언어에서는 이것을 쓰레기 수집기를 사용하여 메모리를 자동으로 해제해 주기 때문에 delete 연산자는 사용하지 않는다.

또한 new를 통하여 메모리 생성 후엔는 생성자 메소드라는 것을 호출해 주어야 하는데 이 생성자 메소드는 무조건적으로, 반드시 호출해 주는 것을 원칙으로 한다. 여기서 "PERSON()"이란 놈이 바로 생성자 메소드인데 이 절에서는 생성자 메소드라고만 언급하고 3장의  The Class에서 아주 심도 깊게 다루게 될 것이다. new와 생성자 메소드의 기능은 new 연산자를 이용하여 메모리를 생성하고 생성자 메소드를 이용하여 멤버필드의 초기화 작업을 해주는 것으로, 자바에서 사용하는 클래스에 대한 변수 선언을 하는 부분인 "PERSON brother = new PERSON()"을 분해해 보면 다음과 같다.

 

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

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

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

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

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

 

2.5.3 결론

 

 이 절에서는 클래스 변수를 만드는 방법에 대하여 알아보았다. 클래스는 변수(에) 이름만 주는 것이 아니라 new라는 연산자를 이용하여 메모리까지 생성 시켜주어야 한다는것을 앞서 배워 보았다. 이 점에서 클래스는 기존의 언어에서보다 메모리의 핸들을 보다 더 정확하게 하겠다는 의미를 내포하고 있다. 그리고 메모리가 있느냐 없느냐는 자바를 공부할 때 아주 중요한 부분을 차지한다. 프로그래밍할 때 가장 많이 접하게 되는 에러가 바로 메모리가 존재하지 않는다는(= 메모리가 없다는) Null Point Exception이다. 이 에러는 사용자가 객체에 메모리가 없음에도 불구하고 사용하겠다고 요청함으로써 발생하는 에러로써, 프로그램을 보다 명확하게 해주는 역할을 한다. 

 

- 19 -

 

2.6 마무리

 

 자바의 가장 기본적인 원리인 데이터 타입의 이용, 변수의 선언, 메모리의 할당 그리고 초기화 작업을 한꺼번에 전부 보여주는 부분이 바로 "PERSON brother = new PERSON()"이라는 한 줄의 소스이다. 이 장에서 설명할 수 있는 클래스의 기초 개념 또한 포함하고 있기 때문에 여러분은 이 한 줄의 의미를 제대로 아는 것이 무엇보다 우선되어야 한다. 클래스의 특징인 선언과 메모리의 할다이라는 관점에서 클래스의 특징을 먼저 알아보았으며 다음 장으로 넘어가면서 데이터의 접근제어( priave와 public), 멤버로 메소드 호팜에 대해서 자세하게 알아본다.

 

 구조체와 구별되는 클래스의 접근제어(자)와 클래스 내의 메소드 포함은 3장의 The Class에서 상세하게 다루게 될 것이며, 4장에서는 상속과 함께 클래스의 재사용이라는 측면에서 클래스의 개념을 배우게 될 것이다.

 

자 그럼 이제 3, 4장에서 진정한 클래스의 의미가 무엇인지 알아보도록 하자.

 

- 20 -