[JAVA] 자바 static
■ static의 기본 개념은 '공유' 인데요. 이것은 멤버 필드와 메서드, 그리고 클래스 앞에서 지정예약어로 사용됩니다. 먼저 기본적인 개념들을 정리하고 예제를 통해서 어떻게 사용되는지 알아보도록 하겠습니다.
■ 먼저 초기화에 대해서 알아보겠습니다. 일반 멤버는 생성자에서 초기화를 하는데요. static은 위처럼 따로 블록({}) 내부에서 초기화를 합니다. 그 이유는 공유하기 위해서 객체가 하나도 만들어지지 않았더라도 메모리에 그 값이 할당 되어 있어야 하기 때문입니다.
그래서 프로그램이 실행이 되면 메인메서드 보다도 먼저 실행이 됩니다.
■ 이제 클래스를 만들어서 초기화 되는 과정을 사펴보도록 하겠습니다.
■ 이렇게 먼저 초기화가 됩니다. 위 그림처럼 꼭 블럭을 치지 않고 .
private static int y=50; 처럼 바로 값을 할당해도 됩니다.
이제 예를 하나 보면서 어떻게 공유가 되는지 살펴보겠습니다.
▶ 1번의 경우 클래스 이름으로 x값에 접근하려고 하자 에러가 발생합니다. y값은 static 이기때문에 클래스 이름으로 접근할 수 있습니다.
▶ 2번은 AAA클래스의 객체 aaa를 만들어서 x,y값에 접근해서 출력합니다.
▶ 3번은 클래스로 접근을 해서 y값을 30으로 바꿔주고 bbb라는 새로운 객체와 기존의 aaa객체로 y값에 접근해서 출력하자 모두 바꿔준 값(30)으로 출력이 됩니다.
▶ 4번은 객체로 접근해서 y값을 40으로 바꿔주고 aaa, bbb객체로 접근해서 출력하면 바꿔준 값(40)으로 출력이 됩니다.
위 예제의 결론은 어떤 방법으로 접근을 하건 모두 공유를 한다는 내용입니다. 만약에 여기서 ccc라는 객체를 하나 더 만들더라도 aaa와 bbb, ccc의 y값은 모두 동일하게 됩니다.
메서드도 역시 객체가 없는 상태에서도 클래스명으로 접근해서 사용할 수 있습니다. 대표적인 예로 System.out.println(); 에서 out이라는 필드에 System이라는 클래스 명으로 접근한 것입니다. 당연히 out은 static 필드 입니다.
■ 위의 내용들과 관련해서 간단한 프로그램을 만들어보도록 하겠습니다.
■ 예제의 소스코드를 살펴보면 먼저 일반 멤버 필드로 x, y값을 선언하고, static 멤버 필드로 tot와 in을 선언했습니다. 일반적으로 BufferedReader객체는 static으로 많이 발생 시킵니다. 왜냐하면 값을 입력받기 위한 객체로 모든 객체마다 따로 관리할 필요가 없기 때문입니다.
다음으로 초기화를 하고 생성자에서 x,y값을 입력받고 합을 계산하여 tot에 넣습니다. 위의 예제에서 Ex04는 명시적으로 표시한 것이라서 생략해도 관계 없습니다.
■ 이제 실행시켜볼 파일을 하나 만들어서 실행을 해보겠습니다.
그림에서 보듯이 Ex04라는 클래스 명으로도 접근이 가능하고 aaa라는 객체로도 접근이 가능합니다.