1. static 변수


static 변수는 클래스 안에서 선언되지만, 모든 인스턴스가 공유하는 변수이다. 일반 멤버변수는 인스턴스가 생성될 때 마다 각각의 인스턴스에 할당되었는데 static변수는 모든 인스턴스가 공유하는 것이다.

static변수를 선언하는 방법은 아래와 같다.

public static int (변수명)= 1;

 

package classpart;

public class Student {
    public static int serialNum = 1; //모든 인스턴스가 공유하는 static 변수
    public int id=1000;
    public String name;

    public Student() {
       id += serialNum++; //id의 초기값 1000에 serialNum을 더하고 serialNum은 1 증가
    }

    public int getID() {
       return id;
    }
}

 

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu1 = new Student(); //새로운 인스턴스를 만들 때 마다 serialNum 1 증가 id = 1000+serialNum
       Student stu2 = new Student();
       Student stu3 = new Student();

       System.out.println(stu1.getID());
       System.out.println(stu2.getID());
       System.out.println(stu3.getID());
    }
}

실행결과

1001

1002

1003

serialNum은 static변수로 그 값이 계속 유지되고 모든 인스턴스가 공유한다. 따라서 이와 같이 학생 한 명이 생길 때 마다 기존의 학번에 1을 더한 수를 학번으로 부여하고 싶은 경우 사용하기 유용하다.

static 변수는 클래스를 선언하는 시점 메모리에 할당되기 때문에 인스턴스보다 먼저 생성된다. 이러한 이유로 static변수를 class변수라고도 부르며 인스턴스 이름뿐 아니라 클래스 이름으로도 참조하여 사용 가능하다.

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu1 = new Student();
       Student stu2 = new Student();

       System.out.println(stu1.serialNum);
       System.out.println(stu2.serialNum);
       System.out.println(Student.serialNum); //클래스 이름으로 접근
    }
}

클래스명, 인스턴스명 모두를 통해 참조할 수 있지만 static변수는 일반적으로 클래스명을 통해 참조하는 것이 관례이다. static변수는 인스턴스가 생성되기 이전부터 사용할 수 있기 때문이다.

 

 

2. static 메소드


static변수를 위한 메소드이다. 메소드를 정의할 때 static선언자를 붙여서 선언하면 된다.

package classpart;

public class Student {
    public static int serialNum = 1;
    public int id=1000;
    public String name;

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

    public static int getSerialNum() {
       return serialNum;
    }
}

 

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu1 = new Student();

       Student.setSerialNum(10);
       System.out.println(Student.getSerialNum());

       stu1.setSerialNum(20);
       System.out.println(Student.getSerialNum());
    }
}

실행결과

10

20

메소드를 만들 때 static을 붙였기 때문에 클래스명을 통해 setSerialNum 메소드를 참조할 수 있었다.

static메소드는 클래스 메소드라고도 부른다.

클래스 메소드에는 주의해야 할 것이 있는데 클래스 메소드 내부에는 일반 멤버변수가 올 수 없다. 클래스 메소드는 인스턴스가 생성되지 않아도 사용할 수 있어야 하는데 일반 멤버변수는 인스턴스가 생성되면서 메모리에 할당이 되기 때문이다. 클래스 메소드 내부에 올 수 있는 변수는 클래스 변수 혹은 그 메소드의 지역변수 뿐이다.

+ Recent posts