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를 출력하게 됩니다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
자바 문자열 다루기 #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 |