자바에서의 static 그리고 코틀린에서 사용 1편

Kyung yup Lee·2020년 12월 23일
1

코틀린

목록 보기
3/3

static을 사용하는 이유

1. 클래스를 객체화 하지 않고도 멤버변수나 함수를 사용 가능

자바에서는 static을 사용함으로써 클래스를 객체로 생성하지 않고 내부에 있는 변수나 함수를 사용할 수 있다.

일반적으로 배우는 클래스는 객체의 설계도라는 개념과는 약간 대치되는 듯 하다.

클래스는 런타임 때 메모리에 올라가고 객체로 초기화 될 때부터 사용이 가능하다. 하지만 static으로 변수나 함수를 선언하면 그 변수나 함수는 클래스가 런타임에 메모리에 적재되는 즉시 사용 가능하다.

class Item{
	static String name = "이름";
}

System.out.println(Item.name);

해당 클래스의 name 변수는 Item 클래스가 초기화 되지 않아도 사용할 수 있다.

이것이 의미가 있는 이유는 자바에 initiater 가 필요하기 때문이다. 자바는 모든 객체가 클래스로 만들어지게 된다. 그리고 어떤 객체화든 클래스 안에서 해야되기 때문에

우스개소리로 "'클래스를 객체화하기 위한 클래스'를 객체화 하기 위한 클래스를 객체화 하기 위한........." 으로 가장 태초의 클래스까지 올라가면

그 태초의 클래스를 객체화 해줄 수 있는 클래스는 존재할 수가 없다. 때문에 객체화 없이도 클래스를 메모리에 올릴 수 있는 방법이 필요했다.

우리가 아무 생각 없이 쓰고 있는

class Item{
	public static void main(String[] args){
    	System.out.println("가장 먼저 메모리에 올라갑니다.");
    }
}

메인 메소드가 이 static 을 통해 객체화 하지 않아도 메소드가 호출되는 예시이다.

실제로 이 내용은 필자가 올해 봤던 카카오 엔터프라이즈 신입공채 1차 면접질문으로 나왔던 내용이다.

2. 인스턴스들이 공통으로 static 값을 사용할 수 있다.

인스턴스들은 객체화가 되면 모두 독립적으로 존재한다.

하지만 인스턴스들이 특정 변수나 메소드를 공유해서 사용해야되는 경우가 있을 것이다.

예를 들어 카페라는 클래스가 있고, 이 카페는 반드시 아메리카노를 어떤 손님에게든 최소 한 잔씩은 판매한다고 했을 때,

static 변수를 아메리카노로 선언하여, 판매하는 메소드에 이 static 변수를 통한 코드를 짬으로써, 버그를 줄일 수 있을 것이다.

class Cafe{
	static String base_coffee = "아메리카노"
    
    public void sell(String additional_coffee){
    	System.out.println(base_coffee + "는 반드시 판매합니다.");
        System.out.println(additional_coffee + "를 추가 주문합니다.");
    }
}
Cafe cafe1 = new Cafe()
Cafe cafe2 = new Cafe()
Cafe cafe3 = new Cafe()

cafe1.sell("라뗴")
cafe1.sell("모카")
cafe1.sell("토피넛라떼")

base_coffee 는 Cafe의 어떤 객체에서도 아메리카노로 똑같이 동작하게 된다.

모든 인스턴스에서 같은 값으로 적용되어야 하는 변수를 선언할 때 static을 사용하면 된다.

그리고 만약 어떤 객체가 base_coffee 값을 바꿔버리면 다른 객체에서도 모두 바뀌게 된다.

그러므로 static 변수로 선언할 때, 변수값이 바뀌는 경우가 없다면 상수로 선언하는 것이 버그를 예방하는 데 도움이 된다.

조심할 점

1. static 메소드에서는 static 변수만을 사용할 수 있다.

즉, 인스턴스 멤버 변수를 사용할 수 없고, static이 붙은 변수만을 사용할 수 있다. 이 이유는 static을 사용하는 이유 1번과 맥락을 같이 한다.

static은 런타임 때 객체화가 되지 않아도 메모리에 적재된다. 이 말은 이 프로그램에서 가장 먼저 메모리에 적재되는 것이 static 관련 변수와 메소드라는 것이다.

static 메소드가 메모리에 적재되었는데, 그 메소드의 관련 변수들은 인스턴스 변수라서 객체화 될 때까지 메모리에 올라가지 못한다면, 이 메소드가 호출 될 때 관련 변수가 메모리에 적재되어있을지 없을지 장담할 수 없다. 즉 버그를 발생시킬 가능성이 매우 높기 때문에 static 메소드에서는 static 변수밖에 사용하지 못한다.

2. 인스턴스 변수를 사용하지 않는 메소드는 static을 붙이는 것이 좋다.

인스턴스 변수를 사용하는 메소드는 static을 붙일 수 없다. 그리고 인스턴스 변수를 사용하지 않는 메소드는 static을 붙여도 되고 안 붙여도 되지만, 붙이는 게 효율이 좋다.

왜냐하면 static 선언을 하면 프로그램이 시작되자마자 모두 메모리에 적재가 되기 때문에 호출 했을 때 반응 속도가 빠르기 때문이다.

참고

static 변수를 사용하는 메소드를 클래스 메소드라고 부르고, 인스턴스 변수를 사용하는 메소드를 인스턴스 메소드라고 부른다.

글 하나에 다 쓰기엔 양이 많아 코틀린에서 static 사용은 2편으로...

profile
성장하는 개발자

0개의 댓글