본문 바로가기

Java

java static 사용이유 생성자 대신 static 팩토리 메소드

728x90
반응형

JAVA Static 이란?


고정된 이란 의미를 가지며 static변수와 static메소드를 만들 수 있다. 

메모리에 한 번 할당되어서 프로그램이 종료될때 해제되는 것을 의미한다.

GC가 적용되지 않는다.

 

일반적으로 Class는 static영역에 할당되고 new를 통해 생성된 객체는 heap영역에 생성된다.

heap영역의 메모리는 gc를 통해 관리를 받지만 static영역에 할당된 메모리는 모든 객체가 공유하는 장점이 있지만

GC관리 영역밖에 존재하기 때문에 자주 사용할 경우 퍼포먼스에 악영향을 줄 수 있다. 

 

Static을 사용하는 이유


인스턴스를 생성할 경우 각 인스턴스는 독립적이기 때문에 서로 다른 값을 유지한다. static을 사용하면 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기때문에 인스턴스들이 공통적으로 값을 유지해야할 때 사용한다. 

static은 객체 생성없이도 사용이 가능하기 때문에 static메서드에는 인스턴스 변수를 사용할 수 없다.

인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문이다. 

메서드에서 인스턴스변수를 필요로 한다면 static을 사용하지 않는 것이 좋고 인스턴스 변수가 필요하지 않으면 static을 붙이는 것이 좋다. 메서드 호출 시간이 짧아지기 때문에 효율이 올라간다. 

static을 붙이지 않은 메서드는 실행할 때 메서드를 찾는 과정이 추가로 필요하기 때문에 시간이 더 걸린다. 

 

Static 변수 특징


객체를 생성하지 않고 static 자원에 접근이 가능하다. 

public class Cal {
    public static int add(int x, int y) {
        return x + y;
    }
}

Cal.add(1, 2);

 

정적 팩토리 메소드


생성자에 비해 명시적으로 이름 지을 수 있다.

 

class App{

    String appName;
    String version;
    
    private static final App STATIC_APP = new App();
    
    public static App getAppName(String name) {
        App app = new App();
        app.appName = name;
        return app;
    }

    public static App initApp(String name, String version) {
        App app = new App();
        app.appName = name;
        app.version = version;
        return app;
    }
    
    public static App getApp() {
        return STATIC_APP;
    }
}

App app = App.initApp("test1", "0.1");

App app1 = App.getApp();

static 메소드를 이용하여 객체를 생성할 경우 

좀 더 명확하고 명시적으로 객체를 생성할 수 있다.

 

static변수를 이용하여 이미 생성된 객체를 리턴하는게 가능하다. 

생성자는 리턴값이 없지만 static 메소드는 반환값을 유연하게 사용할 수 있다. 

728x90
반응형

'Java' 카테고리의 다른 글

JAVA enum vs static 비교  (0) 2022.02.07
JAVA 직렬화란? 직렬화 사용이유  (0) 2022.02.02
JAVA Optional  (0) 2021.02.03
JAVA Stream API 란?  (0) 2021.02.02
JAVA lamda란  (0) 2021.01.29