[자바]static, JVM memory의 기본(2편)

Posted by ITPangPang
2016. 4. 9. 00:15 Java/Java 알아두면 좋은것


기본 2편에서는 JVM memory와 연관지어서 Static의 장,단점을 알아보겠습니다.

아무래도 장단점이라고 하면 객체생성과 Static의 비교일수도 있겠네요.

 

Static의 장점

① Static은 공용자원이다.

   이를 설명하기 위해 예를 만들어보겠습니다

   (살짝..적절하지 않은 예시인데 공용한다는 느낌만 받으세요. 적절하지 않은 이유는 밑에서..)

   한 회사에 Kim씨와 Park씨 두사람이 있습니다.

   이 두사람은 각자의 컴퓨터를 쓰면서 각자개인문서1개와 공유하는 1개의 공유문서를 씁니다


   Kim,Park씨는 개인문서와 공유문서를 열어놓고 작업을 하고 있습니다.

   그렇다면 (Kim씨,Park씨,공유)문서는 각각 몇번 열렸을까요?


class Computer
{
    static int openSharedDoc = 0;
    int openDoc =0;
    boolean isKimPark = false;
    
    void open()
    {
        openSharedDoc++;
        openDoc++;
        if(isKimPark == false)
        {
            System.out.println("공유문서가"+openSharedDoc+"번, "+"Kim문서가"+openDoc+"번 열렸습니다.");
        }
        else
        {
            System.out.println("공유문서가"+openSharedDoc+"번, "+"Park문서가"+openDoc+"번 열렸습니다.");
        }
    }
}
 
public class Company 
{
    public static void main(String[] args)
    {
        Computer Kim = new Computer();
        Computer Park = new Computer();
        
        Kim.isKimPark=false;
        Kim.open();
        
        Park.isKimPark=true;
        Park.open();
    }
}


똑같이 2번씩 호출했는데 왜 이러한 현상이 나타나는걸까요?

 


이것은 역시 Static 때문에 발생하는 결과로 코드가 한줄한줄 읽히기 전에

Static은 특별취급 해서 미리 메모리에 올라타기 때문에 그렇습니다

그에 비해서 openDoc는 코드가 쫙쫙쫙 읽힐때 인스턴스화 하는순간 메모리에 올라탑니다.

그래서 생성된 인스턴스는 각자 따로따로 놀게 되는거죠..

 

② 제대로 사용한다면 메모리를 효율적으로 사용할 수 있다.

   생성 할때마다 인스턴스가 메모리에 올라가는것이 아니라 고정메모리이므로 효율적입니다

   

③ Static은 속도가 빠르다.

   객체를 생성하지 않고 바로 사용하기 때문에 참조속도가 빠릅니다.

   (확실히 장점이긴 하지만 개인적으로는 자세히 알아둬야할 중요성은 적다고 생각하여 짧게)

   빠르다는 것만 알고계시면 됩니다.

 

Static의 단점

① 무분별한 Static 사용은 오히려 메모리 낭비가 될 가능성이 있다.

    위에 장점 ②번에서 앞에 제대로를 붙인 이유이기도 한데 Static은 미리 메모리를 할당받습니다. 그러나 소멸되는 시점은 프로그램이 종료될때 입니다 사용을 안하고 있어도 메모리를 계속 잡혀있는것이죠. 그러나 객체생성으로 만들어진 인스턴스는 Garbage Collecion(아직은 몰라도 됩니다) 통하여 소멸이 되므로 오히려 Static을 사용 하는 것이 메모리 낭비가 될 가능성이 있습니다

 

② 잘못 사용된 Static 사용은 오류발생시 디버깅이 굉장히 힘들다.

    (이것 때문에 위에 예시가 적절하지 않다는 부분도 있는데)

    위 예시는 간단해서 오류가 날 확률이 없지만, 프로젝트가 커지고 복잡해졌을때 값이 자주 바뀌는 객체를 Static으로 사용하는 경우 Static은 공유자원이기 때문에 예상치 못한 오류가 생길 수 있다.

 

③ Static메소드에서는 Static변수만 사용할 수 있다.

    


    Static은 위에서 특별취급 한다고 얘기했듯이 Static 공간에는 Static끼리 따로 모여있어서 앞에 Static이 붙지 않으면 들어올수가 없습니다.

 

 

이로써 Static의 장점과 단점을 살펴보았습니다.

단점도 많아 보이지만 사실 위에 3가지 전부 큰프로젝트만 아니라면 별 문제가 되지 않습니다

그리고 규모가 큰 프로젝트를 맡는 개발자는 기본이 탄탄해서 깊게 메모리로 접근 안해도 단점을

보완하실 수 있을겁니다.

 

Static을 효율적으로 사용하는 방법은

① 위의 공유문서처럼 공유하는 값에 사용한다.(대신 순간순간마다 자주 바뀌면 좋지 않아요)

    1)보통 변화가 적은 제품의 가로, 세로, 높이에 많이 쓰입니다.(가로, 세로, 높이)

    2)아니면 실생활용품을 5개 Set묶음으로 5천원 가격으로 판매하는데(가격)

      월요일 : 칫솔, 가위, 휴지, 비누, 수건

      화요일 : 칫솔, 지우개, 면도기, 샴푸, 손톱깍기

      요일별로 안에 제품은 다르지만 가격은 5천원으로 고정되죠.

      특별세일하는날에는 4천원으로 내릴수도 있지만 자주 변하지는 않죠.

② 절대적으로 변하지 않는값에는 final과 함께 Static을 붙여서 사용한다.

    1) 3.14라는 파이값은 절대 변할일이 없습니다.

    2) 미성년자법적기준 나이도 변할 확률이 거의 없겠죠.

    3) 하루가 24시간, 한시간이 60분, AM, PM 등등

 

마지막으로 Static을 정리하자면

Static은 객체생성 없이 공용된 자원을 사용함으로써 메모리를 효율적으로 사용할 수 있지만 무분별한 사용은 프로그램에 악영향을 미칠수 있다.

 

다음번에 기회가 된다면 Static+JVM(심화)편으로 프로그램 실행부터 종료까지의 나머지 JVM영역별 역할과 

public static void main(String[] args) 이 한줄이 의미하는 JVM에서의 역할을 알아보겠습니다.