충분히 쌓여가는
생성자 메소드(Default constructor) 본문
생성자 메소드(Default constructor)
- 클래스로부터 객체를 만들 때 객체 변수들의 값을 특정한 값으로 초기화할 수 있게 함
- 생성자 메소드는 new 연산자를 사용할 때 호출되는 특별한 메소드
생성자 메소드의 특별한 점
- 클래스 이름과 같은 이름을 가짐
- 반환하는 값을 가지지 않으므로 메소드 이름 앞에 반환 유형이 없다
흔한 오류는 메소드에 반환유형을 추가하는 것
기본 생성자 메소드
- 한 클래스 내에 생성자 메소드를 반드시 정의할 필요 없음
- 어떤 클래스 내에 생성자 메소드를 정의하지 않는다면 자바는 자동적으로 기본 생성자 메소드를 그 클래스 내에 추가함
- 그 클래스의 객체를 만들 때 기본 생성자 메소드가 자동적으로 호출됨
- 기본 생성자 메소드는 어떠한 매개변수도 가지지 않고 아무 일도 하지 않는다
- 기본 생성자 메소드는 객체 변수들의 값을 표준 자바의 기본 값들로 초기화함
- -> 숫자형 변수들은 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이라는 값을 가짐
'Java' 카테고리의 다른 글
StringBuilder (0) | 2023.02.06 |
---|---|
객체와 참조 (0) | 2023.02.06 |
메소드 다중 정의(method overloading) (3) | 2023.02.04 |
접근자 메소드(get method) / 변경자 메소드(set method (1) | 2023.02.04 |
접근 수정자(Access Modifier) public / private (0) | 2023.02.03 |