본 포스팅의 목적
- 변수 및 메서드에 static이 있을 때와 없을 때의 차이점을 알아본다.
클래스변수(static) | 인스턴스변수(non-static) | 지역변수 | |
---|---|---|---|
생성시기 | 클래스가 메모리에 로드될 때 즉, 인스턴스 생성 전 | 인스턴스가 생성될 때 | 메서드 호출 시 |
특징 | 모든 인스턴스들이 공유하는 변수 | 인스턴스마다 고유값을 갖는 변수 | 메서드 내에서만 사용 가능 |
접근방법 | 인스턴스의 생성없이, 클래스이름.변수명으로 접근 | 인스턴스 생성 후, 참조변수.변수명으로 접근 | 메서드 호출 시, 매개변수로 접근 or 메서드 내에서만 사용 |
변수 초기화 (참고) | 선택 | 선택 | 필수 |
class Card {
//static 변수
static int area;
//non-static 변수
String color;
}
class CardTest {
public static void main(String[] args) {
//객체 생성 없이, staitc변수에 접근
Card.area = 100;
//객체 생성 후,
Card c = new Card();
//non-staitc변수에 접근
c.color = "white";
}
}
클래스메서드(static) | 인스턴스메서드(non-static) | |
---|---|---|
호출시기 | 클래스가 메모리에 로드될 때 즉, 객체 생성 전 호출 가능 | 객체 생성 후 호출 |
호출방법 | 객체 생성없이, 클래스이름.메서드명으로 호출 | 객체 생성 후, 참조변수.메서드명으로 호출 |
특징 | 클래스메서드에서 인스턴스변수 사용 불가, 주로 지역변수를 사용 | 인스턴스메서드에서 인스턴스변수 사용 |
class MyMath {
//non-static 변수
int a, b;
//static 메서드 : 주로 지역변수 사용
static int add1(int a, int b) {
return a+b;
}
//non-static 메서드 : non-static변수 사용
int add2() {
return this.a + this.b;
}
}
class MyMathTest {
public static void main(String[] args) {
//객체 생성 없이, staitc메서드 호출
MyMath.add1(1,2);
//객체 생성 후,
//non-staitc메서드 호출
MyMath my = new MyMath();
my.add2();
}
}
public class StaticNonstaticTest {
public static void main(String[] args) {
// 1. static변수에 접근
StaticNonstatic.a = 10;
StaticNonstatic.b = 20;
// 2. static메서드 호출
StaticNonstatic.add1(10, 20);
StaticNonstatic.add2(10, 20);
// 3. 인스턴스변수에 접근
StaticNonstatic sn = new StaticNonstatic();
sn.x = 10;
sn.y = 20;
// 4. 인스턴스메서드 호출
sn.add3();
sn.add4();
}
}
//아래의 코드에서 직접 사용, 직접 호출이라는 말은 객체 생성 및 참조변수 없이 접근하는 것을 뜻한다.
class StaticNonstatic {
//static 변수
static int a;
static int b;
//인스턴스 변수
int x;
int y;
//static 메서드1
static int add1(int p, int q) {
//같은 클래스 안에서,
//static메서드는 static 변수 직접 사용 가능.
a = 10;
b = 20;
//static메서드는 인스턴스변수 직접 사용 불가능
//x = 10;
//y = 20;
return a+b+p+q;
}
//static 메서드2
static int add2(int a, int b) {
//같은 클래스 안에서,
//static메서드는 다른 static 메서드 직접 호출 가능
int p = add1(a, b);
//static메서드는 인스턴스메서드 직접 호출 불가능
//int a = add3();
return p;
}
//인스턴스 메서드1
int add3() {
//같은 클래스 안에서,
//인스턴스 메서드는 인스턴스 변수 직접 사용 가능.
this.x = 10;
this.y = 20;
//인스턴스 메서드는 static 변수 직접 사용 가능.
a = 10;
b = 20;
return this.x + this.y + a + b;
}
//인스턴스 메서드2
int add4() {
//같은 클래스 안에서,
//인스턴스 메서드는 다른 인스턴스 메서드 직접 호출 가능
int a = add3();
//인스턴스 메서드는 다른 static메서드도 직접 호출 가능
int b = add1(10, 20);
int c = add2(10, 20);
return a+b+c;
}
}
참고문헌
- 자바의 정석 3판 (남궁성 저)