ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] static 키워드
    study/java 2020. 7. 30. 23:30

    static field(변수, 상수)

    public class Car{
        public String name;
        public static int sNumberOfCars = 0;
        public final static String CAR_NAME = "SANTAFE";
        
        public Car(String name){
        	this.name = name;
            this.sNumberOfCars++;
        }
    }
    

    클래스 안에서 변수를 선언하면 멤버 변수로 선언이 된다.

    멤버 변수에 접근하려면 car.name 처럼 객체를 통해서 접근해야 한다.

    public static void main(String[] args) {
    	Car car = new Car();
    	System.out.println(car.name);
    }

     

    만약 static 키워드를 사용하여 선언하면 멤버 변수와 다른 특성을 갖는다.

    전처럼 객체를 통해서 접근할 수도 있지만 클래스를 통해서 접근할 수 있다.

    public static void main(String[] args) {
    	System.out.println(Car.sNumberOfCars);
    
    	Car car = new Car();
    	System.out.println(car.sNumberOfCars);
    }

    클래스를 통해서 접근을 하게 되면 객체를 만들지 않고 외부에서 접근할 수 있다.

    static으로 선언된 변수는 프로그램이 실행될 때 생성 및 초기화되기 때문에 객체를 생성하지 않아도 이미 변수는 생성된 상태다.

    static 변수는 클래스를 통해서 직접 접근할 수도 있고 객체를 생성해서 접근할 수도 있는데 클래스를 통해 직접 접근하는 방법을 권장한다. 그 이유는 멤버 변수에 접근하는지 static 변수에 접근하는지 헷갈리기 때문이다.

     

    Car 클래스에서 static으로 선언된 변수는 Car 객체를 생성하지 않아도 접근이 가능하다.

    • CAR_NAME은 final static으로 선언했기 때문에 값 변경이 안되는 상수다.
    • sNumberOfCars는 static으로 선언했기 대문에 언제나 값을 변경할 수 있는 변수가 된다. 보통 static 변수를 쉽게 구분하기 위해 이름 앞에 s를 붙이기도 한다.

     

    static field를 사용하는 이유?

    대부분 상수를 선언할 때 많이 사용한다.

    상수를 선언하면 다른 클래스에서도 상수에 접근할 수 있다.

    멤버 변수로 선언할 수도 있지만 객체마다 상수를 갖게되면 객체의 크기가 커질 수 있다.

     

     

    static method

    메소드를 선언할 때 static을 사용하면 객체를 생성하지 않아도 그 메소드를 호출할 수 있다.

    public class Car{
        public String name;
        public static int sNumberOfCars = 0;
        public final static String CAR_NAME = "SANTAFE";
        
        public Car(String name){
        	this.name = name;
            this.sNumberOfCars++;
        }
        
        public static void print(String name){
            System.out.println(name);
        }
    }
    

    print() 메소드는 클래스와 객체를 통해서 모두 호출이 가능하다.

    하지만 객체의 메소드를 호출하는 것인지 static method를 호출하는 것인지 구분하기 위해 클래스에서만 호출되어야 한다.

    Car.print("SONATA");

     

    주의할 점

    static method는 객체를 생성하지 않아도 사용할 수 있다.

    이것은 메소드와 객체가 분리되어 있다는 것을 의미하는데 그렇게 되면 메소드 내부에서 super, this와 같은 키워드를 사용할 수 없고 클래스의 멤버 변수에 접근할 수도 없다.

    멤버 변수에 접근하려고 하면 컴파일 에러가 발생한다.

    내부에 선언된 변수외에 static field, static method만 접근할 수 있다.

     

    static method를 사용하는 이유

    static method는 보통 Utils, Helper 클래스를 만드는데 사용한다.

    예를 들어 다음과 같이 Math라는 Utils 클래스를 만들 수 있다.

    public class Math {
        public static double sqrt(double num) {
            // ....
        }
    
        public static double sum(double num1, double num2) {
            // ....
        }
    }

    Math.sqrt(), Math.sum()으로 호출할 수 있는데 이는수학적인 연산과 관련된 메소드들을 Math라는 클래스 아래로 모아주는 장점이 있다.

    또 static method를 구현할 때 내부에서 상수만 접근하도록 만들면 입력에 따른 결과가 달라지지않아 좀 더 함수형 프로그래밍에 가까워진다.

     

     

    static class

    static 키워드를 사용하여 클래스를 선언하면 상위 클래스와 불리를 해준다.

    예를 들어 Car 클래스 하위에 Wheel 클래스를 선언하였고 이때 Wheel 클래스를 이너 클래스(inner class)라고 부른다.

    그래서 Wheel 클래스는 상위 클래스인 Car 클래스의 멤버 변수에 접근이 가능하다.

    public class Car {
        public int year = 2018;
    
        public Car() {
        }
    
        public class Wheel {
            public Wheel() {
                year = 10;
            }
        }
    }

    만약 Wheel 클래스를 static으로 선언하면 Car 클래스와 분리된다.

    이는 Wheel 클래스에서 Car 클래스의 멤버 변수에 접근할 수 없다는 것을 의미한다.

    public class Car {
        public int year = 2018;
    
        public Car() {
        }
    
        public static class Wheel {
            public Wheel() {
                // compile error!
                year = 10; 
            }
        }
    }

    위처럼 static으로 선언된 하위 클래스는 static nested class 라고 한다.

    static nested class는 상위 클래스가 생성되지 않아도 외부에서 직접 객체를 생성할 수 있다.

    Car.Wheel wheel = new Car.Wheel();

    이것이 이너 클래스와의 가장 큰 차이점이다.

    이너 클래스는 상위 클래스의 객체를 통해서 객체를 생성한다.

    Car car = new Car();
    Car.Wheel wheel = car.new Wheel();

     

    주의할 점

    static class는 하위 클래스를 선언할 때만 가능하다.

    // compile error!
    public static class Car { 
        public int year = 2018;
    
        public Car() {
        }
    
        public class Wheel {
            public Wheel() {
               ...
            }
        }
    }

    위처럼 상위 클래스를 static으로 선언하려고 하면 컴파일 에러가 발생한다.

     

    static class를 사용하는 이유?

    static class로 이너 클래스를 생성하면 좋은 점은 grouping이다.

    어떤 클래스와 연관된 클래스들을 하위에 선언하여 관련이 있는 클래스들을 모아둘 수 있다.

    그냥 이너클래스로도 할 수 있지만 이너 클래스는 상위 클래스와 연결되어 있어 독립된 클래스가 아니다.

     

     

    마무리

    static 키워드의 공통점은 객체와의 분리다. 객체를 생성하지 않고 접근할 수 있다.

    또한 Grouping이라는 장점이 있어서 어떤 클래스 하위에 이와 관련된 메소드, 클래스 등을 static으로 선언하여 한 곳에 모을 수 있다.

     

    참고

    https://codechacha.com/ko/java-static-keyword/

     

    Java - Static 키워드 이해하기

    Java의 static keyword는 field, method, class에 적용할 수 있습니다. static 키워드의 공통점은 객체와의 분리입니다. 객체를 생성하지 않고 접근할 수 있습니다. 또한, 어떤 클래스 아래에 static 변수, 메소�

    codechacha.com

     

    'study > java' 카테고리의 다른 글

    [JAVA] GC  (0) 2020.08.06
    [JAVA] Jar,War  (0) 2020.08.04
    [JAVA] Try-with-resources  (0) 2020.07.30
    JAVA - 5  (0) 2020.07.20
    JAVA - 4 ( 객체지향 )  (0) 2020.07.16
Designed by Tistory.