Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

생성자 메소드(Default constructor) 본문

Java

생성자 메소드(Default constructor)

빌드이너프 2023. 2. 6. 14:39

생성자 메소드(Default constructor)

  • 클래스로부터 객체를 만들 때 객체 변수들의 값을 특정한 값으로 초기화할 수 있게 함
  • 생성자 메소드는 new 연산자를 사용할 때 호출되는 특별한 메소드

 

생성자 메소드의 특별한 점

  1. 클래스 이름과 같은 이름을 가짐
  2. 반환하는 값을 가지지 않으므로 메소드 이름 앞에 반환 유형이 없다
흔한 오류는 메소드에 반환유형을 추가하는 것

기본 생성자 메소드

  • 한 클래스 내에 생성자 메소드를 반드시 정의할 필요 없음
  • 어떤 클래스 내에 생성자 메소드를 정의하지 않는다면 자바는 자동적으로 기본 생성자 메소드를 그 클래스 내에 추가함
  • 그 클래스의 객체를 만들 때 기본 생성자 메소드가 자동적으로 호출됨
  • 기본 생성자 메소드는 어떠한 매개변수도 가지지 않고 아무 일도 하지 않는다
  • 기본 생성자 메소드는 객체 변수들의 값을 표준 자바의 기본 값들로 초기화함
  • -> 숫자형 변수들은 0으로, 논리형 변수들은 flase, 참조형 변수들은 null로 초기화함

예시1

// 학생의 성적 기록을 나타냄
import java.util.Scanner;
public class Student {
    // 객체 변수들
    public String name; // 이름
    public int assignmentScore; // 과제 점수
    public int examScore; // 시험 점수

    // 객체 메소드들
    // 현 Student 객체의 정보에 대한 문자열을 반환함
    public String toString()
    {
        String str = "";
        str += "이름: " + name + "\n";
        str += "과제 점수: " + assignmentScore + "\n";
        str += "시험 점수: " + examScore + "\n";
        str += "학점: " + examScore + "\n";
        return str;
    }

    // 학생의 학점을 반환
    public char getGrade()
    {
        char letterGrade; // 학생의 학점
        double total; // 학생의 점수들의 총점

        // 학생의 점수들의 총점을 계산함
        total = assignmentScore*0.4 + examScore*0.6;

        // 총점에 따라 학점을 부여함
        if (total >= 90) letterGrade = 'A';
        else if (total >= 80) letterGrade = 'B';
        else if (total >= 70) letterGrade = 'C';
        else if (total >= 60) letterGrade = 'D';
        else letterGrade = 'F';

        return letterGrade;
    }
}
  • 예시 1의 Student 클래스에는 생성자 메소드가 정의되지 않았다
  • 따라서 자바는 그 클래스에 기본 생성자 메소드를 추가한다

기본 생성자 메소드 추가

public Student()
{

}

예시 2. Student 클래스로 부터 객체 생성

// Student 클래스와 그 메소드들을 사용함
public class StudentDriver {
    public static void main(String[] args) {
        // 첫 번째 학생을 나타내는 객체를 만듬
        Student stud1 = new Student();

        // 첫 번쨰 학생의 이름 정함
        stud1.name = "선남";

        // 첫 번째 학생의 과제 점수 줌
        stud1.assignmentScore = 91;

        // 첫 번째 학생의 시험 점수 줌
        stud1.examScore = 84;

        // 첫 번째 학생의 이름, 점수들과 학점 출력
        System.out.println(stud1.toString());


        // 두 번째 학생을 나타내는 객체 만듬
        Student stud2 = new Student();

        // 두 번쨰 학생의 이름 정함
        stud2.name = "선녀";

        // 두 번째 학생의 과제 점수 줌
        stud2.assignmentScore = 86;

        // 두 번째 학생의 시험 점수 줌
        stud2.examScore = 95;

        // 두 번째 학생의 이름, 점수들과 학점을 출력
        System.out.println(stud2.toString());
    }
}

 

예시2에서 예시 1의 Student 클래스로부터 객체를 생성하기 위해 다음과 같은 문 사용

Student stud1 = new Student();
  • Student 클래스로부터 한 객체를 생성한 후 stud1이 그 객체를 가리키게 함
  • 그 객체의 객체 변수들은 기본 값들로 초기화됨
  • 자바 문을 포함하지 않는 기본 생성자 메소드를 대신하여 자바 문을 포함하는 새로운 기본 생성자 메소드를 정의하여 사용할 수 있음

생성자 메소드 정의

  • 기본 생성자 메소드가 컴파일러에 의해 자동적으로 추가된다고 해도 그것에 의존해서는 안됨
  • 객체를 생성할 때 객체 변수들의 값을 초기화하고 그 밖의 다른 초기화 작업들을 수행하고 싶을 수 있음
    • 그런 경우 클래스 내에 생성자 메소드를 정의해야함
  • 생성자 메소드는 우리가 객체를 생성할 때 해야할 어떤 일도 수행할 수 있음
    • 그러나 대부분의 경우 생성자 메소드에서 객체 변수들의 값을 초기화하고 추가적으로 필요한 다른 초기화 작업들을 수행함
  • 어떤 클래스 내에 생성자 메소드를 정의하면 자동적으로 기본 생성자 메소드는 추가되지 않음
    • 이 경우 객체를 생성하기 위해 더 이상 기본 생성자 메소드를 호출할 수 없다
