오류, 기능, 문제해결(JAVA)

static 문제 연습 중에

seungmin576 2024. 12. 16. 19:02

학생이 입학하면 학번이 자동으로 생성되며 학번이 1씩 증가하는 코드에서 학번에 100을 더한 값이 학생 카드 번호가 되는 코드를 만들어 보는걸 했다.

package staticex;

public class Student3 {
    private static int serialNum = 1000;
    int studentID;
    String studentName;
    int grade;
    String address;
    int studentCard;


    public Student3(){
        serialNum++;
        studentID = serialNum;
        studentCard = serialNum + 100;
    }

    public String getStudentName(){
        return studentName;
    }

    public void setStudentName(String name){
        studentName = name;
    }

    public static int getSerialNum(){
//        int i = 10;
        return serialNum;
    }

    public static void setSerialNum(int serialNum){
        Student3.serialNum = serialNum;
    }

    public int getStudentCard(){
        return studentCard;
    }
}

int StudentCard를 선언한뒤

생성자 안에서 'StudentCard = 학번 + 100' 으로 해결했다.

 

테스트코드

package staticex;

public class StudentTest6 {
    public static void main(String[] args){
        Student3 student3 = new Student3();
        student3.setStudentName("웅나웅나");
        System.out.println(student3.getStudentCard());

        Student3 studentSad = new Student3();
        studentSad.setStudentName("어려워슬퍼");
        System.out.println(studentSad.getStudentCard());

        Student3 studentt = new Student3();
        studentt.setStudentName("왜이러지");
        System.out.println(studentt.getStudentCard());
    }
}

학번 초깃값 1000에서 1씩 증가하며 카드 번호는 100이 붙는 모습이다.

 

그런데 학생 카드번호가 학번에 100이 붙는게 아니라 점차 100씩 증가하는, 즉 1101 다음은 1202, 1303.... 이런식으로 나오게 하고 싶어졌다.

그래서 무작정 해보니

package staticex;

public class Student3 {
    private static int serialNum = 1000;
    int studentID;
    String studentName;
    int grade;
    String address;
    int studentCard;
    int studentCount;


    public Student3(){
        serialNum++;
        studentID = serialNum;
//        studentCard = serialNum + 100;
        studentCount++;
        studentCard = serialNum + (studentCount * 100);
    }

    public String getStudentName(){
        return studentName;
    }

    public void setStudentName(String name){
        studentName = name;
    }

    public static int getSerialNum(){
//        int i = 10;
        return serialNum;
    }

    public static void setSerialNum(int serialNum){
        Student3.serialNum = serialNum;
    }

    public int getStudentCard(){
        return studentCard;
    }
}

int StudentCount로 학생의 수를 몇명인지 파악하는 변수를 선언한 뒤

생성자 안에 studentCount++; 로 학생 객체가 만들어 질때마다 학생의 수를 새고

학생 카드 번호 = 학번 + (학생 수  * 100); 으로 코드를 만들어 봤다.

 

그러나 기대와 다르게 결과는 예상과 달랐다.

알아보니 생성자 안에 인스턴스 변수를 선언했더니 내 생각과는 다르게 매번 각 객체마다 studentCount가 0으로 초기화 되어 항상 학생 수가 0에서 시작해 studentCount++;로 1이 되고 끝나 결과 값이 저랬던 것이다.

 

마침 static 변수를 배웠으니 바로 적용해보자

package staticex;

public class Student3 {
    private static int serialNum = 1000;
    int studentID;
    String studentName;
    int grade;
    String address;
    int studentCard;
    private static int studentCount;


    public Student3(){
        serialNum++;
        studentID = serialNum;
//        studentCard = serialNum + 100;
        studentCount++;
        studentCard = serialNum + (studentCount * 100);
    }

    public String getStudentName(){
        return studentName;
    }

    public void setStudentName(String name){
        studentName = name;
    }

    public static int getSerialNum(){
//        int i = 10;
        return serialNum;
    }

    public static void setSerialNum(int serialNum){
        Student3.serialNum = serialNum;
    }

    public int getStudentCard(){
        return studentCard;
    }
}

studentCount를 static 변수로 선언해 이 변수는 모든 Student3 객체가 공유하게 된다.

즉, 모든 객체가 동일한 studentCount 값을 참조하게 되며, 객체가 생성될 때마다 이 값이 증가한다.