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은 어떨 때 붙일까?
인스턴스 변수를 사용하지 않을 때 붙입니다.
즉 메서드 작업에 필요한 변수를 매개변수로 받기 때문에 인스턴스 변수를 사용할 필요가 없습니다.
그러면 스테딕을 안 붙이고 인스턴스 변수도 안 쓰면 되는거 아닌가??
그래서 인스턴스 멤버를 사용하지않는 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을 과도하게 사용한다면 여러 문제점이 발생할 수 있습니다.