[Java] 생성자와 기본 생성자

벼랑 끝 코딩·2025년 2월 21일
0

Java

목록 보기
11/40

생성자

객체는 생성자를 필요로 한다.
즉 생성자를 통해서만 객체를 생성할 수 있다.
생성자가 필요한 이유 중 하나는, 객체의 필드를 간편하게 초기화하기 위해서이다.

class User {
	public String name;
}

public void method() {
	User user = new User();
    user.name = "name1";
}

생성자가 없다면 어떻게 될까?
생성자의 필드를 일일이 초기화 해주어야 한다.
지금은 필드가 한 개지만, 여러 필드가 있는 경우
코드 row수가 증가하여 가독성을 해치는 주범이 될 것이다.

class User {
	public String name;
    
    // 생성자 추가
    public User(String name) {
    	this.name = name;
    }

public void method() {
	User user = new User("name1");
}

생성자를 추가하면 파라미터로 값을 넘겨서 객체의 필드를 초기화하고 객체를 생성할 수 있다.
코드 한줄로 객체 생성부터 객체의 필드 초기화까지 가능하다.

기본 생성자

class User {
	public String name;
}

public void method() {
	User user = new User(); // 기본 생성자
    user.name = "name1";
}

객체에 파라미터를 넘겨서 생성자를 사용했는데,
우리는 지금 껏 객체에 파라미터로 아무것도 넘기지 않고 사용하지 않았는가.
매개변수가 없는 생성자, 이것이 바로 기본 생성자다.
우리는 이걸 클래스에 정의한 적이 없다.
그렇다, 기본 생성자는 클래스에 생성자가 하나도 없으면 자동으로 만들어준다.
클래스에 생성자가 있는 경우, 기본 생성자를 만들지 않는다.

제약

클래스에 생성자가 있는 경우, 기본 생성자를 만들지 않았다.
생성자를 만들어 반드시 필드를 초기화하도록 제약을 걸어둠으로써,
우리는 필드를 초기화하지 않는 실수를 범하지 않을 수 있다.

class User {
	public String name;
    
    // 생성자 추가
    public User(String name) {
    	this.name = name;
    }

public void method() {
	User user1 = new User(); // 컴파일 오류 발생
    User user2 = new User("name2");
}

User 객체를 생성할 때, 깜빡하고 파라미터로 값을 전달하지 않으면,
생성자를 정의한 경우 컴파일 오류가 발생한다.
빈 껍데기가 생길 뻔 했는데, 친절하게 컴파일 오류를 확인하여 실수를 잡을 수 있다.
필드를 간편하게 초기화 할 수 있다는 이점도 있지만,
필수로 초기화해야 하는 필드를 생성자로 제약을 걸어둠으로써
우리는 좀 더 단단한 객체와 코드를 만들어낼 수 있다.

생성자 오버로딩

생성자도 오버로딩이 가능하다.
오버로딩에 대한 글은 다음 글을 참고하자.

class User {
	public String name;
    public int age;
    
    // 생성자 추가
    public User(String name) {
    	this.name = name;
    }
    
    // 생성자 오버로딩
    public User(String name, int age) {
    	this.name = name;
        this.age = age;
    }

public void method() {
	User user1 = new User("name1"); // user1.name = "name1", user1.age = 0
    User user2 = new User("name2", 20); // user2.name = "name2", user2.age = 20
}

this 메서드

this 메서드를 활용하면 생성자 오버로딩에서 코드를 간소화할 수 있다.
this 메서드는 다른 생성자를 호출하는 역할을 한다.

class User {
	public String name;
    public int age;
    
    // 생성자 추가
    public User(String name) {
    	this(name, 20); // this 메서드
    }
    
    // 생성자 오버로딩
    public User(String name, int age) {
    	this.name = name;
        this.age = age;
    }
}

만약 파라미터로 넘어오지 않은 필드를 특정 값으로 초기화해야 하는 경우,
this 메서드를 사용하여 row 수를 줄일 수 있다.
(특정 값으로 초기화해야 할 필드가 많은 경우 활용 가능)

profile
복습에 대한 비판과 지적을 부탁드립니다

0개의 댓글