클래스 & 객체 (4)

hyeu·2023년 1월 19일
0

자바

목록 보기
7/7

static 변수 (=정적변수)

여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용
인스턴스가 생성될 때마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load)될 때 데이터 영역의 메모리에 생성됨.
=>인스턴스의 생성과 관계없이 클래스 이름으로 직접 참조함

사용방법)
static 자료형 변수이름;
s tatic int a;

int id; // 멤버변수로 생성할 경우)

멤버변수는 생성할 때마다 각각의 메모리를 갖는다.
new로 인스턴스를 생성하여 james 또는 tomas로 참조변수로 하여 값을 받을 때 이 때의 값은 각각 다른 값을 받는다.
주의점) new 할 때 메모리 할당을 받으며 heap에 저장됨

static id;// 정적변수로 생성할 경우)

static 정적변수는 값을 공유하여 같은 값을 가지게 할 때 사용한다.
인스턴스를 생성해도 james와 tomas의 값은 같다.
주의점) 전체 프로그램이 메모리에 로드될 때 할당을 받음
(상수, literal, static 등)

멤버변수(instance 변수) & 지역변수

멤버변수 : 메소드 밖에서 선언된 변수
지역변수 : 메소드 안에서 선언된 변수

학번 기준점을 만들어 학생이 추가될 때마다 학번 생성하는 프로그램
-> 기준되는 숫자는 각각의 인스턴스에 값이 있을 경우 공통 기준점이 아니므로 static으로 선언.

public class Student {
	
	static int serialNum = 10000;
	int studentID;
	String studentName;
	
}
public class StudentTest1 {

	public static void main(String[] args) {
		Student james = new Student();
		System.out.println(james.serialNum); //10000
		james.serialNum++;
		
		Student tomas = new Student();
		System.out.println(james.serialNum); //10001
		System.out.println(tomas.serialNum); //10001
		

	}

}

-> 위의 문제점은 static으로 같은 값을 공유하고 있어 james와 tomas와 학번이 같다.

public class Student {
	
	static int serialNum = 10000;
	int studentID;
	String studentName;
	
	public Student() {
		serialNum++; //serialNum을 증가시킨 것을 studentID로 복사
		studentID = serialNum;
	}
	
}
public class StudentTest1 {

	public static void main(String[] args) {
		Student james = new Student();
		System.out.println(james.studentID); //10001
		
		
		Student tomas = new Student();
		System.out.println(tomas.studentID); //10002
		

	}

}

메서드를
public Student() {
serialNum++;
studentID = serialNum;
}로 하면 serialNum 증가 된 값을 studentID로 복사하여 객체에서 부르게 되면 증가되어 각각의 학생의 학번이 다르게 된다.

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

static 메서드 (=클래스 메서드)

메서드에 static 키워드를 사용하여 구현
주로 static변수를 위한 기능 제공

주의점)
static 메서드에서 인스턴스 변수를 사용할 수 없음
static 메서드도 인스턴스의 생성과 관계 없이 클래스 이름으로 직접 메서드 호출
ex)
student.getSerialNum(); //getSerialNum()이 staic 메서드

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

변수의 유효 범위

지역변수 (=로컬변수)

선언 위치 : 함수 내부에 선언
사용 범위 : 함수 내부에서만 사용
메모리 : 스택
생성과 소멸 : 함수가 호출될 때 생성되고 함수가 끝나면 소멸함

멤버변수 (=인스턴스 변수)

선언 위치 : 클래스 멤버 변수로 선언
사용 범위 : 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능
메모리 : 힙
생성과 소멸 : 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨

static변수 (=클래스 변수)

선언 위치 : static예약어를 사용하여 클래스 내부에 선언
사용 범위 : 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능
메모리 : data영역
생성과 소멸 : 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

0개의 댓글