BE/Java

[Java] static

baek-dev 2024. 11. 30. 19:10

`static`은 클래스 레벨에서 관리되는 요소를 정의할때 사용된다.

 

`static`의 특징

1. 클래스와 연관됨

  • `static` 으로 선언된 요소는 클래스 로드 시 메모리에 올라가며 해당 클래스의 모든 객체가 공유한다.
  • 객체에 종속되지 않고 클래스 자체에 종속된다.

2. 객체 생성 없이 사용 가능

  • `static` 멤버는 클래스 이름을 통해 직접 호출할 수 있다.
  • 예 : `ClassName.staticMember`

3. 메모리 공유

  • `static` 변수는 한번만 메모리에 할당되며 모든 객체가 이를 공유한다.
  • 인스턴스 변수와 달리 개별 객체마다 복사본이 생성되지 않는다.

`static`의 주요 사용처

1. `static` 변수

  • 클래스 전체에서 공유되는 변수
  • 프로그램에서 일정한 값을 유지하거나 모든객체가 공통으로 사용하는 데이터를 저장할때 유용
public void Example {
    static int count = 0;	// 모든 객체가 공유
    int instanceVar = 0;	// 각 객체마다 고유
}

 

2. `static` 메서드

  • 객체 없이 호출 가능한 메서드
  • 인스턴스 변수나 메서드에 접근할 수 없으며 클래스변수(`static` 변수)만 다룰수 있다
public class Example {
    static void printMessage() {
    	System.out.println("Hello, static method!");
    }
}

public class Main {
    public static void main(String[] args) {
    	Example.printMessage(); // 객체없이 호출 가능
    }
}

 

3. `static` 블럭

  • 클래스가 메모리에 로드될때 한번 실행된다
  • 주로 초기화 작업을 수행하거나 복잡한 정적 데이터를 설정할때 사용
public class Example {
    static int count;
    
    static {
    	count = 10;	// static 블럭을 통한 초기화
        System.out.println("Static block executed!");
    }
}

 

4. `static` 중첩 클래스 (Nested Class)

  • 클래스 내부에 선언된 클래스에 `static` 을 붙이면 외부 클래스의 객체 생성 없이 사용 가능
public class Outer {
    static class Inner {
    	static void display() {
        	System.out.println("Static nested class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
    	Outer.Inner.display();	// 객체 생성 없이 접근
    }
}

`static` 의 동작 방식

  • 클래스가 처음 로드될때 `static` 멤버가 메모리(메서드 영역)에 할당 된다.
  • 프로그램 종료시 까지 유지되며 한번만 초기화 된다.

주의 사항

1. `static` 메서드는 비정적 멤버에 접근할 수 없다.

  • `static` 메서드는 클래스 로드시 메모리에 올라가므로 객체가 생성되기 전에 호출될 수 있다.
  • 객체에 종속적인 인스턴스 변수나 메서드에 접근할 수 없다.
public class Example {
    int instanceVar = 5;
    
    static void display() {
    	// System.out.println(instanceVar); // 컴파일 에러!
    }
}

 

2. 메모리 관리 주의

  • `static` 변수는 모든 객체가 공유하므로 불필요하게 사용하면 메모리 누수로 이어질 수 있다

3. 객체지향 설계의 제한

  • `static` 을 남용하면 객체 지향의 특징인 캡슐화와 다형성을 해칠 수 있다

`static` 활용 예제

public class Counter {
    static int count = 0;	// 모든 객체가 공유하는 변수
    
    Counter() {
    	count++;	// 객체가 생성될때 마다 증가
    }
    
    static void displayCount() {
    	System.out.println("Count: " + count);
    }
    
    public static void main(String[] args) {
    	Counter c1 = new Counter();
        Counter c2 = new Counter();
        
        Counter.displayCount();	// Count: 2
    }
}

요약

  • `static` 변수 : 클래스 전체에서 공유되는 변수
  • `static` 메서드 : 객체없이 호출 가능한 메서드
  • `static` 블럭 : 클래스 로드시 한번 실행되는 초기화 블럭
  • `static` 중첩 클래스 : 외부 클래스 객체 없이 사용할 수 있는 클래스

`static`은 메모리 효율성을 높이고 클래스 수준에서 공유데이터를 다룰때 유용하다. 그러나 남용하면 객체지향을 해칠수 있으므로 주의해야 한다

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 캐스팅 (형 변환)  (0) 2024.12.01
[Java] abstract와 interface  (0) 2024.11.30
[Java] 접근 제어자  (0) 2024.11.30
[Java] 메모리 계산  (1) 2024.11.30
[Java] 변수  (0) 2024.11.30