1.Static


처음에 클래스를 설명할 때 너무 틀이라는 비유에 얽매이면 안된다고 했던게 Static 때문이다.


static은 변수와 메소드에 사용 할 수 있는데 


변수의 경우에는 같은 클래스를 이용하여 객체화 한 여러 객체들이 이 static 변수를 공유해서 사용이 가능하다.


이 static 변수는 heap 영역이 아닌 class 영역에 별도로 저장되어 공유하며 사용된다.


static은 따로 객체화하지 않고 클래스명.메서드명();와 같이 객체화없이 사용이 가능하다.


static 메소드 역시 클래스 영역에 저장된다.


사실 객체화하고 객체를 통해서 static 메소드를 호출하는것은 옳지 않다. 많이 하는 실수로 eclipse에서 자체적으로 허용해준다.


초기화는 값을 지정해줘도 되고 따로 static { } 블록을 생성해서 초기화 하여도 된다.




아래의 예제를 통해 이해해보자.



static 메소드

package chap04.exam07.sMember;

public class Sub {
	
	static int sField = 134;
	
	static int plus(int a, int b) {
		return a + b;
	}
	
	static int minus(int a, int b) {
		return a - b;
	}
	
	int multi(int a, int b) {
		return a * b;
	}
}


package chap04.exam07.sMember;

public class Main {

	public static void main(String[] args) {
		Sub cal = new Sub();
		
		System.out.println(cal.multi(3, 4) + " : 일반적인 객체화와 메서드 호출 방법을 이용");
		System.out.println(Sub.plus(3, 4) + " : Static의 특징인 생성 없이 메서드 사용.");
		// cal.plus(3, 4); 와 같이 static 메서드를 객체로 생성해서 호출하는건 옳지 않음
		// 저장되는 영역이 다르기 때문, static 영역은 클래스가 있는 영역이다.
		// 객체에서는 이 영역에 접근할 수 없으므로 클래스에서 접근하는 것이 옳다.
		// 이는 원본에 따로 표시한 내용을 복사본에서 볼 수 없는 것과 같다...
		
		System.out.println("객체 생성 후 접근 : " + cal.sField + ", " + "클래스 접근 : " + Sub.sField);
		// 일반적으로 프로그래머들이 많이 하는 실수이기 때문에 틀리더라도
		// eclipse 자체에서 객체 생성 후 접근이 가능하게 지원을 해 주지만 밑줄을 그음.
	}

}






static 변수

package chap04.exam08.sBlock;

public class Monitor {
	static String company = "LG";
	static String model = "Wide Curved Monitor";
	static int price;
	// static은 객체화가 불가능 하므로 잘 사용은 안하지만
	// static block으로 초기해도 되고 값을 바로 지정해도 된다.
	
	static {
		System.out.println(price);
		System.out.println("price 초기화");
		price = 154000;
	}
}


package chap04.exam08.sBlock;

public class Main {

	public static void main(String[] args) {
		
		
		
		
		System.out.println("Monitor 속성 호출");
		System.out.println("제조사 : " + Monitor.company);
		System.out.println("모델 : " + Monitor.model);
		System.out.println("가격 : " + Monitor.price);
	}

}


+ Recent posts