프로그래밍 일기 — 생성자

배우는 자(Learner Of Life)
7 min readJun 14, 2023

--

컴퓨터 프로그램을 만드는 건설자

#생성자, #Java, #Constructor, #매서드, #인스턴스, #클래스, #기본값, #자료형

“Constructor”라는 단어는 본래 집을 짖는 “건설자", 혹은 무언가를 만드는 “제작자”라는 의미가 있다(1)

어제 글에서 클래스(Class)의 개념과 이를 기반으로 생성된 개념인 인스턴스(Instance)와 매서드(Method)에대 이야기해 보았다. 드디어 컴퓨터 프로그래밍, 특히 Java와 같은 객체지향성 언어에서 중요한 개념을 이해했고, 왜 객체지향에 클래스가 중요한 지를 깨달아서 희열이 느껴졌다.

오늘은 여기서 조금 더 나아가서 “생성자(Constructor)”의 개념에 대해 학습해보려한다. 본래 “Constructor”라는 단어는 집이나 건물을 짖는 건설인력을 지칭할 때 많이 쓰인다. 그러나 컴퓨터에서는 그 의미가 조금 다르게 쓰인다. 본래 단어에 무엇인가를 “만드는 존재”라는 의미가 담긴 만큼, 컴퓨터 공학에서도 프로그램을 만드는데 있어 핵심적인 요소일 것만 같은 느낌이든다.

생성자(Constructor)

생성자는 어제배운 인스턴스와 매서드와 관련이 깊다. 인스턴스를 초기화하는 매서드라고 보면된다. 보통 인스턴스를 선언할 때 “new” 키워드를 활용한다는 것을 어제 배웠다. 이렇게 인스턴스를 선언할 때 생성자가 자동으로 호출되어 인스턴스를 만드는 작업을 수행한다.

생성자의 가장 큰 이점은 인스턴스 생성시 수행할 동작을 프로그래밍 할 수 있도록 해준다는 것이다. 대표적으로 인스턴스 변수를 새로 생성할 때, 이를 초기화 해줄 수 있다. 모든 클래스가 인스턴스화가 필요하다는 것을 감안할 때, 생성자는 모든 클래스에 반드시 하나 이상은 존재해야한다는 것을 알 수 있다. 생성자를 프로그래머가 직접 만들지 않더라도, Java컴파일러가 기본적으로 생성자를 생성한다. 기본생성자는 매개변수와 내용이 아예 없는 텅빈 매서드로 보면된다. 이런 기본생성자를 프로그래머가 만들지 않아도 컴파일러가 알아서 만들어서 클래스를 활용할 수 있게 해준다는 것이다. 프로그래머에게 참으로 편리한 기능이라고 볼 수 있다.

생성자의 특징을 요약하자면 아래와 같다.

  • 생성자의 이름은 클래스의 이름와 같아야한다.
  • 생성자는 반환하는 (return)값이 없다.
// 기본 문법: 클래스이름 (타입 변수명, 타입 변수명, ...){
인스턴스 생성 될 때에 수행하여할 코드
변수의 초기화 코드
}

// 생성자 예제
// 클래스 선언
class Animal{
String name;
String type;
// 클래스의 매서드 정의
Animal(String name, String type){ // 인스턴스 생성시 하는 동작 (생성자의 이름이 클래스의 이름과 같다는 것에 주목)
this.name = name; // 인스턴스 변수 초기화 ("this"는 객체 자신을 가리키며, 인스턴스화 했을 때 자동으로 생성자의 해당 매개변수 값을 객체의 해당 변수에 할당한다.)
this.type = type; // 인스턴스 변수 초기화 ("this"는 객체 자신을 가리키며, 인스턴스화 했을 때 자동으로 생성자의 해당 매개변수 값을 객체의 해당 변수에 할당한다.)
}
}

// 메인 프로그램에서 인스턴스 선언
public class Main {
public static void main(String[] args) {
Animal tiger = new Animal("Tiger", "Mammal"); // 인스턴스화 및 데이터 입력 (생성자가 인스턴스 최초 생성 및 초기화에 관여)
Animal crocodile = new Animal("Crocodile", "Reptile"); // 인스턴스화 및 데이터 입력 (생성자가 인스턴스 최초 생성 및 초기화에 관여)
System.out.println("이 동물의 명칭은 " + tiger.name + "이며, 종류는 " + tiger.type + "입니다.");
System.out.println("이 동물의 명칭은 " + crocodile.name + "이며, 종류는 " + crocodile.type + "입니다.");
}
}

인스턴스 멤버 변수 기본 값(Default value of Instance member variable)

앞서 클래스 멤버 변수는 인스턴스를 선언할 때 초기화된다는 것을 확인했다. 변수를 직접 선언하거나 생성자를 통해 변수를 초기화하지 않는다면 변수들이 기본값(Default value)를 갖게 되는데, 이는 데이터의 형태에 따라 조금씩 달라질 수 있다.

// 클래스 선언
class DefaultValueTest { // 클래스 내 여려 타입의 변수들을 선언했다.
byte byteDefaultValue; // 바이트 타입 데이터
int intDefaultValue; // 정수 타입 데이터
short shortDefaultValue; // short 타입 데이터
long longDefaultValue; // long 타입 데이터
float floatDefaultValue; // float 타입 데이터
double doubleDefaultValue; // double 타입 데이터
boolean booleanDefaultValue; // 논리 타입 데이터
String referenceDefaultValue; // 문자 타입 데이터
}

// 메인 프로그램내 클래스 인스턴스화 (출력되는 변수 값에 주목하라)
public class Main {
public static void main(String[] args) {
DefaultValueTest defaultValueTest = new DefaultValueTest(); // 클래스 인스턴스화 (변수값을 하나도 초기화하지 않았다.)
System.out.println("byte default: " + defaultValueTest.byteDefaultValue); // 바이트 데이터 기본 값 출력
System.out.println("short default: " + defaultValueTest.shortDefaultValue); // short데이터 기본 값 출력
System.out.println("int default: " + defaultValueTest.intDefaultValue); // 정수 데이터 기본 값 출력
System.out.println("long default: " + defaultValueTest.longDefaultValue); // long 데이터 기본 값 출력
System.out.println("float default: " + defaultValueTest.floatDefaultValue); // float 데이터 기본 값 출력
System.out.println("double default: " + defaultValueTest.doubleDefaultValue); // double 데이터 기본 값 출력
System.out.println("boolean default: " + defaultValueTest.booleanDefaultValue); // boolean 데이터 기본 값 출력
System.out.println("reference default: " + defaultValueTest.referenceDefaultValue); // 문자 데이터 기본 값 출력
}
}

>>

byte default: 0 // 바이트데이터(Byte)의 경우, 1바이트를 구성하는 모든 8개의 비트(Bit)가 모두 "0"이라는 뜻이다.
short default: 0
int default: 0
long default: 0
float default: 0.0
double default: 0.0
boolean default: false
reference default: null // 문자 데이터(String)의 경우 초기화 없이는 아무런 기본값이 할당되지 않아 "null"로 표현되었다. (이는 문자값이 아니라, 참조할 값이 없다는 의미이다.)

참조:

(1) https://pixabay.com/photos/kids-play-games-childhood-4926029/

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet