프로그래밍 언어/JAVA

생성자

· 코딩마이데이

생성자의 개념과 목적

생성자(constructor)는 객체가 생성될 때 객체초기화를 위해 실행되는 메소드입니다.

 

생성자 선언 및 활용

생성자는 객체가 생성되는 순간에 자동으로 호출되는 메소드로서, 객체에 필요한 초기화를 실행하는 코드를 담아야 합니다.

 

두 개의 생성자를 가진 Circle 클래스

public class Circle {
    int radius;
    String name;

    public Circle() { // 매개 변수 없는 생성자
        radius = 1; name = ""; // 필드 초기화
    }

    public Circle(int r, String n) { // 매개 변수를 가진 생성자
        radius = r; name = n; // 매개 변수로 필드 초기화
    }

    public double getArea() {
        return 3.14 * radius * radius;
    }

    public static void main(String[] args) {
        Circle pizza = new Circle(10, "자바피자"); // 객체 생성. 반지름을 10으로, 이름을 "자바 피자"로 초기화

        double area = pizza.getArea();
        System.out.println(pizza.name + " 의 면적은 " + area);

        Circle donut = new Circle(); // 객체 생성. 번지름을 1, 이름을 ""로 초기화
        donut.name = "도넛피자"; // 이름 변경
        area = donut.getArea();
        System.out.println(donut.name + "의 면적은 " + area);
    }
}

 

실행 결과

자바피자 의 면적은 314.0
도넛피자의 면적은 3.14

 

생성자의 이름은 클래스 이름과 동일합니다.

생성자의 이름은 반드시 클래스 이름과 동일하게 작성해야 합니다.

public class Circle {
	public Circle(int r, String n) { ... }; // 생성자
}

 

 

생성자는 여러 개 작성(오버로딩)할 수 있습니다.

매개변수의 개수와 타입만 다르다면, 클래스 내에 생성자를 여러 개 둘 수 있습니다.

public class Circle {
	public Circle() { ... } // 매개 변수 없는 생성자
	public Circle(int r, String n) { ... } // 2개의 매개 변수를 가진 생성자
}

 

생성자는 new를 통해 객체를 생성할 때 한 번만 호출됩니다.

Circle pizza = new Circle(10, "자바피자"); // 생성자 Circle(int r, String n) 호출
Circle donut = new Circle(); // 생성자 Circle() 호출

 

생성자에 리턴 타입을 지정할 수 없습니다.

public Circle() { ... }; // 리턴 타입 선언하지 않음

 

리턴 값이 없다고 해서, void를 리턴 타입으로 지정하면 안됩니다.

public void Circle() { ... } // 오류. void를 리턴 타입으로 사용할 수 없습니다.

 

하지만, 생성자에서 return 문을 사용할 수 없다는 뜻은 아닙니다. return 문은 메소드의 실행을 끝내고 호출한 곳으로 돌아가라는 명령이므로, 생성자의 실행을 끝내고자 하면 생성자 코드 내 어디서든 return; 문을 사용하면 됩니다.

 

생성자의 목적은 객체에 생성될 때, 필요한 초기 작업을 위함입니다.

Circle pizza = new Circle(10, "자바피자"); // 생성자 Circle(int r, String n) 호출

 

생성자는 객체가 생상될 때, 필드 초기화, 필요한 메모리 확보, 파일 열기, 네트워크 연결 등 객체가 활동하기 전에 필요한 초기 준비를 하는데 이용됩니다.

 

생성자 선언 및 활용 연습

public class Book {
    String title;
    String author;

    public Book (String t) { // 생성자
        title = t;
        author = "작자미상";
    }

    public Book(String t, String a) { // 생성자
        title = t;
        author = a;
    }

    public static void main(String[] args) {
        Book littlePrince = new Book("어린왕자", "생텍쥐페리"); // 생성자 Book(String t, String a) 호출
        Book loveStory = new Book("춘향전"); // 생성자 Book(String t) 호출
        System.out.println(littlePrince.title + " " + littlePrince.author);
        System.out.println(loveStory.title + " " + loveStory.author);
    }
}

 

실행결과

어린왕자 생텍쥐페리
춘향전 작자미상

 

기본 생성자

