[소.자.바] 2.4 클래스만의 특징(17 ~ 20, 완료)

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

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 -