본문 바로가기

Java/Java 기초

스태틱(static)

점프 투 자바: 07-3 정적 변수와 메소드 (static)

https://wikidocs.net/228


Java로 개발하면서 많이 사용하지만 그 의미에 대해서는 깊이 이해하지 못하는 많은 표현들이 있다. 그중 하나가 static이다. 맨처음 Java를 배우게 되었을 때 가장 처음 해보는 것이 바로 "Hello, World!"를 출력해보는 것인데 이때도 우리는 static을 사용하고 있다. 바로 main 메서드에 기본적으로 포함되기 때문이다.


public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello, Wolrd!");
	}
} 

이 짧은 코드에도 static이 들어가있다.


그렇다면 static은 왜 사용하고 어떤 의미인지 알아보자.


static 변수

static 변수는 어떠한 인스턴스에서도 동일한 값을 사용해야할 때 사용된다. 예를 들어 아래와 같은 코드가 있다고 하자.


public class CountNumber {
	String countName = "number: ";
	int count;

	CountNumber() {
		this.count++;
		System.out.println(countName + this.count);
	}

	public static void main(String[] args) {
		CountNumber cntNum1 = new CountNumber();
		CountNumber cntNum2 = new CountNumber();
	}
}


코드에서 countName이라는 String 변수는 어느 인스턴스에서나 공통적으로 사용하지만, static으로 선언되어 있지 않기 때문에 객체가 생성될 때마다 메모리를 할당받게되어 메모리의 손실이 일어난다. 이러한 경우 static String countName으로 선언하게 되면 한 번 메모리에 할당된 다음 다른 인스턴스에서 해당 메모리를 참조하여 값을 가져오기 때문에 메모리의 손실을 막을 수 있을 뿐만 아니라 가르키는 변수도 확실해지는 효과를 얻을 수 있다. 


위 코드를 실행하였을 때 결과값은 number: 1이 두번 찍히는 것으로 나오게 된다. 이는 각 인스턴스 별로 count 변수를 따로 사용하고 있기 때문이다. 만일 CountNumber 객체를 생성할 때마다 number가 하나씩 증가하는 것을 원했다면 각 인스턴스가 동일한 변수를 바라볼 수 있도록 int count에 static을 추가해줘야 한다. 만일 아래와 같이 코드를 수정한다면 number: 1, number: 2로 숫자가 증가하는 것을 볼 수 있다.


public class CountNumber {
	static String countName = "number: ";
	static int count;

	CountNumber() {
		this.count++;
		System.out.println(countName + this.count);
	}

	public static void main(String[] args) {
		CountNumber cntNum1 = new CountNumber();
		CountNumber cntNum2 = new CountNumber();
	}
}



static method

메소드 앞에 static이 붙으면 static 메소드가 되는데 static이 붙을 경우 main 메소드에서 클래스를 통해 호출이 가능하다. 일반적으로 이러한 static 메소드는 유틸리티 성 메소드 작성에 많이 사용한다. 예를 들어 날짜를 구하거나 포맷을 지정한다던가 하는 반복적이고 형식적 작업을 하는 경우 많이 사용하게 된다. 사용시 주의할 점으로는 static으로 선언된 메소드에서는 인스턴스 변수에 접근할 수 없다는 것이다. static 메소드에서는 static 변수만 접근이 가능하기 때문에 사용에 유의해야한다.


다음은 점프 투 자바에서 예시로 들은 날짜를 구해주는 메소드이다.


import java.text.SimpleDateFormat;
import java.util.Date;

public class Util {
	public static String getCurrentDate(String fmt) {
		SimpleDateFormat sdf = new SimpleDateFormat(fmt);
		return sdf.format(new Date());
	}

	public static void main(String[] args) {
		System.out.println(Util.getCurrentDate("yyyyMMdd"));
	}
}

'Java > Java 기초' 카테고리의 다른 글

Java Stack 구현  (0) 2018.05.24
XSS(Cross-site scripting) 특수문자 치환  (0) 2018.05.10
Arrays.binarySearch() 사용  (0) 2017.12.29
쓰레드(Thread)의 사용  (0) 2017.12.27
접근제어자 public, protected, default, private  (0) 2017.12.23