class Student
{
    public Student (int x)
    {
        ...
    }
    
    ...
    
}
  • 위의 코드처럼 한 클래스를 정의한다고 가정하면
Student std = new Student();
  • 다음과 같은 문은 기본 생성자 메소드가 없기 때문에 유효하지 않게된다

생성자 메소드 다중 정의

  • 한 클래스내에 여러 개의 생성자 메소드들이 정의될 수 있음
  • 각 생성자 메소드는 고유한 형식 매개 변수 목록을 가져가야함(생성자 메소드들은 서로 구별되야 함)
  • 즉, 생성자 메소드의 매개 변수들의 수가 다르거나 매개 변수들의 수가 같다면 적어도 하나의 매개 변수의 데이터 형이 서로 달라야 함
    • 이는 생성자 메소드 호출시 정확히 하나의 생성자 메소드에 대응되는 것을 보장함

  • 예를 들어 String 클래스는 다음과 같은 두 개의 생성자 메소드를 가짐
public String()
public String(String value)

 

  • String 클래스의 생성자 메소드를 호출할 수 있다
String strInput1 = new String();
String strInput2 = new String("Year 2000");
  • 첫 번째 문은 생성자 메소드를 입력 매개 변수 없이 호출하므로 첫 번째 생성자 메소드(public String())에 대응됨
  • 두 번째 문은 생성자 메소드를 String 형의 매개 변수 값을 가지고 호출하므로 두 번째 생성자 메소드(public String(String value))에 대응됨
  • 위의 문들을 수행하면 strInput1은 빈 문자열(""), strInput2는 "Year 2000"을 포함하는 문자열을 가리키게됨

사람을 모델하는 클래스

// 사람을 모델함
public class Person {
    String name; // 이름을 나타내는 변수
    int age; // 나이를 나타내는 변수

    // 생성자 메소드 - 이름만 초기화
    public Person(String NewName)
    {
        setName(NewName);
    }

    // 생성자 메소드 - 나이만 초기화
    public Person(int NewAge)
    {
        setAge(NewAge);
    }

    // 생성자 메소드 - 이름과 나이를 초기화함
    public Person(String NewName, int NewAge)
    {
        setName(NewName);
        setAge(NewAge);
    }

    // 변경자 메소드

    // 이름을 주어진 값으로 변경함
    public void setName(String NewName)
    {
        name = NewName;
    }

    // 나이를 주어진 값으로 변경함
    public void setAge(int NewAge)
    {
        age = NewAge;
    }

    // 접근자 메소드

    // 이름 반환
    public String getName()
    {
        return name;
    }

    // 나이 반환
    public int getAge()
    {
        return age;
    }

    // 현 Person 객체의 정보에 대한 문자열 반환
    public String toString()
    {
        return (name + "\t\t" + age);
    }
}

 

Person 클래스를 이용하는 프로그램

// Person 객체를 만들어 이용함
public class PersonDriver {
    public static void main(String[] args) {

        // 이름이 '홍길동'인 Person 객체를 생성하고 p1이 가리키게 함
        Person p1 = new Person("홍길동");
        // p1의 나이를 27로 변경
        p1.setAge(27);
        // p1의 이름과 나이를 출력
        System.out.println(p1.toString());


        // 나이가이 18인 Person 객체를 생성하고 p2이 가리키게 함
        Person p2 = new Person("홍길동");
        // p2의 이름을 '손오공'으로 변경
        p2.setName("손오공");
        // p2의 이름과 나이를 출력
        System.out.println(p2.toString());

        // 이름 '이도령'이고 나이가 20인 Person 객체를 생성하고 p3이 가리키게 함
        Person p3 = new Person("이도령", 20);
        // p3의 이름과 나이를 출력
        System.out.println(p3.toString());
    }
}

 

출력 결과

홍길동 27
손오공 0
이도령 20
  • Person 객체를 만들기 위해 호출하는 생성자 메소드가 Person 클래스 내의 3개의 생성자 메소드들 중 어느 것인가는 실제 매개 변수의 수와 데이터 형이 결정함
  • 첫 번째 문은 String 형의 매개 변수 값을 가지고 호출하므로 첫 번째 생성자 메소드가 호출됨
    • p1이 가리키는 Person 객체는 name 은 "홍길동"이라는 문자열 객체를 가리키고 age는 기본 값인 0으로 초기화됨
  • 두 번째 문은 int 형의 매개 변수 값을 가지고 호출하므로 두 번째 생성자 메소드가 호출됨
    • p2가 가리키는 Person 객체는 name 은 기본 값인 null 이라는 값을 age 18이라는 값을 가짐
  • 세 번째 문은 String 형의 매개 변수 값과 int 형의 매개 변수 값을 가지고 호출하므로 세 번째 메소드가 호출됨
    • p3가 가리키는 Person 객체는 name은 "이도령"이라는 문자열 객체를 가리키고 age는 20이라는 값을 가짐