자바

생성자 오버로딩

긴가우딘 2024. 6. 27. 16:30

예전에 손코딩 시험을 보던 중 오버로딩 문제가 나왔다

public class Main {
    public static void main(String[] args) {
        School school1 = new School();
        school1.printInfo();
        
        School school2 = new School("홍길동");
        school2.printInfo();
        
        School school3 = new School("홍길동", 15);
        school3.printInfo(); 
    }
}

 

자세히 기억은 안나지만 이런 종류의 문제였는데

School 클래스를 직접 적는 문제였다

처음 봤을 때 쉽다고 생각했는데

손코딩을 준비해본 적이 없고 정처기 공부하면서 준비되어 있는 문제를 풀기나 할 수 있었지 직접 적으려니 이게 맞나 저게 맞나 하면서

class School {
    String name;
    int age;
    
    public School(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

이런 식으로 요거 하나 달랑 적었었다

심지어 이것도 gpt 도움으로 예제 만든 것이지 이렇게 this 키워드 적어가면서 하지도 않았던 것 같다(문제가 제대로 기억이 안난다만..)

그리고 오버로딩도 메소드 오버로딩만 알고 있었지 생성자 오버로딩은 알지 못했다

class School {
    String name;
    int age;
    
    // 매개변수가 없는 기본 생성자
    public School() {
        this.name = "이름 없음";
        this.age = 0;
    }
    
    // 이름을 받는 생성자
    public School(String name) {
        this.name = name;
        this.age = 0;
    }
    
    // 이름과 나이를 받는 생성자
    public School(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 학생 정보를 출력하는 메소드
    public void printInfo() {
        System.out.println("이름: " + this.name + ", 나이: " + this.age);
    }
}

public class Main {
    public static void main(String[] args) {
        // 기본 생성자를 사용한 객체 생성
        School school1 = new School();
        school1.printInfo(); // 출력: 이름: 이름 없음, 나이: 0
        
        // 이름만 받는 생성자를 사용한 객체 생성
        School school2 = new School("홍길동");
        school2.printInfo(); // 출력: 이름: 홍길동, 나이: 0
        
        // 이름과 나이를 받는 생성자를 사용한 객체 생성
        School school3 = new School("홍길동", 15);
        school3.printInfo(); // 출력: 이름: 홍길동, 나이: 15
    }
}

 

생성자 오버로딩을 통해 객체를 만들 때 다양한 초기화 방법을 제공할 수 있고,

객체를 생성할 때 필요한 정보를 유연하게 설정할 수 있다

또 코드의 가독성과 일관성도 높일 수 있다

 

이러한 장점이 있다 한들 왜 생성자를 이렇게 여러개 만드는 걸까?

메소드를 여러개 만드는 대신 생성자 오버로딩을 사용하면, 중복되는 코드를 줄일 수 있다고 한다

예를 들어, setName, setAge 등의 메소드를 각각 호출해야 한다면 그 만큼의 코드가 중복되고 관리해야 할 메소드도 많아지게 된다

class School {
    String name;
    int age;

    // 기본 생성자
    public School() {
        this.name = "이름 없음";
        this.age = 0;
    }
    
    // 이름 설정 메소드
    public void setName(String name) {
        this.name = name;
    }

    // 나이 설정 메소드
    public void setAge(int age) {
        this.age = age;
    }

    // 학생 정보를 출력하는 메소드
    public void printInfo() {
        System.out.println("이름: " + this.name + ", 나이: " + this.age);
    }
}

public class Main {
    public static void main(String[] args) {
        School school1 = new School();
        school1.setName("홍길동");
        school1.setAge(15);
        school1.printInfo(); // 출력: 이름: 홍길동, 나이: 15

        School school2 = new School();
        school2.setName("이몽룡");
        school2.printInfo(); // 출력: 이름: 이몽룡, 나이: 0
        
        School school3 = new School();
        school3.printInfo(); // 출력: 이름: 이름 없음, 나이: 0
    }
}

 

메인 클래스에서 출력 방식이 더 간결해지는 것처럼 보이긴 하다