Java

자바 프로그래밍 (Java) - 22 : 정적 구성 요소(static)와 기능 클래스, 정적 초기화 블록(static initialization block)

n.han 2016. 7. 13. 11:12

- 정적 구성 요소(static)와 기능 클래스, 정적 초기화 블록(static initialization block)

 

1) 정적 구성 요소

 

모든 인스턴스가 공유하는 데이터가 필요한 경우가 있다. static 키워드를 통해서 필드를 정적으로 만들 수 있다.

 

그리고 정적 필드를 변경하는 경우 정적 메서드(static method)를 사용하는 것이 일반적이다.

 

정적 구성 요소는 인스턴스를 만들기 전에도 클래스에 접근하여 사용할 수 있다.

 

주의할 점은 정적 메서드는 특정 객체에 속하지 않기 때문에,

 

특정 객체에 속하는 구성요소(인스턴스 필드, 인스턴스 메서드)를 사용할 수 없다는 것이다.

 

2) 기능 클래스

 

클래스 내부에 멤버 변수가 없고, 기능적인 메서드만을 제공해주는 클래스가 있다. 이를 기능 클래스라고 한다.

 

다음 링크는 자바 API에 관한 오라클 문서이다. Math 클래스의 내용을 보자.

 

Math 클래스가 가지고 있는 메서드를 보면 모두 static으로 되어 있는 것을 알 수 있다.

 

Math 클래스는 생성자를 만들 필요 없이 클래스로 접근하여 기능(static method)들을 제공하는 것이다.

 

3) 정적 초기화 블록

 

정적 필드는 특정 객체에 속하지 않기 때문에 생성자에서 초기화할 수 없고, 정적 초기화 블록에서 해야한다.

 

이는 static 키워드와 중괄호로 묶은 명령문으로 구성된다.

 

첫 번째 예제를 보자. 생성자에서 static 변수인 species에 값을 대입하는 것을 볼 수 있다.

 

이는 초기화가 아닌 대입이고, 매번 생성자가 호출될 때마다 “Human”이 대입되므로 초기화라는 취지에도 맞지 않는다.

 

public class Person {

        private static String species;

        Person(){

               species = "Human";

        }

}

 

 

두 번째 예제를 보자. static 필드를 final로 상수화했더니, 생성자에서 값 할당 시 컴파일 에러가 발생함을 알 수 있다.

 

, 생성자에서는 static 필드의 초기화를 할 수 없다는 것이 증명된 것이다.

 

public class Person {

        private final static String species;

        Person(){

               species = "Human";

        }

}

Compile Error : The final field Person.species cannot be assigned

 

세 번째 예제를 보자. 정적 초기화 블록을 통해서 final static 필드를 초기화한 것을 볼 수 있다.

 

public class Person {

        private int age;

        private final static String species;

        static {    

               species = "Human";

        }

}