자바 생성자에 대한 질문입니다.
조회수 1096회
안녕하세요! 아래의 코드는 생성자에서 조건에 맞는 날짜로 초기화 하지 않는 경우 isValid()를 통해 유효한 날짜인지 아닌지를 출력하는 코드 입니다.
예를 들어 2018년 2월 30일로 인스턴스를 생성한 경우 isValid()메서드를 실행하면 wrong이 출력됩니다.
제가 질문하고 싶은 것은 생성자에서 setYear setMonth setDay 순서대로 하면 원하는 값이 나오는데 setDay setMonth setYear순으로 하면 잘못된 값이 출력 됩니다.
생성자안에서 setter 메서드의 사용순서가 왜 결과에 영향을 미치는지 알 수 있을까요?
public class MyDate {
private int day;
private int month;
private int year;
boolean isValid=true;
public MyDate(int day, int month, int year) {
setYear(year);
setMonth(month);
setDay(day);
}
public int getDay() {
return day;
}
public void setDay(int day) {
switch(month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if (day <0 || day >31) {
isValid = false;
}
else {
this.day = day;
}
break;
case 4: case 6: case 9: case 11:
if (day <0 || day >30) {
isValid = false;
}
else {
this.day = day;
}
break;
case 2:
if (day <0 || day >28) {
isValid = false;
}
else {
this.day = day;
}
break;
default:
isValid = false;
}
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if(month>=1 && month<=12)
this.month = month;
else
isValid=false;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String isValid() {
if(isValid==true)
return "Right";
else
return "Wrong";
}
}
수정해서 올립니다! 아래는 위의 클래스에 대한 인스턴스를 생성하는 코드 입니다.
public class MyDateTest {
public static void main(String[] args) {
MyDate d1=new MyDate(30,2,2018);
MyDate d2=new MyDate(30,3,2018);
System.out.println("2018년 2월 30일이 나와야 함");
System.out.println(d1.getYear());
System.out.println(d1.getMonth());
System.out.println(d1.getDay());
System.out.println(d1.isValid());
System.out.println("2018년 3월 30일이 나와야 함");
System.out.println(d2.getYear());
System.out.println(d2.getMonth());
System.out.println(d2.getDay());
System.out.println(d2.isValid());
}
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
setDay() 메서드에서 private 변수인 month를 체크하고 있어서 그렇습니다.
setMonth()가 setDay()에 앞서서 실행되지 않으면(반대로 setDay가 먼저 실행되는 상황이면) setDay()에서 아직 빈 값인 month값이 switch... case 문을 제대로 통과하지 못하네요.
-
각 Setter에 들어갈 변수는 그대로 두고 Setter이름만 바꿔서 테스트하신게 아닐까요? 구현에는 문제가 없어보입니다.
댓글 입력