[정적 멤버와 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
SiriusJ

,