brunch

You can make anything
by writing

C.S.Lewis

클래스 멤버 - 생성자

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


우리는 함께 몰려다니는 어떤 그룹의 일원들을 멤버라고 부릅니다. 예를 들면 특정 동아리에 있는 멤버들을 동아리 멤버라고 하죠?


클래스(classification) 역시도 어떤 분류이기에 이 클래스에 속한 멤버가 존재합니다.

이번에는 클래스 멤버들에 대해서 하나씩 알아보고자 합니다.


클래스의 멤버에는 생성자(constructor), 필드(field), 메서드(method)가 존재합니다.

클래스의 영역(코드 블록) 안에 소속되어 있기 때문에 이들은 클래스의 멤버가 되는 것입니다.

이들은 클래스에 소속된 멤버 이므로 멤버 필드, 멤버 메서드라고도 부릅니다.


물론 멤버라는 말을 생략하고도 많이 부릅니다.

우리가 앞에서 변수(필드)와 메서드는 이미 다뤘기 때문에 생성자를 먼저 알아보도록 하겠습니다.


생성자(constructor)

우리가 앞에서 배운 객체화를 다시 떠올려 봅시다.

이때 new 이후에 클래스와 이름은 같지만 메서드처럼 뒤에 ()가 달린 무언가를 호출한 적이 있습니다.


이때 호출 되었던 것이 바로 생성자입니다.


즉 생성자는 클래스를 객체화(복사) 할 때 호출되는 녀석이라고 생각할 수 있습니다.

생성자는 클래스를 객체화할 때 가장 먼저 실행되는 녀석이므로, 객체화 시 가장 먼저 수행할 일을 생성자를 통해 실행하게 됩니다.


이걸 우리는 초기화(initialize)라고 부릅니다.

이때 초기화(initialize)는 값을 0으로 만드는 개념으로 오해하곤 합니다.

초기화는 최초에 어떤 값을 설정하는 것입니다.


초기화의 예시를 들어보겠습니다. 

우리가 강아지를 한 마리 데려온다고 가정해 보겠습니다. 강아지를 데려올 때 이름과, 이 아이가 해야 할 일에 대해서 우리가 정해 줍니다.


이것은 강아지를 최초로 데려왔을 때 하는 행위, 즉 초기화입니다.


이것을 코드로 표현해 보겠습니다.

생성자에게 초기화에 필요한 재료를 넣어주면, 객체화를 하기 위해 생성자가 호출될 때 해당 재료를 전달받게 됩니다.

코드가 나왔다고 당황할 필요 없습니다. 그냥 여기서 저기로 전달되었다 정도만 이해하면 되니깐요.


어때요? 생성자와 초기화에 대한 내용이 이해가 되시나요?

어렵다면 이 흐름대로 이해를 하시면 됩니다.

1. 생성자는 클래스가 복사될 때 최초로 호출되는 녀석이다.

2. 그러므로 복사되자마자 최초로 할 일을 이곳에 넣는다.

3. 이 행위를 초기화 라고 한다.


앞에서 초기화에 대해서 강아지의 예를 들어 설명했었죠? 생각해 보면 강아지를 데려올 때 무조건 이름과 할 일을 정해서 데려오지 않습니다.

이름만 정할 수도 있고, 때로는 이름조차 정하지 않고 집에 데려가서 생각해 보기로 할 때도 있죠.


하지만 안타깝게도 클래스에는 한 번에 하나의 생성자 밖에 가질 수 없습니다.

그 이유는 무엇이든 같은 이름으로 여러 개가 존재할 수는 없는 법 이니까.

이름이 같은 게 여러 개라면 누구를 부르는지 혼돈이 생기니 당연하 일일 것입니다.


그렇다고 초기화의 방법에 따라 다른 클래스를 만들어 준다는 것도 상당히 불편한 일일 것입니다.

특히나 누군가가 만들어놓은 클래스를 사용하는 사용자 입장에서는 초기화하는 방법에 따라 다른 클래스를 객체화하는 것은 여간 번거로운 일이 아닐 것입니다.

OOP의 핵심은 남이 만들어놓은 소스를 쉽게 사용하는 개념인데, 이렇게 객체화부터 복잡해서야 그 철학에 어긋난다고 볼 수 있겠죠?


그래서 JAVA에서는 특단의 조치를 취합니다.

바로 overload입니다.

Overload는 과적을 듯합니다.

과적의 사전적 의미는 화물의 적재 정량을 초과하여 싣는 행위입니다.

그럼 도대체 무엇을 정량보다 초과했다는 것일까요?

바로 이름입니다. 같은 이름으로는 1개밖에 만들 수 없는 규칙을 초과하는 행위를 인정해 주는 것입니다.


다만 조건이 있습니다.

생성자 안에 들어가는 재료(이걸 우린 매개변수, 레퍼런스 변수 등의 이름으로 부릅니다.)의 개수나 데이터 타입이 달라야 합니다.

앞에서 이야기했듯이 모든 내용이 똑같아지면 호출했을 때 누구를 부르는지 헷갈릴 테니깐요.

이런 오버로드를 생성자에서 사용했으므로 우리는 이것을 생성자 오버로드라고 부릅니다.


조건이 붙긴 하지만 이렇게 같은 이름으로 생성자를 여러 개 만들었을 경우 하나의 클래스로 다양한 초기화 방법을 가질 수 있게 되었습니다.


클래스에 속해있는 멤버 중 생성자를 알아보았습니다.

그리고 같은 이름으로 여러 개를 만들 수 있는 오버로드 도 알아보았고요.

다음 시간에는 클래스 멤버의 두 번째, 멤버 메서드에 와 메서드 오버로드에 대해서 알아보도록 하겠습니다.

매거진의 이전글 JAVA API에 대해 알아봅시다.
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari