Static
변수
Instance 변수
•
각 객체 생성시 별도의 메모리 할당
•
멤버 변수의 경우 각 객체마다 고유의 속성값 저장 가능
•
객체가 생성될때 메모리 할당되고 객체가 소멸될때 사라진다.
Static 변수
static 변수 = 정적변수 = 클래스 변수 = 공용변수
•
프로그램 시작시 메모리 할당
◦
생성된 객체의 수와 상관없이 단 하나만 생성
•
이 클래스의 모든 객체들이 공유!
•
객체를 생성하지 않고도 사용 가능
•
프로그램이 시작될때 메모리를 할당 받아서 프로그램이 종료될때까지 지속적으로 공간사용이 가능하다.
•
Java에서 static 키워드를 사용한다는 것은 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것을 의미
인스턴스 변수 & Static 변수 비교
Instance 변수 | Static 변수 | |
선언 위치 | 클래스 멤버 변수로 선언 | 클래스 내부에 선언 |
메모리 | 힙 영역 | 데이터 영역 |
사용 범위 | 클래스 내부에서 사용하고 private 아니면 참조 변수로 다른 클래스에서 사용 가능 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용가능 |
라이프 사이클 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 떄 소멸됨 |
인스턴스 변수 예시
class Number {
int num = 0;
int add() {
return ++this.num;
}
}
public class Main {
public static void main(String[] args) {
Number num1 = new Number();
Number num2 = new Number();
num1.add();
System.out.println(num1.num) // 1
System.out.println(num2.num) // 0
}
Java
복사
이 경우 객체를 생성하면 각각의 메모리를 할당받기 때문에 add() 메소드를 실행시킨 객체의 메모리값만 변하게 된다.
Non-Static
Static 변수 예시
class Number {
static int num = 0;
int num2 = 0;
int add() {
return ++num;
}
int add2() {
return ++num2;
}
}
public class Main {
public static void main(String[] args) {
Number num1 = new Number();
Number num2 = new Number();
num1.add();
System.out.println(num1.num) // 1
System.out.println(num2.num) // 1
System.out.printlb(Number.num) // 1
Java
복사
static 변수로 선언된 경우 객체를 생성하면 메모리값을 공유하게 된다.
따라서 여러 객체를 생성하고 add() 메소드 실행시 변수는 같은 값을 갖는다.
•
메모리절약의 이점
•
변수 값 공유
Static
메소드
Instance 메소드
•
객체가 수행하는 일반적인 행위
◦
ex. 원의 둘레, 넓이
•
자신의 모든 멤버를 직접 참조 가능
•
객체 생성 필요.
•
객체를 생성한 후 사용되기 때문에 메소드 내부에서 인스턴스 변수 및 static 변수 사용 가능.
Static 메소드
•
정적메소드를 선언하면 객체를 생성하지 않고 메소드를 사용할 수 있다.
•
static 메소드 안에서는 static 변수만 접근할 수 있다.
•
유틸리티성 메소드 작성에 많이 사용된다.
static 메소드에서 인스턴스 변수의 사용?
static메소드는 인스턴스 생성 없이 호출이 가능하므로 인스턴수 변수는 사용할 수 없다!
static메소드는 객체 생성 과정이 없이 사용한다
인스턴스 변수는 객체를 생성하고 메모리에 올라온 후에 사용이 가능하다
public static void main(String[] args)에서 static이란
main이라는 메서드를 호출하기 위해서 이 메서드를 포함하고 있는 클래스 객체를 생성 안해도 된다는 의미.
객체를 생성하지 않고도 접근을 용이하게 하기 위해