Java/Java 기본

생성자

검정비니 2018. 6. 24. 22:32
728x90
반응형

생성자



앞에서 클래스는 객체를 생성하기 위한 설계도 또는 틀이며 객체는 설계도 또는 틀로 찍어낸 실체라고 하였다. 생성자는 객체가 생성될 때 초기화를 위해 실행되는 메소드이다.


예를 들어, 얼굴이라는 클래스로 사람 객체를 만들어낼 수 있다. 그런데, 만약 생성자 없이 그냥 객체를 생성한다면 새롭게 생성된 사람 객체는 아무런 옷도, 화장도, 돈도 없는 그냥 맨몸의 사람이 된다. 그런데, 생성자를 통해서 필요한 멤버 변수 등을 초기화 시켜준다면, 옷도 입고 경우에 따라 악세사리나 화장도 한 사람 객체가 될 것이다. 또한 생성자를 호출하여 매개 변수등을 이용해서 키나 몸무게, 머리 색깔, 성격 등을 다르게 하게 되면 다른 특징을 가진 사람 객체를 생성할 수 있다.




1. 생성자 선언과 호출


생성자는 객체가 생성되는 순간에 자동으로 호출되는 메소드로서 객체에 필요한 초기화를 수행하는 코드를 포함하고 있다. 다음 예시 코드를 통해서 생성자를 정의하고 활용하는 방법을 알아 보도록 하자.


i.e.


public class Samp {

int id;


public Samp(int x) { //생성자도 매개 변수를 자유롭게 가질 수 있다.

this.id = x;

}


public Samp() { //생성자도 오버로딩이 가능하다.

this.id = 0;

}


public void set(int x) {

this.id = x;

}


public int get() {

return this.id;

}


public static void main(String[] args) {

Samp ob1 = new Samp(3);

Samp ob2 = new Samp();

Samp s; //생성자 호출 안함 -> 객체 생성 안됨

}

}



1) 생성자의 이름은 클래스 이름과 동일하다.


클래스의 이름과 동일한 메소드가 바로 생성자이다.


2) 생성자는 new 키워드를 통해 객체를 생성할 때만 호출된다.


생성자는 오직 new를 통해 객체를 생성할 때만 호출된다. 다른 메소드들 처럼 아무때나 호출하는 메소드가 아니다.


3) 생성자도 오버로딩이 가능하다.


생성자도 메소드이므로 당연히 오버로딩 (매개 변수의 수와 타입이 다르다면 같은 이름의 생성자를 여러 개 가질 수 있다) 이 가능하며, 개발자는 여러 개의 생성자를 만들 수 있다.


4) 생성자는 리턴 타입을 지정할 수 없다.


생성자는 어떤 값도 리턴하지 않기 때문에 다음과 같이 어떤 리턴 타입도 선언해서는 안 된다. 이것은 일반 메소드가 아무 값을 리턴하지 않을 때 void를 리턴 타입으로 지정하는 것과는 다르다.


i.e.   public Samp(int x) { this.id = x; }




2. 생성자의 용도


생성자의 주된 용도는 필드를 초기화하거나 객체가 처음 생성되는 순간에 처리할 작업을 수행하는 데 있다. 객체를 생성하면 필드들의 메모리 공간이 할당되지만 아직 값을 가지지 못한 상태이다. 생성자를 이용하면 필드들을 생성할 당시 초깃값을 지정할 수 있다. 다음 예제를 통해 알아보도록 하자.


i.e.

public class Samp {

public Samp(int x, String s) {

this.id = x; //멤버 변수 id를 매개 변수 x로 초기화 시킴.

this.str = s; //멤버 변수 str을 레퍼런스 변수 s가 가리키는 문자열 객체로 초기화 시킴.

this.fl = 3.5; //멤버 변수 fl을 3.5로 초기화 시킴.

}


int id;

String str;

float fl;

}




3. 기본 생성자 (default constructor)


기본 생성자란 인자도 없고 실행 내용도 없이 단순 리턴하는 생성자이다. 기본 생성자를 디폴트 생성자라고도 부른다.


1) 기본 생성자가 자동으로 생성되는 경우


생성자가 없는 클래스는 있을 수 없다. 객체를 만드는 데 있어서 생성자는 필수불가결한 존재이기 때문이다. 그래서, 만약 클래스에 생성자가 하나도 선언되어 있지 않으면 컴파일러가 기본 생성자를 자동으로 생성한다. 그 이유는 객체가 생성될 때 반드시 생성자가 호출되어야 하기 때문이다.


만약 아래와 같이 생성자가 정의되지 않은 클래스를 컴파일 할 경우에는 어떻게 될까?


public class DefaultConstructorEx {

private int x;

public void setX(int x) {

this.x = x;

}


public int getX() {

return this.x;

}

}


위의 클래스를 컴파일 한다면 컴파일러는 자동으로 아무 기능도 하지 않는 기본 생성자를 클래스 맨 위 쪽에 추가한다.


public class DefaultConstructorEx {

public DefaultConstructorEx() {} //컴파일러는 이렇게 클래스의 가장 윗쪽에 아무 기능도 안 하는 기본 생성자를 추가한다.

private int x;

public void setX(int x) {

this.x = x;

}


public int getX() {

return this.x;

}

}


2) 기본 생성자가 자동으로 생성되지 않은 경우


생성자가 하나라도 존재하는 클래스에는 자동으로 기본 생성자가 삽입되지 않는다. 기본 생성자가 자동으로 생성되는 경우는 클래스 내에 생성자가 하나도 없는 경우에만 해당한다.


반응형

'Java > Java 기본' 카테고리의 다른 글

객체의 소멸  (0) 2018.06.25
this(), 다른 생성자 호출  (0) 2018.06.25
this 키워드  (0) 2018.06.23
다형성  (0) 2018.06.23
메소드 오버로딩  (0) 2018.06.23