본문 바로가기
프로그래밍 언어/자바

자바 클래스와 객체 #5

by 블루데이제이 2022. 9. 12.
728x90
반응형

static

프로그램에서 사용하는 메모리를 할당하는 방식이 두 가지가 있습니다. 동적 할당과 정적 할당인데 동적 할당은 프로그램이 실행 하는 중에 필요할 때 필요한 만큼 메모리를 할당하는 것이고, 정적 할당은 프로그램을 시작하기 전에 원하는 만큼 메모리를 할당받는 것입니다. 자바에서 객체를 생성할 때 즉, new를 사용하여 실행 시간에 메모리를 할당받는 것이 동적 할당에 해당되며 static 메소드나 static 변수가 정적 할당에 해당됩니다.

예제를 통해서 한번 살펴보도록 하겠습니다. Static 이라는 클래스를 생성합니다.

package com.bluedayj;

public class Static {
	public String a = "일반 변수";
	public static String b = "static 변수";
	
	public Static(String a, String b) {
		this.a = a;
		this.b = b;
	}
	
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public static String getB() {
		return b;
	}
	public static void setB(String b) {
		Static.b = b;
	}	
}

StaticTest라는 클래스를 생성합니다.

package com.bluedayj;

public class StaticTest {
	public static void main(String[] args) {
		Static c = null;
		
		System.out.println("객체 생성 전");
		System.out.println(c.a);
		System.out.println(c.getA());
		
		System.out.println(c.b);
		System.out.println(c.getB());
		
		
		c = new Static("일반", "static");
		System.out.println("객체 생성 후");
		System.out.println(c.a);
		System.out.println(c.getA());
		System.out.println(c.b);
		System.out.println(c.getB());
	}
}

저장 후 실행하면 오류가 발생할 것입니다. 객체를 생성하지 않고 객체의 변수나 메소드를 접근하려고 하면 오류가 발생합니다.

코드의 8,9라인을 주석처리 후 실행합니다.

그런데 이번에는 객체를 생성하지 않았는데도 실행이됩니다. static은 객체의 생성과 관계없이 언제나 사용 가능합니다.

 

static 특징

■ 클래스 이름만으로 접근 가능

package com.bluedayj;

public class StaticTest {
	public static void main(String[] args) {
		System.out.println(Static.b);
		System.out.println(Static.getB());
	}
}

소스 코드처럼 객체를 생성하지 않고 바로 Static클래스의 static변수와 메소를 호출할 수 있습니다.

■ 상수

final을 사용하면 변수를 상수와 같이 사용할 수 있습니다. 상수를 만들려면 객체를 생성해야만 했는데 static을 사용하면 모든 클래스에서 사용 가능한 상수를 만들 수 있습니다.

package com.bluedayj;

public class Static {
	public String a = "일반 변수";
	public static String b = "static 변수";
	
	public static final String NAME = "홍길동";
	public static final int AGE = 20;
	
	public Static(String a, String b) {
		this.a = a;
		this.b = b;
	}
	
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public static String getB() {
		return b;
	}
	public static void setB(String b) {
		Static.b = b;
	}	
}

기존 Static 클래스에 상수 NAME과 AGE를 추가합니다.

package com.bluedayj;

public class StaticTest {
	public static void main(String[] args) {
		//Static c = null;
		
		//System.out.println("객체 생성 전");
		//System.out.println(c.a);
		//System.out.println(c.getA());
		
		//System.out.println(c.b);
		//System.out.println(c.getB());
		
		
		//c = new Static("일반", "static");
		//System.out.println("객체 생성 후");
		//System.out.println(c.a);
		//System.out.println(c.getA());
		//System.out.println(c.b);
		//System.out.println(c.getB());
		
		//System.out.println(Static.b);
		//System.out.println(Static.getB());
		
		System.out.println("이름 : " + Static.NAME);
		System.out.println("나이 : " + Static.AGE);
	}
}

객체를 생성하는 과정이 없어서 어떤 클래스에서든 사용할 수 있습니다.

■ 클래스에 하나의 요소만 존재

static 변수나 메소드는 오직 하나만 존재하며 여러 객체에서 공통으로 사용합니다.

package com.bluedayj;

public class CountUp {
	private int gNum = 0;
	private static int sNum = 0;
	
	public CountUp() {
		gNum++;
		sNum++;
	}
	
	public void getCountNum() {
		System.out.println("일반변수 : " + gNum);
		System.out.println("static 변수 : " + sNum);
		System.out.println("==============================");
	}
}

CountUp 클래스를 생성하고 StaticTest 클래스에 다음과 입력하고 실행합니다.

package com.bluedayj;

public class StaticTest {
	public static void main(String[] args) {
        CountUp cu1 = new CountUp();
		cu1.getCountNum();
		
		CountUp cu2 = new CountUp();
		cu2.getCountNum();
		
		CountUp cu3 = new CountUp();
		cu3.getCountNum();
		
		CountUp cu4 = new CountUp();
		cu4.getCountNum();
    }
}

Static 클래스는 생성자 호출될 때 마다 gNum과 sNum의 값을 1만큼 증가시킵니다. gNum은 일반변수이기 때문에 객체가 생성될 때 마다 새롭게 만들어져서 초기값 0에서 1 증가되므로 항상 1이 되고, sNum는 static변수라서 처음에 생성된 것을 여러 객체에서 공유합니다. 즉, cu1객체가 생성할 때 초기값 0에서 sNum++, getCountNum 메소드에서 1 증가된 값 1을 출력, 다음 cu2객체가 생성될 때에는 sNum = 0이 아닌 sNum=1이고 sNum++, getCountNum메소드에서 1증가된 값 2를 출력하게 됩니다.

728x90
반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 문자열 다루기 #1  (0) 2022.09.12
자바 클래스와 객체 #6  (0) 2022.09.12
자바 클래스와 객체 #4  (0) 2022.09.11
자바 클래스와 객체 #3  (0) 2022.09.11
자바 클래스와 객체 #2  (0) 2022.09.11