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만 더해지면 되는거라서 삭제 후 기본식만 놔두었다. 오늘 구조도 많이 잡히고 배운게 많은것 같아 뿌듯하다 😁

 

 

+ Recent posts