모든지 기록하자!

[Java] static 변수 본문

Java

[Java] static 변수

홍크 2021. 5. 12. 01:02
728x90

 

인스턴스란 클래스에서 생성된 개개의 객체이다.

인스턴스가 생성되면 각각의 메모리를 갖게 된다.

 

여러 개의 인스턴스가 모두 공유하는 값이 필요할 때 static변수로 선언한다.

 

static 변수는 인스턴스가 생성될 때마다 다른 메모리를 가지는 것이 아니라 

프로그램이 메모리에 적재(load) 될 때 데이터 영역의 메모리에 생성된다.

따라서 인스턴스의 생성과 관계없이 클래스 이름으로 직접 참조한다.

ex) Student.serialNum = 100; // serialNum이 static 변수 또는 클래스 변수라고도 한다.

멤버 변수는 다른 말로 인스턴스 변수라고 한다.

 

 

static 변수 예

여러 인스턴스가 하나의 메모리 값을 공유할 때 필요

학생이 생성될 때 마다 학번이 증가해야 하는 경우

기준이 되는 값은 static 변수로 생성하여 유지한다.

 

각 학생이 생성될 때 마다 static 변수 값을 복사해 와서 하나 증가시킨 값을 

생성된 인스턴스의 학번 변수에 저장해 준다.


 

학생이 생성될때 마다 학번을 하나씩 증가하며 부여해주는 예제이다.

 

public class Student {

	private static int serialNum = 10000; // 외부에서 변경하지 못하게 private로 선언 
    									  //공유하는 기준값
	
	int studentID; // 학생ID
	String studentName; // 학생이름
	
	public Student() { //Student가 생성시
		serialNum++; // 공유되면서 1씩 증가
		studentID = serialNum; // 내 studentID 값은 serialNum에서 복사 하여
        					   // 각각 인스턴스마다 가지고있다.
		
	}

	public static int getSerialNum() { // private로 선언 했기 때문에 getMethod 구현
		
            
        return serialNum; // static 변수, 클래스 변수
	}
}

 

 	public static int getSerialNum() { // private로 선언 했기 때문에 getMethod 구현
		int i = 10; // 지역변수
        
        //studentName = "홍길동"; // 멤버변수, 인스턴스 변수
               
        return serialNum; // static 변수, 클래스 변수
	}

 지역변수는 스택(stack) 메모리에 저장되기 때문에 메서드가 종료되면 사라진다.

 그러므로 static과 상관없이 사용 가능하다.

 

 studentName은 생성되지 않은 인스턴스 변수에 "홍길동"을 넣게 될 위험이 있다.
 따라서 static 메서드에서는 멤버 변수, 인스턴스 변수를 사용할 수 없다.

 

 

public class StudentTest {
	
	public static void main(String[] args) {
		
		System.out.println(Student.getSerialNum());
		// 되도록이면 static변수나 static메서드는 
        	// 클래스 이름으로 직접 호출해서 사용한다.
		
		Student studentJ = new Student();
		System.out.println(studentJ.getSerialNum());
		 
		Student studentT = new Student();
		System.out.println(studentT.studentID);
		
		
	}
}

출력 결과

 

 

728x90
Comments