본문 바로가기

프로그래밍 언어/Java

static 변수와 함수

Static 키워드 이점

 

1. 메모리 측면

학교라는 클래스가 있다고 가정해보자.

class School {
    int studentNumber = 38;
}

public class testSample {
    public static void main(String[] args) {
        School school1 = new School();
        School school2 = new School();
    }
}

 

위와 같이 학교라는 클래스를 만들고 객체를 생성하면 객체마다 별도의 studentNumber을 위한 메모리가 할당이 된다.

하지만 studentNumber가 변하지 않고 항상 모든 학교마다 같다면 static 변수로 선언해 객체마다 공유함으로써 메모리 이점을 살릴수 있다.

 

class School {
    static int studentNumber = 38;
}

public class testSample {
    public static void main(String[] args) {
        School school1 = new School();
        School school2 = new School();
    }
}

이렇게 static 키워드를 붙이게 되면 자바는 처음 메모리 할당을 한번 하므로, 메모리 사용에 이점이 있다.

 

2. 기능적인 측면(공유)

static으로 설정하여 생성하면, 해당 객체를 참조하는 모든 객체가 같은 메모리 공간을 보게 되므로 공유라는 측면에서의 이득이 존재한다.

class VisitCounter {
    int visitCount = 0;

    public VisitCounter() {
        visitCount++;
    }

    public int getVisitCount() {
        return this.visitCount;
    }
}

public class testSample {
    public static void main(String[] args) {
        VisitCounter visitCounter1 = new VisitCounter();
        System.out.println("visitCounter = " + visitCounter1.getVisitCount());
        VisitCounter visitCounter2 = new VisitCounter();
        System.out.println("visitCounter = " + visitCounter2.getVisitCount());
    }
}

위처럼 static으로 설정하지 않고 일반적인 변수로 설정할 경우 카운트는 각각 1,1으로 나온다. 서로 값을 공유하지 않기 때문이다.

class VisitCounter {
    static int visitCount = 0;

    public VisitCounter() {
        visitCount++;
    }

    public int getVisitCount() {
        return this.visitCount;
    }
}

public class testSample {
    public static void main(String[] args) {
        VisitCounter visitCounter1 = new VisitCounter();
        System.out.println("visitCounter = " + visitCounter1.getVisitCount());
        VisitCounter visitCounter2 = new VisitCounter();
        System.out.println("visitCounter = " + visitCounter2.getVisitCount());
    }
}

하지만 위처럼 static으로 선언시 값은 1,2가 나오게 된다. 처음 한번만 생성되어 값을 공유하기 때문이다.

그렇기에 공유적인 측면에서의 static 사용을 들수 있다. 보통 static 키워드를 사용한다고 하면 성능적인 측면보다는 공유적인 측면을 더 많이 사용하는 경우가 많고 그 원리는 위에서 볼수 있다.

 

* final 키워드 : 보통 static은 final 키워드와 같이 사용하는 경우가 많다. final 키워드는 한번 값이 생성되면 값을 변경할수 없게 하려고 사용한다. 따라서 static final의 경우는, 공유 목적으로 사용하는 변경해서는 안되고 될수 없는 상수값을 사용할 경우에 사용된다. 전 모듈에서 사용하는 설정값 혹은 전역변수등을 설정할때 주로 사용된다

 

 

Static 함수

static은 변수뿐만 아니라 함수에서도 적용할수 있는데, static키워드를 붙인 함수를 static함수라고 칭한다.

public static boolean equals(CharSequence cs1, CharSequence cs2) {
}

이런 형식으로 사용하는데 이러한 Static함수를 사용하는 목적에는 여러 이유가 있다.

1. 인스턴스 생존에 의존하지 않는다

2. 변화를 가정하지 않고 공유를 목적으로 한다.

 

Util클래스들이 정적 메소드들을 많이 포함하는데 이유는 여러 모듈이나 객체에서 공유되어야 하는 메소드들이 있고 그 메소드들이 해당 객체의 생존에 의존하지 않기 때문이다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

JVM 메모리 구조  (0) 2022.05.02
싱클톤 패턴(Singleton Pattern)  (0) 2022.03.17
Char를 Int로 변환하기  (0) 2022.02.19
자바 공백문자 채우기  (0) 2022.02.17
자바 소수점 올림 / 버림 / 반올림/ 절대값  (0) 2022.02.17