Java

Java의 static 키워드

dev-rootable 2024. 5. 17. 12:49

❓ static 이란?

 

모든 인스턴스에서 공유되는 static 변수

 

자바에서 static 키워드는 클래스 레벨의 변수나 메서드, 블록을 정의할 때 사용된다. 이는 인스턴스 생성 없이도 접근 가능하며, 모든 인스턴스에서 공유된다. static 변수는 클래스가 로드될 때 Method 영역에 할당되기 때문에 프로그램 시작부터 종료까지 메모리에 유지된다. 이러한 특성으로 인해 모든 인스턴스가 공유하여 사용할 수 있는 변수가 필요할 때 유용하다.

 

🔎 static 변수

 

static 변수는 클래스 레벨에서 선언되며, 모든 인스턴스에 의해 공유된다. 그래서 특정 데이터를 모든 인스턴스가 공유해야 할 때 유용하다.

 

다음은 static 변수 사용 예시다.

 

public class Calculator {

    public static int value; //default 0
    
    public void add() {
        value++;
    }
    
    public void subtract() {
        value--;
    }
    
}

 

🔎 static 메서드

 

정적인 값(상태를 가지지 않는 값)에 대한 연산에 유용

 

static 메서드는 인스턴스 생성 없이 클래스 이름을 통해 직접 호출할 수 있다. 주로 유틸리티 함수나 인스턴스의 상태에 의존하지 않는 연산을 수행할 때 유용하다. 왜냐하면 static 메서드는 클래스의 다른 static 메서드나 변수만 접근할 수 있고, 인스턴스 멤버에 접근할 수 없기 때문이다. 즉, 정적인 값만 다룬다는 것이다.

 

잠시 Java의 인스턴스 멤버를 살펴보자.

 

인스턴스 멤버는 new 연산자를 통해 객체를 생성한 후 사용할 수 있는 값으로 객체 없이는 사용할 수 없다. 인스턴스 필드는 Heap 영역에 객체마다 따로 존재하고, 인스턴스 메서드는 Method 영역에 저장되어 같은 클래스의 인스턴스끼리 공유한다. 여기서 알 수 있는 점은 인스턴스 멤버는 객체 단위로 메모리를 할당받고, 그 객체의 변수나 메서드를 공유한다.

 

객체에 묶여 있는 인스턴스 멤버는 상태가 있는 데이터를 다루고, 클래스에 묶여 있는 static 메서드는 상태가 없는 데이터를 다룬다.

 

public class MyCalculator {

    public static int add(int x, int y) {
        return x + y;
    }
    
    public int subtract(int x, int y) {
        return x - y;
    }
    
}

    MyCalculator.add(3, 4); //static method => 클래스명으로 사용 o
    MyCalculator.subtract(5, 3); //not static method => 객체 생성 후 사용해야 함

 

🔎 static 블록

 

static 블록은 클래스가 처음 로드될 때 한 번만 실행되는 코드 블록이다. 그래서 프로그램 시작 시 필요한 리소스를 준비하는 초기화 작업에 적합하다. 주로 static 변수의 초기화에 사용된다.

 

static class Machine {

    static String type = "Init";
    
    static {
        System.out.println("Operating Test");
        type = "Testing";
    }
    
}

 

💥 static 키워드의 남용 주의

 

🚨 메모리 낭비

 

자바에서 static 키워드는 동일한 값을 유지하기 때문에 인스턴스처럼 복사본을 유지할 필요가 없으므로 메모리 사용을 최적화할 수 있고 속도가 빠르다. 하지만 static 변수가 남용되면 오히려 프로그램 퍼포먼스에 부정적인 영향을 줄 수 있다.

 

static 변수가 저장되는 곳은 Method 영역이다. 해당 영역은 명시적 NULL을 선언하지 않는 한 프로그램 종료까지 메모리에 생존한다. 그래서 프로그램 생명주기 동안 메모리에 상주하므로, 불필요한 static 사용은 프로그램 성능 저하로 이어질 수 있다.

 

🚨 객체지향 원칙 위반

 

static은 객체지향적이지 못하다.

 

객체지향 프로그래밍 원칙에 따르면, 한 객체가 지니고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 해야 한다. 하지만 static은 따로 객체를 생성하지 않고 클래스를 통해 직접 데이터를 불러오기 때문에 각 객체의 데이터들이 캡슐화되어야 한다는 객체지향 프로그래밍의 원칙을 위반한다.

 

🚨 재사용성

 

static 메서드는 Interface를 구현하는 데 사용될 수 없다. 따라서, 재사용성을 높여주는 객체지향적 설계에 방해될 수 있다.

 

References:

 

https://f-lab.kr/insight/understanding-and-using-java-static-keyword?gad_source=1&gclid=Cj0KCQjw3ZayBhDRARIsAPWzx8olhQnAc3pmvw4u5YKdOQbAZLied7ddvvXDfql8eWX-SwyPozlANxcaAuTtEALw_wcB

 

자바에서의 static 키워드 이해와 올바른 사용법

자바에서 static 키워드의 기본적인 사용법과 주의점, 그리고 효과적인 사용 사례에 대해 알아보는 글입니다.

f-lab.kr

 

https://velog.io/@gudonghee2000/static-vs-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4

 

Static사용의 장점과 단점

* Static * Static : 자바 언어 예약어로 클래스 메서드와 클래스 필드를 지정할 때 사용한다. 인스턴스를 생성하지 않아도 클래스의 메서드와 필드에 접근을 가능하게 한다. * Static 함수, 변수의 메

velog.io

 

https://bambookim.tistory.com/17

 

[Java] 인스턴스 멤버 vs. 정적 멤버와 static

인스턴스 멤버 인스턴스 멤버는 객체(인스턴스)를 생성한 뒤 사용할 수 있는 필드와 메소드이다. 인스턴스 필드와 메소드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다. public cl

bambookim.tistory.com

 

https://velog.io/@yyy96/static

 

static 과 객체지향적 관점

static 에 관하여. 그리고 자바가 static을 지양하는 이유는?

velog.io