Java/문법
Java Static 키워드
ssury94
2024. 12. 13. 12:24
Static 변수에 대해 알아봅시다~
Student의 변수들을 지정해주면서
serialNumber는 static으로 지정했습니다.
어떤 차이가 있을까요?
package entity;
public class Student {
public String name;
public int id;
public static int serialNumber;
public Student() {
}
public void print(){
System.out.println("이름: "+name+" 아이디: "+id);
System.out.println("스태틱 변수: "+serialNumber);
}
}
메인클래스에서
s1. 자동 완성 기능 사용 시
Student클래스에서 작성한 변수와 함수들( s1.id, s1.name, s1.print() )은 자동입력 되는데
s1.serialNumber만 보이지 않습니다? Why??
s1.serialNumber는 안보이는 이유?
//메모리 위치가 다르다!
//s1.name, s1.id = 메모리 영역의 heap에 위치
//s1.serialNumber는? -> 메모리 영역의 data에 위치
메모리 영역이 다르면 어떤 차이가 있지?
// 객체 생성( new () )안해도 이 변수를 마음대로 사용할 수 있다!
// 클래스이름. 입력시 사용가능
// static 변수는 공유되는 데이터다
홍길동의 스태틱 변수 = 김나나의 스태틱 변수
static의 의미와 특징
static을 사용하면 메모리에 한 번만 할당되어 프로그램이 종료될 때까지 유지됩니다.
이는 다음과 같은 특징을 가집니다.
- 클래스 변수/메소드: static으로 선언된 변수나 메소드는 객체가 아닌 클래스에 속합니다.
- 공유: 모든 객체가 동일한 static 멤버를 공유합니다.
- 메모리 효율: 여러 객체가 같은 값을 공유할 때 메모리 사용을 줄일 수 있습니다.
- 객체 생성 없이 사용: static 멤버는 객체 생성 없이 클래스 이름으로 직접 접근할 수 있습니다.
- private가 아니라면 클래스 외부에서도 사용가능
- 프로그램이 시작할 때부터 끝날때까지 상주하므로 크기가 너무 큰 변수를 static으로 선언하는건 좋지 않다.
import entity.Student;
public class StaticTest {
public static void main(String[] args) {
//학생 데이터를 저장하려 합니다.
Student s1=new Student();
s1.name="홍길동";
s1.print();
//s1.serialNumber는 안보이는 이유?
//메모리 위치가 다르다!
//s1.name, s1.id = 메모리 영역의 heap에 위치
//s1.serialNumber는? -> 메모리 영역의 data에 위치
// = 객체 생성 안해도 이 변수를 마음대로 사용할 수 있다!
// new () 안해도된다. 클래스이름. 하면 사용가능
Student.serialNumber=Student.serialNumber+1;
s1.print();
Student s2=new Student();
s2.name="김나나";
s2.print();
}
}
변수 유형에 따른 용도
변수 유형 | 선언 위치 | 사용범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬변수) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고 함수가 끝나면 소멸 |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 참조 변수로 다른 클래스에서 사용가능 |
힙 | 인스턴스가 생성될 때 힙에 생성되고 가비지 컬렉터가 메모리를 수거할 때 소멸 |
static 변수 (클래스 변수) |
static 예약어를 사용해서 클래스 내부에 선언 |
클래스 내부에서 사용하고 클래스 이름으로 다른 클래스에서 사용가능 |
데이터영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸 |
클래스의 여러 메소드에서 사용할 변수를 지역변수로 선언하면 다른 메서드에서 그 변수를 사용해야 할 때 지역 변수를 메서드의 매개 변수로 전달해야하므로 번거롭다.
그렇다고 모든 변수를 멤버변수나 static변수로 선언하면 메모리 낭비, 가독성이 떨어진다.
▶ 특성에 맞게 선언하여 사용하는것이 중요!