자바(Java) static 문법에 대해서 알아 봅니다.

자바(JAVA)

자바(Java) 강좌 – static 문법

 

환경: Eclipse Mars, JDK 1.7

  

static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 됩니다. 인스턴스 생성 없이 바로 사용이 가능한 것이죠. 이런 특성 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다. 자바 프로그램에서는 공통 로직이 들어가는 유틸 기능을 static 으로 작성하곤 합니다. 이런 static 은 남발해서는 안되며 공통으로 값을 유지하고 싶을 때만 사용합니다.

 

¤ static 변수와 인스턴스 변수의 차이

 

static 의 사용법을 알기 위해 static 변수(클래스 변수) 와 인스턴스 변수의 차이점을 알아 보도록 하겠습니다. 아래 소스는 클래스 내부에 static 변수로 값을 관리할 때 어떻게 되는지 쉽게 알 수 있는 예제입니다.

 

Card 라는 클래스에는 넓이와 높이값을 저장하는 static int 변수가 있습니다. Card 클래스의 인스턴스를 c1, c2 두 개를 생성해서 c1 에 넓이와 높이 값을 변경합니다. static 변수가 아니라면 메모리에 별도의 영역이 생겼기 때문에 두 인스턴스간에 영향을 주지 않을 겁니다. 그런데 결과는 c1 c2 의 넓이, 높이 값이 동일하게 변경됩니다. 그것은 c1 c2 가 공통된 변수를 참고하고 있기 때문입니다.

 

자바(Java) static 문법에 대해서 알아 봅니다.

public class StaticSample {

	public static void main(String args[]) {
		
		System.out.println("==> 카드 값 변경전");
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.height = " + Card.height);

		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;

		Card c2 = new Card();
		c2.kind = "Spade";
		c2.number = 4;
		
		System.out.println("==> 인스턴스 C1, C2");
		System.out.println("c1 Width/Height : " + c1.width + "/" + c1.height + ")");
		System.out.println("c2 Width/Height : " + c2.width + "/" + c2.height + ")");
		
		System.out.println("==> 인스턴스 C1 만 변경했 을 때");
		
		c1.width = 50;
		c1.height = 80;
		System.out.println("c1 Width/Height : " + c1.width + "/" + c1.height + ")");
		System.out.println("c2 Width/Height : " + c2.width + "/" + c2.height + ")");
	}
}

class Card {
	String kind; // 카드 종류
	int number; // 카드 숫자
	static int width = 100; // 카드 넓이
	static int height = 250; // 카드 높이
}
// 결과 
==> 카드 값 변경전
Card.width = 100
Card.height = 250
==> 인스턴스 C1, C2
c1 Width/Height : 100/250)
c2 Width/Height : 100/250)
==> 인스턴스 C1 만 변경했 을 때
c1 Width/Height : 50/80)
c2 Width/Height : 50/80)

 

¤ static 함수와 인스턴스 함수의 차이

 

static 함수와 인스턴스 함수의 차이는 함수 앞에 static 키워드가 붙고 변수와 마찬가지로 메모리에 이미 생성이 되어 있습니다. 그래서 호출할 때 차이가 납니다. 인스턴스 함수는 인스턴스를 new 연산자로 생성해서 함수를 호출해야 되지만 static 함수는 클래스 이름만으로 호출이 가능합니다. 아래 그림처럼 s 가 붙은 함수들이 static 함수 입니다 

자바(Java) static 문법에 대해서 알아 봅니다.

 

만약 클래스 내부에 static 함수가 static 변수가 아닌 것들을 사용하게 된다면 에러가 납니다. 아래 그림처럼 static 변수만 static 함수에서 사용이 가능합니다. 그것은 인스턴스가 생성되기 전에 아직 생성되지 않은 변수를 참조하기 때문입니다.

자바(Java) static 문법에 대해서 알아 봅니다.

 

그래서 아래 소스는 내부에 있는 변수는 사용하지 못하고 인수로 넘겨 받은 데이터로 계산을 해서 넘겨주는 것입니다. 이런 이유 때문에 조금이라도 성능을 올리기 위해 자주 사용하는 유틸 소스에 많이 이용합니다.

public class StaticSample02 {

	public static void main(String args[]) {
		
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;

		System.out.println("==> 인스턴스 함수 호출");
		System.out.println("totalWidth() : " + c1.totalWidth());
		
		System.out.println("==> static 함수 호출 ");
		System.out.println("totalWidth() : " + Card.totalWidth(10, 20));
	}
}

class Card {
	String kind; // 카드 종류
	int number; // 카드 숫자
	int width = 10; // 카드 넓이
	int height =  25; // 카드 높이
	
	public int getNumber() {
		return number;
	}
	public int totalWidth() {
		return width * height;
	}
	public static int totalWidth(int width, int height) {
		return width * height;
	}
}
//결과 
==> 인스턴스 함수 호출
totalWidth() : 250
==> static 함수 호출 
totalWidth() : 200
신고
Posted by 녹두장군