매개변수와 실행 코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자입니다. 디폴트 생성자라고도 부릅니다.

class Circle {
	public Circle() { } // 기본 생성자. 매개변수 없고 아무 일 없이 단순 리턴
}

 

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

생성자가 없는 클래스는 있을 없습니다. 객체가 생성될 때 반드시 생성자가 실행되기 때문입니다. 그러므로 생성자가 하나도 없는 경우, 컴파일러는 기본 생성자를 자동으로 생성합니다.

Circle pizza = new Circle(); // 생성자 Circle() 호출

 

자바 컴파일러기본 생성자삽입해야 합니다.

생성자가 하나도 만들어져 있지 않은 클래스

 

자바 컴파일러에 의해 자동으로 기본 생성자 삽입

 

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

생성자가 하나라도 클래스에는 컴파일러가 기본 생성자를 삽입해 주지 않습니다.

Circle pizza = new Circle(10); // Circle(int r) 호츨
public Circle(int r) {
	radius = r;
}
Circle donut = new Circle(); // 컴파일 오류. 생성자 Circle() 없음

컴파일러가 기본 생성자를 자동으로 삽입되지 않은 경우

 

this 레퍼런스

this는 자바의 중요한 키워드로서 단어 뜻 그대로 객체 자신을 가리키는 레퍼런스입니다.

 

this의 기초 개념

this는 현재 객체 자신에 대한 레퍼런스입니다.

보다 정확히 말하면 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스입니다.

this는 컴파일러에 의해 자동으로 관리됩니다.

 

public cass Circle {
	int radius;
	public Circle(int r) { this.radius = r; }
	public int getRadius() { return radius; }
}

 

this는 현재 객체에 대한 레퍼런스입니다.

 

this의 필요성

return radius; // return this.radius;와 동일

 

매개변수의 이름은 그 자체로서 코드를 읽는 사람에게 그 용도를 나타내므로, 적합한 이름을 붙이는 것은 매우 중요합니다.

public Circle(int radius) { radius = radius; } // 여기서 2개의 radius는 모두 매개변수 radius를 접근합니다.

 

매개변수의 이름을 멤버 변수와 같은 이름으로 붙이고자 하는 경우가 많은데, 이 때 this을 이용하면 됩니다.

public Circle(int radius) { this.radius = radius; }

 

또, 매소드가 객체 자신의 래퍼런스를 리턴해야 하는 경우가 있는데, 이때 this를 리턴하면 됩니다.

public Circle getMe() { return this; } // getMe() 메소드는 객체 자신의 레퍼런스 리턴

 

this의 상세 설명

객체 속에서의 this

 

this()로 다른 생성자 호출

this()는 클래스 내에서 생성자가 다른 생성자호출할 때 사용하는 자바 코드입니다.

 

this()로 다른 생성자 호출

public class Book {
    String title;
    String author;

    void show() {
        System.out.println(title + " " + author);
    }
    
    public Book() {
        this("", "");
        System.out.println("생성자 호출됨");
    }

    public Book (String title) {
        this(title, "작자미상");
    }

    public Book(String title, String author) { // 생성자
        this.title = title;
        this.author = author;
    }

    public static void main(String[] args) {
        Book littlePrince = new Book("어린왕자", "생텍쥐페리");
        Book loveStory = new Book("춘향전");
        Book emptyBook = new Book();
        loveStory.show();
    }
}

 

실행 결과

생성자 호출됨
춘향전 작자미상

 

this 사용시 주의할 점

  • this()는 반드시 생성자 코드에서만 호출할 수 있습니다.
  • this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용됩니다.
  • this()는 반드시 생성자의 첫번째 문장이 되어야 합니다.
public Book() {
	System.out.println("생성자 호출됨");
	this("", ""); // 컴파일 오류. this()는 생성자의 첫 번째 문장이어야 함
}

 

 

객체 치환 시 주의할 점

객체의 치환 사례

실행 결과

ob1.radius=2

ob2.radius=2

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

메소드 활용  (1) 2025.02.01
객체 배열  (1) 2025.01.31
자바 클래스 만들기  (0) 2025.01.29
객체 지향과 자바  (0) 2025.01.28
자바의 예외 처리  (0) 2025.01.28