Programming/JAVA

[JAVA] static과 static 메소드, static 변수

잇나우 2020. 2. 18. 23:36
반응형

static

static이란 의미는 정적인, 고정의 이러한 뜻을 가지고 있지만, 코드에서 static은 모든 객체가 공유하는 것이라는 의미도 있다. 메모리에서 고정된 공간이 할당되기 때문에 static이라는 이름이 붙은것이다. 변수 선언으로 예를 들어보자면 자바는 Statically Type Variable (정적 타입 변수) 이다.

int a = 1;

위의 코드와 같이 자바에서는 변수에 대입할 수 있는 데이터타입을 미리 정해준다. int 즉 정수 타입의 데이터만 담을 수 있는 것이다. 데이터 타입을 미리 고정하기 때문에 static인 셈이다. 하지만 반대로 자바 스크립트에서는 변수의 데이터 타입을 정하지 않고 선언하고 있다.

var a = 1;

자바스크립트에서는 이처럼 데이터타입을 미리 정하지 않고, 실제 들어오는 데이터의 타입으로 변수의 데이터타입이 결정되는데 자바스크립트는 Dynamically Type Variable (동적 타입 변수)를 가지고 있다. static의 반대개념은 dynamic인 셈이다.


static과 클래스, 메소드, 변수

자바의 메소드등을 살펴보면 아래 코드와 같이 static이 적혀있다.

public static void test(){
}

위 코드처럼 메소드에 적혀있거나 변수를 선언해줄때 적어줄 수도 있는데. 일반적으로 클래스에서 new 연산를 통해 생성한 인스턴스 객체가 생성되어야 인스턴스 변수와 메소드를 실행 시킬수 있다. 클래스의 객체가 생성되어야 비로소 메모리 공간의 할당이 되는데 (Heap영역에 생성된다) static으로 선언했을 경우에 객체를 생성하지 않아도 고정된 메모리 공간을 할당받는다.(Static영역). 즉 객체를 선언하지 않아도 스태틱 변수와 스태틱 메소드를 사용할 수 있다는 것이다. static으로 선언된 데이터들은 메모리에 딱 한번만 올라간다. 객체를 생성했을때 객체마다 인스턴스 변수가 생성되는것과는 달라 메모리의 낭비를 줄일 수가 있는데, 미리 객체를 선언하기도 전에 메모리 공간에 올라가 있으니 다른 모든 객체에서 접근이 가능하다. 즉 static으로 선언된 변수와 메소드등은 모든 객체가 공유할 수 있다. 하지만 static 메소드에서는 static 변수만 접근이 가능하다.

// static 메소드 호출 방법
클래스명.메소드명

// 인스턴스 메소드 호출방법
인스턴스객체명.메소드명

static 장점

모든 객채에서 접근이 가능하여 공유할 수 있고 인스턴스가 생성될 때마다 생성되는것이 아니라 메모리를 효율적으로 사용할 수 있다. 또 객체를 생성하지 않고 바로 사용할 수 있기 때문에 참조속도가 빠르다.

static 단점

하지만 static이 할당받은 메모리 영역은 GC(Garbage Collector)관리 영역 밖이기 때문에 프로그램이 종료될때 소멸된다. 즉 프로그램이 종료될때까지 소멸되지 않고 메모리 공간을 차지하고 있다는 것인데 무분별하게 static을 사용할 경우 오히려 메모리 낭비가 더 심해질 수 있다.

반응형