[정적 멤버와 static]
정적(static)은 '고정된'이란 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말합니다.
이들을 각각 정적 필드, 정적 메소드라고 부릅니다.
또한 정적멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 합니다.
[정적 멤버 선언]
정적 필드와 정적 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
예시)
public class 클래스 {
//정적 필드
static 타입 필드 [= 초기값];
//정적 메소드
static 리턴 타입 메소드 (매개변수선언, ...) {
...
}
}
->ex)
public class Calculator {
String color; //color는 변할 수 있음.
static double pi = 3.14159; //어디에서건 파이 값은 동일함.
static int plus(int x, int y) { //정적 메소드
return x + y;
}
}
[정적 멤버 사용]
클래스가 메모리로 로딩되면, 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근할 수 있습니다.
예시)
클래스.필드;
클래스.메소드(매개값, ...);
->ex)
public class Calculator {
static double pi = 3.14159;
static int plus(int x, int y) {
return x + y;
}
static int minus(int x, int y) {
return x - y;
}
}
public class CalcTest {
public static void main(String[] args) { //main 실행
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5);
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
System.out.println("result3 = " + result3);
}
}
[정적 초기화 블록]
정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행됩니다. 정적 블록은 클래스 내부에 여러 개가 선언되어도 상관없습니다. 클래스가 메모리로 로딩될 때 선언된 순서대로 실행됩니다.
예시)
static {
....
}
->ex)
[Television.java]
public class Television {
static String company = "Samsung";
static String model = "LCD";
static String info;
static {
info = company + "-" + model;
}
}
[TvExample.java]
public class TvExample {
public static void main(String[] args) {
System.out.println(Television.info);
}
}
[결과 값]
==> Samsung-LCD
[정적 메소드와 블록 선언 시 주의할 점]
정적 메소드와 정적 블록을 선언 시 주의할 점은 객체가 없어도 실행된다는 특징 때문에, 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없습니다. 또한 객체 자신의 참조인 this 키워드도 사용이 불가능 합니다.
ex)
public class ClassName {
//인스턴스 필드와 메소드
int field1;
void method1() { ... }
//정적 필드와 메소드
static int field2;
static void method2() { ... }
//정적 블록
static {
field1 = 10; (x) ->컴파일 에러
method1(); (x) ->컴파일 에러
field2 = 10; (0)
method2(); (0)
}
//정적 메소드
static void method3 {
this.field1 = 10; (x) ->컴파일 에러
this.method1(); (x) ->컴파일 에러
field2 = 10; (0)
method2(); (0)
}
}
==> 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 아래와 같이 객체를 먼저 생성 후, 참조 변수로 접근해야 합니다.
{Method3 정적 메소드]
static void Method3() {
ClassName obj = new ClassName();
obj.field1 = 10;
obj.method1();
}
'Programming > JAVA' 카테고리의 다른 글
Java - (11) final 필드와 상수 (0) | 2016.05.15 |
---|---|
Java - (10) 싱글톤(Singleton) (0) | 2016.05.15 |
Java - (8) 메소드 (Method) (0) | 2016.05.15 |
Java - (7) 생성자 오버로딩(Overloading) (0) | 2016.05.04 |
Java - (6) 객체와 클래스(Class) (0) | 2016.05.04 |
WRITTEN BY