Static

Fox·2023년 12월 29일
0
post-thumbnail

Static 이란?

정의

  • Static(정적)은 고정된 이라는 의미를 가지고 있다.
  • 프로그램이 시작되는 시점에 클래스 로더가 클래스를 해석한다.
  • 메서드영역 혹은 힙 영역에 클래스 메타 데이터 및 정적 변수 등을 적재한다.

Static변수와 메서드(정적필드, 메서드)를 만들 수 있는데 이 둘을 합쳐 정적 멤버(클래스 멤버)라고 한다.
해당 변수나 메서드는 프로그램이 종료되기 전까지 사용할 수 있고, GC에 의해 수집되지 않는다.
하지만 정적 객체는 GC에 수집될 수 있다.

또한 static을 붙이면 메모리에 딱 한 번만 할당되어 메모리를 효율적으로 사용할 수 있다.
즉, 같은 주소값을 공유한다는 것이며 final과 유사한 느낌이 있다.

  • 공용으로 사용여부에 따라 인스턴스로 생성할지 정적으로 생성할지 결정하면 된다.
  • 그냥 생성하면 자동으로 인스턴스로 생성된다.
  • 하지만 정적으로 사용하려면 Static키워드를 사용하여 생성한다.


사용 예시

Static 필드 예시

[선언]

static int num1 = 0; // 클래스 필드  
int num2 = 0; // 인스턴스 필드

[실행]

class Example {  
  
    static int num1 = 0; // 클래스 필드  
    int num2 = 0; // 인스턴스 필드  
}

public class ExampleMain {  
    public static void main(String[] args) {  
        Example number1 = new Example(); // 객체 생성
        Example number2 = new Example(); // 객체 생성 
  
  
        number1.num1++; // 클래스 필드 num1값 1 증가  
        number1.num2++; // 인스턴스 필드 num2값 1 증가  
  
        System.out.println(number2.num1);  
        System.out.println(number2.num2);  
  
    }  
}

[결과]

1
0

종료 코드 0(으)로 완료된 프로세스
  • 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 각각 다른 값을 가져 0으로 출력됐다.
  • 하지만 Static변수는 하나의 저장공간을 공유하기 때문에 number1.num1++를 해 주었지만 number2.num1을 출력해도 값이 동일하게 출력된다.


Static 메서드 예시

[선언]

static void name1() { //클래스 메소드  
    System.out.println("홍길동");  
}  
  
void name2() { //인스턴스 메소드  
    System.out.println("김유신");  
}

[실행]

class Example2 {  
    static void name1() { //클래스 메소드  
        System.out.println("홍길동");  
    }  
  
    void name2() { //인스턴스 메소드  
        System.out.println("김유신");  
    }  
}

public class Example2Main {  
    public static void main(String[] args) {  
        Example2.name1(); //인스턴스를 생성하지 않아도 호출이 가능  
  
        System.out.println("----------------");  
  
        Example2 example2 = new Example2(); //인스턴스 생성  
        example2.name2(); //인스턴스를 생성하여야만 호출이 가능  
    }  
}

[결과]

홍길동
----------------
김유신

종료 코드 0(으)로 완료된 프로세스
  • Static메서드는 클래그가 메모리에 올라갈 때 자동으로 생성되기 때문에 인스턴스 생성 없이 호출할 수 있다.


장단점

장점

메모리 효율:

  • 클래스의 인스턴스 생성과 상관없이 메모리에 존재하므로, 여러 인스턴스에서 동일한 값을 사용할 때 메모리를 절약할 수 있다.

접근성:

  • 클래스 이름으로 직접 접근할 수 있으므로, 객체 인스턴스를 생성하지 않고도 사용할 수 있다.

단점

상태 공유:

  • 모든 인스턴스에서 공유되므로, 여러 인스턴스에서 동시에 변경될 수 있고, 예상치 못한 동작이 발생할 수 있다.

테스트 및 확장성 저하:

  • static 멤버에 종속된 코드는 테스트하기 어렵고, 상속과 같은 개념을 적용하기 어렵다.

결합도 증가:

  • static 멤버는 클래스에 강하게 결합되므로, 코드의 유지보수 및 재사용성에 제약이 생길 수 있다.











참고 : https://kingofbackend.tistory.com/131

profile
주니어개발자 Fox 입니다 🦊

0개의 댓글