static int serialNum;
(예약어/자료형/변수이름)
: Static변수 = 정적변수 = 클래스변수
: 인스턴스마다 따로 생성되는 변수가 아닌, 클래스 전반에서 공통으로 사용하는 기준변수
: 인스턴스 생성과 상관없이 먼저 생성되므로 인스턴스 없이도 사용가능
Q. static 변수가 인스턴스에서 공유되는지 확인해보기.
public class StudentId {
public static int serialNum = 1000; // static 변수는 인스턴스와 상관없이 먼저 생성됨
public int studentID;
public String studentName;
public int grade;
public String address;
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName=name;
}
}
public class StudentIdTest {
public static void main(String[] args) {
StudentId studentLee = new StudentId(); //개념상으론 student생성자인데 클래스이름을 student id로 해놔서...
studentLee.setStudentName("이모씨");
System.out.println(studentLee.serialNum); // static변수라 이탤릭체로 표기됨
studentLee.serialNum++; // static 변수값 증가
StudentId studentSon = new StudentId();
studentSon.setStudentName("손모씨");
System.out.println(studentSon.serialNum);
System.out.println(studentLee.serialNum); // 두개의 참조변수가 동일한 변수의 메모리를 가리키므로 lee의 번호도 1001
}
}
Q. student1생성자 만들기 (아직까지 static은 public class)
public class Student1 {
public static int serialNum = 1000;
public int studentID;
public String studentName;
public int grade;
public String address;
public Student1() { // 생성자 이름은 클래스 이름과 같다
serialNum++; // 학생이 생성될 때마다 증가
studentID=serialNum; // 증가된 값을 학생 인스턴스 변수에 부여
/* static변수를 바로 학번에 부여하면 안되는게, 모든 인스턴스가 공유하므로 모든 학생이 같은 값을 가지게 됨
학번은 학생의 고유번호이므로 학생의 멤버변수로 선언해주고 학생이 한명 생성될 때마다 증가한 serialNum값을 대입해줘야함 */
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName=name;
}
}
public class Student1Test {
public static void main(String[] args) {
Student1 studentLee = new Student1();
studentLee.setStudentName("이모씨");
System.out.println(Student1.serialNum); // serialNum 변수를 직접 클래스 이름으로 참조.
System.out.println(Student1.serialNum + "/ 학번: " + studentLee.studentID);
Student1 studentSon = new Student1();
studentSon.setStudentName("손모씨");
System.out.println(Student1.serialNum);
System.out.println(Student1.serialNum + "/ 학번: "+ studentSon.studentID);
}
}
Q. static 변수와 static 메서드 연습하기 - 190p
학생마다 각각 다른 학생카드가 발급된다. 학생 카드 번호는 학번에 100을 더한 값이다.
class에 학생 카드 번호 멤버 변수를 추가하고, 학생이 생성될때마다 학생카드번호를 부여한다.
test에 학생 두명을 생성한다. 두 명의 카드번호를 출력할 것.
* student1 class생성- serialNum,cardNum은 private static으로 클래스 메서드 구현
public class Student1 {
private static int serialNum = 1000;
private static int cardNum=100;
public int studentCard;
public int studentID;
public String studentName;
public int grade;
public String address;
public Student1() { // 생성자 이름은 클래스 이름과 같다
serialNum++; // 학생이 생성될 때마다 증가
studentID=serialNum; // 증가된 값을 학생 인스턴스 변수에 부여
studentCard=serialNum+cardNum; // 카드값은 학번에 100을 더한 값
}
public String getStudentName() { // studentName의 get()메서드
return studentName;
}
public void setStudentName(String name) { // StudentName의 set()메서드
studentName=name;
}
public static int getSerialNum() { // serialNum의 get() 메서드
int i=10; // 아무리봐도 이 i값이 어디에 쓰이는지 모르겠다... 왜 선언해준거지?
return serialNum;
}
public static void setSerialNum(int serialNum) { // serialNum의 set()메서드
Student1.serialNum=serialNum;
}
public static int getCardNum() { //cardNum의 get() 메서드
return cardNum;
}
public static void setCardNum(int cardNum) { //cardNum의 set() 메서드
Student1.cardNum=cardNum;
}
}
* int i=10;은 카페에 꼭 물어봐야지.
* * 정답 보고 수정할 포인트❣ cardNum은 정말 +100만 해주면 되기 때문에 애초에 private로 올릴 필요도 없었다. 그냥 int studentCard; 선언만 해주고 생성자에다가 studentCard=studentId+100;만 써주면 되는거였음.... 이걸 없애면 아래의 card용 get(),set()도 다 삭제돼서 코드가 짧아짐.
test에서도 getCardNum() 다 삭제하면 된다.
* student1Test
public class Student1Test {
public static void main(String[] args) {
Student1 studentLee = new Student1();
studentLee.setStudentName("이모씨");
System.out.println(Student1.getSerialNum());
System.out.println(Student1.getCardNum());
System.out.println("학번: " + studentLee.studentID);
System.out.println("카드번호: " + studentLee.studentCard);
Student1 studentSon = new Student1();
studentSon.setStudentName("손모씨");
System.out.println(Student1.getSerialNum());
System.out.println(Student1.getCardNum());
System.out.println("학번: "+ studentSon.studentID);
System.out.println("카드번호: "+ studentSon.studentCard);
}
}
손코딩을 할 때는 카드번호로 100더해준다는 설정을 어디에 구현해야 할지 고민했는데, 막상 다시 해보니깐 자연스럽게 이해가 갔다.
private으로 선언한 시리얼 넘버를 public studentID로 재 정의해서 생성자에 끼워넣듯이, cardNum=100;을 private static 변수로 놓고 public studentCard로 대입해서 쓸거기때문에, 생성자에서 학번+카드번호로 더해지는 완성체 결과값을 설정해주면 되는거였음.
처음에 아무생각없이 카드번호도 늘어나야지! 하고 studentCard++; 설정했는데 결과값을 보니 카드번호는 정말 100만 더해지면 되는거라서 삭제 후 기본식만 놔두었다. 오늘 구조도 많이 잡히고 배운게 많은것 같아 뿌듯하다 😁
'🔥 Vamos > Java' 카테고리의 다른 글
0908 | Do it! 자바 프로그래밍 입문 :: 6장 '클래스와 객체2' 연습문제 (0) | 2022.09.08 |
---|---|
0908 | Do it! 자바 프로그래밍 입문 :: 6장 '클래스와 객체2' 복습문제3 (싱글톤패턴) (1) | 2022.09.08 |
0907 | Do it! 자바 프로그래밍 입문 :: 6장 '클래스와 객체2' 복습문제 (1) | 2022.09.07 |
0906 | 자바의 정석 기초편 :: ch4-13~4-15 (3) | 2022.09.06 |
0905 | Do it! 자바 프로그래밍 입문 :: 5장 '클래스와 객체1' 연습문제 (0) | 2022.09.05 |