static 변수

  • 클래스 하나에서 생성되는 여러개의 인스턴스가 하나의 값을 공유할 필요가 있을 때 사용하는 변수로 하나의 변수
  • 인스턴스가 힙메모리에 생성되는 것과는 다르게 다음 그림과 같이 데이터 영역 메모리에 생성되며 인스턴스의 생성과 상관없이 사용할 수 있습니다.

  • 클래스 이름으로 참조되며 Student 클래스에 serialNum이라는 스태틱 변수를 참조한다면 Student.serialNum으로 사용할 수 있습니다.

예제, Student클래스에 학생 인스턴스가 새로 생성될 때 마다 Student ID를 부여하시오

 

public class Student {
	//1번
	private static int serialNum = 1000;
	private int studentID;
	public String studentName;
	//2번
	public Student(String name) {
		
		studentName = name;
		serialNum++;
           studentID = serialNum;
	}
    //3번
    public int getStudentID() {
	    		    	
	   	return studentID;
    }    
    public static int getSerialNum() {
		
		return serialNum;
	}
 
    }
  • 1번 : 인스턴스가 생성될 때 마다 Student ID를 부여하기 위해서는 기준점이 되는 하나의 값이 필요한데 그것을 static변수로 선언하기 위해 serialNum 변수를 선언하고 초기값을 1000 대입합니다. 
  • 2번 : 인스턴스가 생성될 때마다 serialNum이 1씩증가해야 하기 때문에 2개의 Student생성자에 serialNum++을 해줍니다.  그리고 증가된 serailNum을 생성된 인스턴스의 StudentID 값의 대입해줍니다. 
  • 3번 : prviate으로 선언한 studentID와 serialNum을 읽기위한 get메서드를 각각 작성해주되 SerailNum은 static변수이니 static 메서드로 작성합니다.
public class StudentIdTest {

	public static void main(String[] args) {
		//1번
		Student studentLee = new Student("Lee");
		System.out.println(Student.getSerialNum());//1001
		Student studentSon = new Student("Son");
		System.out.println(Student.getSerialNum());//1002
		//2번
		System.out.println(studentSon.getStudentID());//1002
		System.out.println(studentLee.getStudentID());//1001
		
	}
  • 1번 : 테스트 하기 위해 Student 인스턴스를 2개만들고 static 변수인 serialNum을 출력하기 위해 클래스명.메서드를 사용하여 출력하였더니 인스턴스가 생성될 때 마다 serailNum이 증가하는 것을 확인 할 수 있었습니다. 
  • 2번: studentId를 출력해 보았더니 인스턴스가 생성될때마다 증가된 seriaNum이 잘 대입된 것을 확인할 수 있습니다.

  • 예제의 static변수인 serialNum과 참조변수, 각 인스턴스의 관계는 위의 그림과 같습니다. 그리고 증가된 serailNum이 대입되는 studentID변수는 각각의 인스턴스에 담기게 됩니다.

static 메서드

  • static 변수를 위한 기능을 제공하는 메서드로 static메서드와 마찬가지로 클래스명.으로 참조해서 사용합니다.
	public static int getSerialNum() {
		int i = 0; // 지역변수는 사용가능
		studentName = "Lee"; //에러 - 멤버변수는 사용불가
		return serialNum;
	}

 

  • 위의 예제와 같이 static 메서드안에서 int i =0과 같은 지역변수는 함수안에서만 사용하고 소멸되는 변수이기에 사용가능합니다. 하지만 studentName같은 멤버변수는 사용할 수 없는데 그 이유는 static메서드는 인스턴스의 생성여부와 상관없이 사용할수 있는 메서드이지만 멤버변수는 인스턴스의 생성이 필수이기 때문입니다. static메서드를 사용하는 순간에 인스턴스가 없다면 오류가 날수 밖에 없는 변수이기 때문에 사용이 불가능합니다.

프로그램에서 변수의 유형

 

  • 변수유형 별 어디에서 어떤 변수를 사용해야 하는지를 배워야 메모리 사용을 최적화 하고 에러를 줄이는 프로그래밍을 할 수 있기에 잘 이해해야 합니다.

+ Recent posts