Java

Static 이란?

WOOOOJI 2023. 1. 13. 22:14

Static 이란 뭘까요?

static : 영단어를 직역하면 말 그대로 “고정된” 이란 의미를 가지고있다. static이라는

키워드를 사용하여 메소드나 변수를 만들 수 있는데 다른 말로는 정적 필드와 정적 메소드를 생성한다고 할 수 있다. 이 둘을 합쳐놓으면 정적맴버라고 말할 수 있다.

 

 

정적 필드와 정적 메소드는 인스턴스(객체)에 소속된 맴버가 아니고 클래스에 고정된 맴버이다. 이말은 즉슨 타 클래스에서 객체를 생성해 해당값을 바꾸면 또 다른 클래스에서 쓰고 있는 정적필드 혹은 정적메소드의 값도 달라지는 것이다.

클래스 로더가 클래스를 로딩하고 메소드 메모리 영역에 넣을때 클래스별로 관리가 된다.

 

그래서 클래스 로딩이 끝나면 어디든지 다 사용할 수 있다.

Ex) 클래스명.변수명 을 사용하여 접근할 수 있다. 객체를 따로 만들필요가 없다는 뜻!

 

장단점?

  • 장점 : static으로 생성된 정적 맴버들은 Heap영역이 아닌 Static영역으로 저장이 된다. Static영역에 할당된 맴버들은 모든 객체가 공유하고
  • 사용하기 때문에 어디서든지 참조하고 사용이 가능하다는 장점이 있다.
  • 단점 : Garbage Collector의 영역 밖에 존재해서 Static영역에 있는 맴버들은 프로그램의 종료시까지 메모리에 할당된 채로 존재한다.
  • 그렇기에 static을 너무 남용하게 되면 만들고자 하는 프로그래밍이 너무 무겁고 성능이 안좋을 수 있다

그렇다면 heap영역과 static 영역은 무엇일지 대략 알아보자.

  • Static : 주로 클래스들이 할당, Garbage Collector 관여 X, 모든 객체가 메모리를 공유
  • Heap : 주로 객체들이 할당, Garbage Collector 관여 O , 메모리를 공유하지 않음.

 

 

정적(Static) 멤버 선언

필드나 메소드를 생성 시 인스턴스로 생성할것인지 정적으로 생성할 것인지에 대한 판단 기준은 다른 클래스들이랑 공용으로 사용하느냐 아니냐로 정의를 하고,

그냥 생성한다면 자동으로 인스턴스(객체) 가 생성되며 정적으로 생성하려면 필드와 메소드 선언시 static 이라는 키워드를 추가적으로 붙이면 된다.

static int num = 0; //타입 필드 = 초기값
public static void static_method(){} //static 리턴 타입 메소드 {}

 

 

정적(Static) 필드 예시

class Number{
    static int num = 0; //클래스 필드
    int num2 = 0; //인스턴스 필드
}

public class Static_ex {
	
    public static void main(String[] args) {
    	Number number1 = new Number(); //첫번째 number
    	Number number2 = new Number(); //두번쨰 number
    	
    	number1.num++; //클래스 필드 num을 1증가시킴
    	number1.num2++; //인스턴스 필드 num을 1증가시킴
    	System.out.println(number2.num); //두번째 number의 클래스 필드 출력
    	System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력
    }

여기서 number의 클래스에서 생성된 객체들 number1,2 들은 각자 다른 필드를 사용했다

number1 ⇒ 클래스(정적) 필드 num을 1증가시켰다.

number2 ⇒ 인스턴스 필드 num을 1증가시켰다.

그렇다면 둘 다 1씩 증가를 했을까? 일단 결과는 아니다!

 

 

그 이유는 인스턴스 변수(필드) 는 인스턴스가 생성될 때마다 생성되므로 각기 다른 인스턴스 마다 다른 값을 가지지만.

정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가지기에 나타난 형상이다!

정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다.

그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.

(유틸리티 함수(클래스) 란 클래스의 본래의 목적인 데이터와 데이터처리를 위한 로직의 캡슐화!

가 아닌 비슷한 기능의 메서드와 상수를 모아서 캡슐화 한것이 유틸리티 클래스입니다.)

728x90