본문 바로가기
Java

2-7 클래스와 객체2 (3) - static 변수

by yukuda 2024. 3. 18.
728x90

인스턴스 : 클래스에서 생성된 개개인의 객체

static 변수

static 변수의 정의와 사용 방법

 

여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용

힙 메모리에 생성되는 게 아님. 메모리가 따로 있음, 메모리는 new할때 할당받는게 아님 전체 프로그래밍이 로드될때 그때 할당받는 영역(ex) 상수, 리터럴, static변수)

static 변수는 인스턴스가 생성될 때마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load) 될때 데이터 영역의 메모리에 생성됨

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

Student.serialNum = 100; //serailNum이 static 변수

클래스 변수 라고도 함

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

package staticex;

public class Student {
	
	private static int serialNum = 10000;
	
	int studentID;
	String studentName;
	
	public Student() {
		serialNum++;
		studentID = serialNum;
	}

	public static int getSerialNum() {
		int i = 10; //지역변수
		i++;
		System.out.println(i);
		
		//studentName = "홍길동"; //멤버변수, 인스턴스 변수
		//static메서드에서는 인스턴스 변수 사용 불가
		
		return serialNum; //static변수, 클래스변수
	}

	/*public static void setSerialNum(int serialNum) {
		Student.serialNum = serialNum;
	}*/ //가져가게만 함
	
}
package staticex;

public class studentTest1 {

	public static void main(String[] args) {
		System.out.println(Student.getSerialNum());	
		// static 변수나 메서드는 클래스 이름으로 직접 호출해서 사용
		// 참조변수로 사용 잘 안함 ( Student -> O, studentJ -> X )
		Student studentJ = new Student();	
		System.out.println(Student.getSerialNum());	
		Student studentT = new Student();
		System.out.println(Student.getSerialNum());	
		
	}
}

static 변수 vs 인스턴스 변수

note : serialNumber를 static으로 선언하면 모든 student instance에 대해 하나의 변수로 유지되고 이러한 변수를 class 변수라 한다.

static 변수 예

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

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

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

각 학생이 생성될 때마다 static변수 값을 복사해 와서 하나 증가시킨 값을 생성된 인스턴스의 학번 변수에 저장해 줌

static 메서드

클래스 메서드 라고도 함

메서드에 static키워드를 사용하여 구현

주로 static변수를 위한 기능 제공

static 메서드에서 인스턴스 변수를 사용할 수 없음

static 메서드도 인스턴스의 생성과 관계 없이 클래스 이름으로 직접 메서드 호출

Student.getSerialNum(); //getSerialNum()이 static 메서드

인스턴스의 변수의 경우 꼭 인스턴스가 먼저 생성되어야 하므로 static메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없음

변수의 유효 범위

https://www.youtube.com/watch?v=oonYQa82MU4&list=PLG7te9eYUi7typZrH4fqXvs4E22ZFn1Nj