[Java] 자바 정적 멤버 static 의 의미와 사용법 정리

2020-11-15


오늘은 너무나도 많이 접하지만 그 의미에 대해서는 잘 모르는 경우가 많은 static에 대하여 알아보자.

public class TemplateA {
    public static void main(String[] args){
  
    }
}

우선 정의를 보자면 정적 멤버는 클래스에 고정된 멤버이며, 이는 객체를 생성시키지 않고도 사용할 수 있는 필드와 메서드를 의미한다.


선언하는 방법은 아래 코드와 같다. 우선 필드의 선언 부터 보자.

public class tStatic {		
	static String people = "사람";
	//사람이라는 근본적인 가치는 변하지 않으며, 공통적인 특징이기 때문에 static을 선언함
	String name = "홍길동";
	//사람이 개명을 할 수 있기 때문에 static을 선언하지 않음
	int age = 20;
	//나이는 해가 지나면 바뀌기 때문에 static을 선언하지 않음
}

tStatic이라는 클래스를 하나 만들어준 후 세가지 필드를 만들어 주었다. 우선 people는 공통적이고 근본적인 특성을 가지고 있기 때문에 해당 속성 앞에 static을 선언해 주었으며, 나머지 name(이름)이라는 필드와 age(나이)라는 두 필드 모두 사람마다 다르고 변경의 가능성이 있기 때문에 따로 static을 선언해 주지 않았다.

 

다음은 메소드의 선언이다.

public class tStatic {		
	static String people = "사람";
	//사람이라는 근본적인 가치는 변하지 않으며, 공통적인 특징이기 때문에 static을 선언함
	String name = "홍길동";
	//사람이 개명을 할 수 있기 때문에 static을 선언하지 않음
	int age = 20;
	//나이는 해가 지나면 바뀌기 때문에 static을 선언하지 않음
	
	
	void nextage(int age) {
		this.age = age;
	}
	//nextage의 경우 인스턴스 필드를 이용하기 때문에 static을 사용하지 않음
	static String hobby(String x) {
		return x;
	}
	//hobby의 경우 인스터스 필드를 사용하지 않고,
	//직접입력 받는 값을 그대로 출력하기 때문에 static 선언
}

위의 코드에서의 주석을 쉽게 설명하자면 기존에 선언한 필드를 사용하면, static을 선언할 필요 없고, 기존에 필드 값을 사용하는 것이 아닌 입력받은 값을 사용할 경우에는 static을 선언한다. 


public class TemplateA {
    public static void main(String[] args){
    	
    	String info1 = tStatic.people;
    	String info2 = tStatic.hobby("독서");
    	
    	System.out.println(info1);
    	System.out.println(info2);
    }
}

실행은 위의 코드처럼 new를 이용해 새로운 객체를 만들 필요없이 간단히 하나의 변수의 클래스의 필드와 메서드를 입력해주면 간단히 사용할 수 있다. 출력 값은 아래와 같이 정상적으로 출력되는 것을 확인할 수 있다.


public class tStatic {		
	static String people = "사람";
	//사람이라는 근본적인 가치는 변하지 않으며, 공통적인 특징이기 때문에 static을 선언함
	static String name = "홍길동";
	//사람이 개명을 할 수 있기 때문에 static을 선언하지 않음
	static int age = 20;
	//나이는 해가 지나면 바뀌기 때문에 static을 선언하지 않음
	
	static String basicInfo;
	//초기값이 없는 static 멤버
	static {
		basicInfo ="해당 인원의 기본 인적사항은 : " + people + name + " " + age;
	}
	//static 생성자를 통해 basicInfo의 기본값을 선언해줌.
	
	void nextage(int age) {
		this.age = age;
	}
	//nextage의 경우 인스턴스 필드를 이용하기 때문에 static을 사용하지 않음
	static String hobby(String x) {
		return x;
	}
	//hobby의 경우 인스터스 필드를 사용하지 않고,
	//직접입력 받는 값을 그대로 출력하기 때문에 static 선언
}

 

보통은 static 필드 선언시 초기값을 넣어주는 것이 일반적이지만, 생성자를 통해서 주는 방법은 있다. 이러한 방법은 바로 static {초기화 내용} 생성자 블록을 이용하는 것이다. 다만 여기서 주의해야 할 부분은 static 생성자 블록은 static 필드로만 초기화할 수 있어, 사용하고자 하는 필드를 static으로 선언을 해주어야 한다. 어렵지 않은 내용이니 코드를 보면 이해가 될 거라고 본다. (name 과 age도 생성자 블록에 들어가기 위해 static 이 선언되었다!!)


해당 생성자 블록으로 초기화한 필드를 출력하는 코드이다.

public class TemplateA {
    public static void main(String[] args){
    	
    	String binfo = tStatic.basicInfo;
    	System.out.println(binfo);
    }
}

출력값은 아래와 같이 정상적으로 출력되는 것을 확인할 수 있다.