[Java] static에 대해

김동욱·2023년 8월 27일
0

Java

목록 보기
7/8
post-thumbnail

static

static은 잘 이해한다면 코드의 유연성과 효율성을 크게 향상시킬 수 있습니다.
이 글에서는 static변수와 메서드 등 개념을 살펴보고 그 사용법, 단점까지 알아보겠습니다.

static이란 '정적인'이라는 의미를 가지고 있습니다.
즉 static이 붙은 변수와 메서드는 클래스에 고정되어 프로그램의 실행 시점 동안 계속 존재하게 됩니다.
스태딕 변수와 스태딕 메서드는 스태딕 메모리 영역에 존재합니다. 객체가 생성되기 전에 미리 할당되기 때문에 아무 곳에서나 객체 생성없이 접근이 가능합니다.

static 변수

스태딕 변수는 클래스 수준에서 작동하는 변수로, 모든 인스턴스가 공유합니다. 즉 한 인스턴스에서 스태딕 변수를 변경하면 그 변경사항은 다른 모든 인스턴스에도 반영됩니다.

static 메서드

스태딕 메서드 역시 클래스 수준에서 작동하며, 객체 생성 없이 호출할 수 있고, 직접적으로 non-static 필드나 메서드에서 접근할 수 없습니다.

예제

class MyMath {
long a, b; // 인스턴스 변수

long add(){
return a +b;
} // 인스턴스 메서드

static long add(long a, lon b){ //지역변수 (메서드 내에서만 유효)
return a +b;
} // 스테딕 메서드

}

class MathTest {
public static void main(String[] args){

//스테딕 메서드 사용
sout(MyMath.add(200L,100L);


//인스턴스 메서드 사용
MyMath mm = new MyMath();
mm.a = 200l;
mm.b = 100l;
sout(mm.add());

	}
}

인스턴스 메서드

  • 인스턴스 생성 후 '참조변수.메서드이름()'으로 호출
  • 인스턴스 변수와 인스턴스 메서드와 관련된 작업을 함
  • 메서드 내에서 인스턴스 변수 사용 가능

스태딕 메서드(클래스 메서드)

  • 객체 생성 없이 '클래스이름.메서드이름()'으로 호출
  • 인스턴스 멤버와 관련이 없는 작업을 함
  • 메서드 내에서 인스턴스 변수 사용 불가

그러면 static은 어떨 때 붙일까?

인스턴스 변수를 사용하지 않을 때 붙입니다.

즉 메서드 작업에 필요한 변수를 매개변수로 받기 때문에 인스턴스 변수를 사용할 필요가 없습니다.

  • 속성은 공통 속성에 static을 붙이고
  • 메서드는 인스턴스 멤버를 사용하지 않는 메서드에 static을 붙임

그러면 스테딕을 안 붙이고 인스턴스 변수도 안 쓰면 되는거 아닌가??

  1. 어차피 인스턴스 변수를 안 쓰기 때문에 인스턴스(객체)를 생성할 필요가 없어서 메모리와 처리시간을 단축.
  2. 클래스의 인스턴스를 생성할 필요 없이 다른 클래스에서 액세스 가능해서 코드 묘듈성과 유연성을 향상.
  3. 메서드가 코드 가독성과 유지 관리성을 향상시킬 수 있는 인스턴스 별 상태에 의존하지 않음을 확실.
    1. 즉 static으로 선언함으로써 메서드가 인스턴스와 독립적임을 알 수 있는것.
    2. 왜냐. 인스턴스 멤버를 안 쓰고 매개변수로 들어온 데이터만 쓰니까 독립적

그래서 인스턴스 멤버를 사용하지않는 non-static 메서드를 만들어도 되지만, 좀 더 명확하게 하기위해선 static 메서드를 사용하는 게 좋습니다.

예제

class Test1 {
    int iv;
    static int cv;
		void instanceMethod2(){}
		static void staticMethod2(){}

    void instanceMethod(){
        System.out.println(this.iv); //this는 인스턴스 자신을 의미하는 것이라서 static에선 당연히 못 씀
        System.out.println(iv);
        System.out.println(cv);
				instanceMethod2();  
				staticMethod(); //언제나 호출 가능하니까 당연히 가능함 
    }

    static void staticMethod(){ // 객체 생성없이 항상 호출이 가능함
//        System.out.println(iv); 근데 iv는 객체를 생성해야만 호출이 가능하니까 못 씀.
																	//즉 static 메서드 호출 시 객체가 없을 수도 있으니까 못 쓰는것
	        System.out.println(cv);
//					instanceMethod2();  // 같은 이유. 객체 생성없이 항상 호출이 가능한 staticMethod인데
																// instaceMethod2는 객체가 필요한 메서드.
																// 즉 객체 생성 없이 호출했는데 객체가 필요한 메서드를 호출하려니 에러가 뜸 
				
    }
}

스태딕 사용 시 주의

static을 과도하게 사용한다면 여러 문제점이 발생할 수 있습니다.

  1. 오버라이딩 불가: 오버라이딩이 불가하여 상속 관계에서 문제를 일으킬 수 있습니다.
  2. 메모리 소비: 프로그램이 실행되는 동안 계속 메모리에 남아있어서 불필요한 메모리 소비가 증가합니다.
  3. 멀티 스레딩 문제: 데이터 일관성 문제를 야기할 수 있으니 동기화 등으로 적절한 제어가 필요합니다.
  4. 객체 지향 설계 방해: 객체 간 상호작용보다 클래스 간 상호작용이 많아지면 코드의 유지보수가 까다로워집니다.
  5. 어려운 테스트: 모든 인스턴스에서 공유되므로 하나의 테스트 케이스에서 변경된 static값이 다른 테스트 케이스에 영향을 줄 수 있는 가능성이 있으며 이렇기 때문에 테스트가 어렵습니다.

남궁성 Java

profile
안녕하세요. 공부해요

0개의 댓글