본문 바로가기
Java & Kotlin/Java

12. Static

by heekng 2021. 1. 19.
반응형
 

static이란, 일반적으로 프로그램이 실행됨과 동시에 원하는 값이 메모리에 올라가게 해주는 것을 의미합니다.

static을 이용하여 프로그램이 실행될 때 값이 메모리에 올라간다면, 서로 다른 클래스에서도 static이 붙은 값에 접근할 수 있게 되어 같은 값을 가진 변수를 여러개를 생성하여 메모리를 손해보는?일을 줄일 수 있습니다.

static이 붙은 변수와 메소드들은 build단계에서 메모리에 우선적으로 올라가게 됩니다.

.java파일 ==컴파일==> .class ====> 링크 ==build단계==> 로더단게 ====> 실행


1. 클래스 변수 Static

클래스 내에서 사용하는 변수에 static을 붙여 클래스변수로 선언한다면 클래스로 생성하는 객체들이 모두 동일한 값의 변수를 가지고있을 때 해당 변수를 메모리에 한번만 올려 차지하는 메모리의 양을 줄일 수 있습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class Car {

int wheel = 4; //인스턴스변수

String name; //인스턴스변수

}

 

public class blog {

public static void main(String[] args) {

Car car1 = new Car(); //Car클래스 객체 1 생성

car1.name = "자동차1";

Car car2 = new Car(); //Car클래스 객체 2 생성

car2.name = "자동차2";

 

System.out.println(car1.name+"의 바퀴 수는 " + car1.wheel + "개");

System.out.println(car2.name+"의 바퀴 수는 " + car2.wheel + "개");

}

}

예를 들어 위와 같이 Car클래스의 인스턴스 변수를 wheel과 name으로 선언한다면 car1객체의 wheel과 name 각각의 메모리 공간이 확보되고, car2 객체의 wheel과 name의 메모리 공간이 확보됩니다.

하지만 자동차의 바퀴 수는 항상 4개로 고정이기 때문에 변수 wheel을 static변수로 선언한다면?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

class Car {

static int wheel = 4; //클래스 변수

String name; //인스턴스변수

}

 

public class blog {

public static void main(String[] args) {

Car car1 = new Car(); //Car클래스 객체 1 생성

car1.name = "자동차1";

Car car2 = new Car(); //Car클래스 객체 2 생성

car2.name = "자동차2";

 

System.out.println(car1.name+"의 바퀴 수는 " + Car.wheel + "개");

System.out.println(car1.name+"의 바퀴 수는 " + car1.wheel + "개");

 

System.out.println(car2.name+"의 바퀴 수는 " + Car.wheel + "개");

System.out.println(car2.name+"의 바퀴 수는 " + car2.wheel + "개");

 

car1.wheel = 10; // car1에서 클래스변수 변경

System.out.println("\n변경 후의 바퀴 수");

System.out.println(car1.name+"의 바퀴 수는 " + Car.wheel + "개");

System.out.println(car1.name+"의 바퀴 수는 " + car1.wheel + "개");

 

System.out.println(car2.name+"의 바퀴 수는 " + Car.wheel + "개");

System.out.println(car2.name+"의 바퀴 수는 " + car2.wheel + "개");

}

}

위와 같이 클래스변수로 선언된 wheel은 모든 객체에서 공통으로 이용되며, wheeel은 실행될 떄 메모리에 올라가 한번의 메모리 공간을 가지고, 각각의 객체는 각자의 name변수에 해당하는 메모리 공간만을 필요로 합니다.

하나의 객체에서 클래스변수의 값을 변경한다면 같은 클래스의 다른 객체에서도 수정된 값으로 출력되게 됩니다.


2. 클래스 내 메소드 static

static은 클래스변수에서 사용할수 있는것과 같이 메소드를 선언할 때에도 사용할 수 있습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class Car {

static int wheel = 4; //클래스 변수

String name; //인스턴스변수

 

void start() {

System.out.println(this.name+"가 출발했습니다.");

}

}

 

public class blog {

public static void main(String[] args) {

Car car1 = new Car();

car1.name = "자동차1";

car1.start();

//Car.start(); static이 붙지 않은 메소드는 객체화된 객체에서만 사용할 수 있다.

}

}

일반적으로 메소드는 위와 같이 사용하여 객체를 만들어서 메소드를 사용해야 했습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class Car {

static int wheel = 4; //클래스 변수

String name; //인스턴스변수

 

static void start() {

//System.out.println(this.name+"가 출발했습니다.");

//static은 이미 메모리에 올라가 있고, 인스턴스변수가 포함된 코드는 static내에서 사용할 수 없다.

System.out.println("자동차가 출발했습니다.");

}

}

 

public class blog {

public static void main(String[] args) {

Car car1 = new Car();

car1.name = "자동차1";

car1.start();

Car.start(); //static메소드는 객체화가 되지 않아도 클래스 자체 함수로 사용할 수 있다.

}

}

하지만 위와 같이 메소드에 static을 붙여준다면 객체화 하지 않더라도 메소드를 사용할 수 있습니다.

메소드에 static을 사용할 때 주의할 점으로 인스턴스변수를 포함할 수 없다는 것입니다.

예를 들어 위 코드에서 name은 객체가 생성될 때 name이 메모리에 올라가게 됩니다. 하지만 static void start()메소드는 빌드단계에서 메모리에 올라가기 때문에 메모리에는 name이라는 인스턴스 변수가 존재하지 않습니다. (static메소드가 인스턴스 변수 name보다 먼저 메모리에 올라간다.) 따라서 컴파일러에서 거부하게 됩니다.


정리하자면, static이란 우선적으로 메모리에 올려 다른 클래스에서도 공용으로 사용할 수 있다는 것을 뜻하며, 해당 필드가 끝나면 사라지게 되는 멤버변수에는 static을 사용할 수 없고, 같은 값을 가진 변수를 여러번 선언하지 않아도 되기 때문에 메모리를 아낄 수 있습니다.

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

15. 싱글톤 (Singleton)  (0) 2021.01.19
14. 접근제한자(public, protected, private, default), getter, setter  (0) 2021.01.19
13. final  (0) 2021.01.19
11. 열거형 (Enum)  (0) 2021.01.19
10. 클래스 (Class, 생성자)_1  (0) 2021.01.19
9. 메서드, 함수 (Function, 오버로딩)  (0) 2021.01.19