package thisjavaexam.immutable;
public class StudentMain {
public static void main(String[] args) {
//학생정보를 불러오기 위한 생성자 생성
Score score1 = new Score(90);
Score score2 = new Score(100);
Student std1 = new Student("홍길동",18,score1);
Student std2 = new Student("이몽룡",20,score2);
//Student클래스의 학생이름 나이 정보와, Score의 점수정보를 합쳐 출
System.out.println("학생1의 정보 = " + std1);
System.out.println("학생2의 정보 = " + std2);
}
}
우선 학생 의 점수를 변경해야 할때를 가정하여 간단하게 작성해본다.
필요한 클래스
1. 학생의 이름, 나이를 관리하는 "Student"클래스
2.점수를 변경해야할 "Score"클래스
3.실행할 Main클래스
점수 변경을 위한 Score 클래스 작성
package thisjavaexam.immutable;
public class Score {
//점수는 변경을 위해서 클래스를 별도 생
private int score;
//점수를 호출하기위한 생성자 생성
public Score(int score) {
this.score = score;
}
//게터 세터 생성
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return String.valueOf(score);
}
}
학생 나이 선언을 위해 Student클래스 작성
package thisjavaexam.immutable;
public class Student {
//학생 이름,나이 를 선언 + Score 클래스를 변수로 선언
private String name;
private int age;
private Score score;
//Main클래스에서 사용하기위한 생성자 생성
Student(String name, int age, Score score){
this.name = name;
this.age = age;
this.score = score;
}
//각각 게터 , 세터 생성
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
//name의 문자열이 임의클래스(내가만든 이클래스) 를 호출하면서 발생될 참조값 반환을 방지하기위한 오버라이딩
@Override
public String toString() {
return " 학생이름 : " + name + " ,나이 : " + age + " ,점수 : " + score ;
}
}
실행을 위한 Main클래스 작성
실행 결과를 확인해본다 .

우선 의도한 대로 나오긴 했다.
이제 학생2의 정보를 점수만 80점으로 깍아봐야겠다.
//private 로 선언되었기 때문에 setter를 사용하
score2.setScore(80);
//다시 잘 변경되었는지 확인
System.out.println("학생2 점수를 80 점으로 변경");
System.out.println("학생1의 정보 = " + std1);
System.out.println("학생2의 정보 = " + std2);

어라? 의도한건 ... 학생2의 정보를 수정하면, 학생1의 정보를 동시에 바꾸는거였는데... 잘된다....
이러면 안되는데 ?
이번엔 학생2의 나이를 30으로 바꿔보자..
package thisjavaexam.immutable;
public class StudentMain {
public static void main(String[] args) {
//학생정보를 불러오기 위한 생성자 생성
Score score1 = new Score(90);
Score score2 = new Score(100);
Student std1 = new Student("홍길동",18,score1);
Student std2 = new Student("이몽룡",20,score2);
//Student클래스의 학생이름 나이 정보와, Score의 점수정보를 합쳐 출
System.out.println("학생1의 정보 = " + std1);
System.out.println("학생2의 정보 = " + std2);
//private 로 선언되었기 때문에 setter를 사용하
score2.setScore(80);
//다시 잘 변경되었는지 확인
System.out.println("학생2 점수를 80 점으로 변경");
System.out.println("학생1의 정보 = " + std1);
System.out.println("학생2의 정보 = " + std2);
//이제 학생이 이몽룡의 나이를 수정해보자
std2.setAge(30);
//다시 잘 된건지 확인
System.out.println("학생2의 나이를 30으로 변경");
System.out.println("학생1의 정보 = " + std1);
System.out.println("학생2의 정보 = " + std2);
}
}

잘...됀다...
불변객체를 쓰는걸 연습하려고 짜본건데.....설계를 잘못했나부다 ..

'Java_library > Immutable_불변객체' 카테고리의 다른 글
| Immutable_불변객체 를 사용하는 이유2 (0) | 2025.05.05 |
|---|