ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [Java] static(정적)의 의미
    IT Study/컴퓨터 기초 2023. 4. 21. 17:23
    728x90

    자바를 사용하다 보면 static이라는 키워드를 자주 보는데요.

    이러한 static이 의미하는 바를 정확히 짚고 넘어가는 것이 좋을 것 같아, 이번 블로그 글을 작성하게 되었습니다.

     

    1. static이란?

    static이란 정적(고정된)이라는 의미로,

    static 키워드가 붙은 멤버 변수나 메서드는 클래스의 인스턴스 생성 없이 사용할 수 있습니다.

    즉, 클래스 내부에 정적으로 선언되어 모든 인스턴스가 공유하는 변수나 메서드를 만들 때 사용합니다.

     

    2. static 변수

    static 키워드가 붙은 멤버 변수는 객체가 생성되지 않아도 메모리에 할당되어 초기화가 이뤄집니다.

    static 변수는 클래스 레벨의 변수이기 때문에

    객체가 생성되기 전, 미리 메모리에 할당되어 객체의 생성 여부와 상관없이 클래스 이름을 통해 접근할 수 있습니다.

    public class Main {
        static int staticI = 10; // static 변수
        int i = 20;
    
        public static void main(String[] args) {
            Main m1 = new Main();
            Main m2 = new Main();
    
            // static 변수는 객체를 통해 접근 가능
            m1.staticI = 200;
            
            // static 변수는 클래스 이름으로 접근 가능
            Main.staticI = 100;
            
            System.out.println("m1.staticI : " + m1.staticI); // m1.staticI : 100
            System.out.println("m2.staticI : " + m2.staticI); // m2.staticI : 100
        }
    }

     

    예상하는 결과(200, 100 예상)와 다른 이유는

    static 변수가 클래스 레벨에 존재하여, 모든 인스턴스에서 공유되고 있기 때문입니다.

     

    Main.staticI와 m1.staticI가 모두 같은 변수를 가리키게 됩니다.

    m1.staticI = 200 코드를 실행해도, 이후에 Main.staticI = 100 코드를 실행하면

    m1.staticI도 Main.staticI와 같은 값인 100으로 변경됩니다.

     

    3. static 메서드

    static 키워드가 붙은 메서드는 클래스에서 인스턴스를 생성하지 않아도 사용할 수 있습니다.

    static 메서드도 클래스 이름으로 호출이 가능하며, 클래스의 인스턴스를 사용하지 않고 호출이 가능합니다.

    이러한 특성 덕분에, static 메서드는 메모리 공간을 절약하고 성능을 향상할 수 있습니다.

    public class Main {
        public static void StaticExample() {
            System.out.println("StaticExample() is called.");
            
        }
    
        public void Example() {
            System.out.println("Example() is called.");
            
        }
    
        public static void main(String[] args) {
            Main.StaticExample(); // 클래스 이름으로 바로 접근 가능
            StaticExample();      // 클래스 이름 생략 가능
    
            Main m = new Main();
            m.Example();          // 인스턴스 생성 후 메서드 호출 가능
        }
    }
    
    /*
    결과 출력 : 
    StaticExample() is called.
    StaticExample() is called.
    Example() is called.
    */

     

    더불어 static 메서드 내에서는 인스턴스 변수에 접근할 수 없고, static 변수에만 접근할 수 있습니다.

    public class Main {
        static int staticI = 10;
        int i = 20;
        
        public static void StaticExample() {
        	staticI = 20;
            // i = 20; // 컴파일 오류
        }
    
        public void Example() {
        	staticI = 20;
            i = 20;
        }
    
        public static void main(String[] args) {
            
        }
    }

     

    추가적으로 static 메서드에서는 this 키워드를 사용할 수 없습니다.

    this는 객체의 인스턴스를 참조하여 사용하는 키워드이기 때문에, 객체와 관련 없으므로 this 키워드를 사용할 수 없습니다.

    public class Calculator {
      private int num1;
      private int num2;
    
      public Calculator(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
      }
    
      public int add() {
        return this.num1 + this.num2;
      }
    
      public static int multiply(int num1, int num2) {
        // this.num1 = num1; // 컴파일 오류
        // this.num2 = num2; // 컴파일 오류
        return num1 * num2;
      }
    }

     

    4. static을 사용하는 경우

    (1) 인스턴스에 고유한 데이터가 필요하지 않거나, 공유 데이터를 다루는 경우 static을 사용합니다.

    (2) 더불어 객체를 생성하지 않아 메모리 할당이 필요 없기 때문에, 메모리의 사용량을 줄이기 위해서 static을 사용합니다. 

    (3) 상수 값을 나타내는 경우, static final 키워드를 사용하여 상수 값을 나타낼 수 있습니다.

         static final은 값이 고정되어 변경이 불가능한 정적 상수를 선언할 때 사용하며,

         클래스 레벨에서 선언되기 때문에 모든 인스턴스에서 공유하여 사용할 수 있습니다. (일관성 유지의 기능)

     

    마무리

    위의 예시 외에도, static 키워드는 다양한 용도로 사용될 수 있습니다.

    따라서 상황에 맞게 적절히 사용하는 것이 중요할 것 같습니다. 사소한 궁금증이 해결되었기를 바라며... 빠이 ✋

Designed by Tistory.