[Java] Static 키워드

동동·2021년 10월 26일
0

JAVA

목록 보기
6/9
post-thumbnail

Static (정적)

  • Static(정적)'고정된'이란 의미
  • Static 키워드를 사용해 만들어진 변수와 메서드를 각각 정적변수(정적 필드), 정적 메서드라 부름
  • 이 둘을 합쳐 정적 멤버 또는 클래스 멤버라고 함
  • 클래스 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버
  • 클래스 로더가 클래스를 로딩해서 메모리 영역에 적재할 때 클래스별로 관리
  • 따라서 클래스의 로딩이 끝나는 즉시 사용할 수 있음 (생성자를 이용해 클래스를 따로 메모리에 적재하지 않아도 됨)
  • 항상 메모리에 적재되어 있으므로 GC(Carbage Collector)가 관리하지 않음

📌 Static 메모리 구조

📌 Static 사용시 장점

  • Static을 사용한 클래스 멤버는 메모리 할당을 딱 한 번만 하기 때문에 메모리 사용을 효율적으로 할 수 있음
  • Static을 사용한 클래스 멤버는 모두 같은 메모리 주소를 공유함
  • 따라서 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 사용

🚨 사용시 주의할 점

  • 과도한 사용시 메모리 낭비가 발생해 시스템 퍼포먼스에 악영향을 줌
  • OOP 원칙 중 하나인 캡슐화에 어긋남
  • 모두 공유하는 글로벌 변수 성격을 띄고 있어 SideEffect발생 가능성
  • 오버라이딩 할 수 없으므로 코드의 재사용성이 떨어짐
  • 정적 메서드에서는 인스턴스 변수를 사용할 수 없음
    • 정적 메서드는 인스턴스 생성 없이 호출 가능한 반면 인스턴스 변수는 인스턴스를 생성해야만 사용 가능
    • 정적 메서드를 호출했을 때 인스턴스 변수가 생성되어 있지 않을 수 있음
    • 따라서 정적 메서드 작성 시 인스턴스 변수를 사용하면 안됨

📌 Static을 사용하면 좋은 경우

  • 자주 사용하는 객체 + 만드는데 오래 걸리고 메모리를 많이 사용하는 객체

💡 코드로 보는 예시

public class MyMethod {
	// Static Method
    static void myStaticMethod() {
    	System.out.println("static method는 인스턴스의 생성 없이 바로 사용 가능");
    }
    
    // Public Method
    public void myPublicMethod() {
    	System.out.println("static method가 아니라면 인스턴스 생성 후 메모리에 적재되면 사용 가능");
    }


	// Main Method
	public static void main(String[] args) {
    	myStaticMethod(); // 생성자 없이 바로 호출해서 사용 
        //myPublicMethod(); // 이 경우 컴파일 에러 발생 
        
        MyMethod myObj = new MyMethod(); // 생성자를 사용해 인스턴스화 
        myObj.myPublicMethod(); // 생성된 인스턴스에서 메서드를 호출해 사용 

   
    } 
}
profile
괴발개발

0개의 댓글