이번 예제에서는 과목수를 고정값이 아닌, 선택할 수 있는 값으로 때에 달라지게 만들기 위해 생성자 오버로딩을 활용해 성적 프로그램을 만들어보았다.
package kr.s15.object.constructor;
class Student{
//멤버 변수
int korean;
int english;
int math;
int history;
int science;
int num;
public Student(int k, int e, int m) {
korean = k;
english = e;
math = m;
num = 3;
}
public Student(int k, int e, int m, int h, int s) {
korean = k;
english = e;
math = m;
history = h;
science = s;
num = 5;
}
//총점 구하기
public int getTotal() {
int total;
if(num == 3) {
total = korean + english + math;
}else {
total = korean + english + math + history + science;
}
return total;
}
//평균 구하기
public int getAverage() {
return getTotal() / num;
}
}
public class StudentMain {
public static void main(String[] args) {
Student st = new Student(90, 97, 95);
System.out.println("총점: " + st.getTotal());
System.out.println("평균: " + st.getAverage());
System.out.println("===============");
Student st2 = new Student(88, 82, 84, 87, 90);
System.out.println("총점: " + st2.getTotal());
System.out.println("평균: " + st2.getAverage());
}
}
Student의 멤버변수로 과목명 외에 과목수를 지정할 정수형 변수 int num;도 추가한다.
기본 생성자인 public Student(){}를 오버로딩하여 인자가 3개인 생성자와 인자가 5개인 생성자를 만들어준다.
각 생성자에서 전달받은 인자를 멤버변수에 대입해주는데, 이 과정은 언뜻 메서드의 수행문 같아 보이지만 그렇지 않다. '멤버변수를 초기화하는 과정'일 뿐이다.
반환 타입이 있는 형태로 총점을 구하는 메서드 getTotal()과 평균을 구하는 메서드 getAverage()를 만드는데, 이때 인자가 없는 이유는 외부로부터 새로 값을 전달받는 대신 객체 생성 시 기본으로 가지고 있는 '멤버변수'를 이용할 것이기 때문이다.
총점을 구하는 메서드는 인자의 개수에 따라 더해주어야 하는 멤버 변수의 개수가 달라지므로 if문을 활용해 조건을 나누어 준 다음 그에 맞는 멤버변수들을 더해준다.
반면 평균을 구하는 메서드의 경우, 각 생성자에 명시된 과목수를 지정한 변수 num을 이용해 나누어 주기 때문에 따로 조건 체크를 할 필요가 없다.
메인 영역에서 Student st = new Student(90, 97, 95); 과목수가 3과목인 경우와 Student st2 = new Student(88, 82, 84, 87, 90); 과목수가 5과목인 경우를 나누어 객체를 생성 후, 메서드를 호출하면 아래와 같이 출력되는 것을 확인할 수 있다.
출력)
총점: 282
평균: 94
===============
총점: 431
평균: 86