간단 지식/Java

08. 정적멤버(static)와 final필드와 상수

납작한돌맹이 2020. 6. 20. 21:48
반응형

정적 멤버란, 클래스에 고정된 멤버로 객체를 생성하지 않고도 사용할 수 있는 필드 또는 메소드를 말한다. 클래스 멤버라고도 부른다. 선언 방법은 일반적인 필드, 메소드 선언 앞에 static만 붙여주면 된다. 정적 멤버가 필요한 이유는 무엇일까? 바로 공용 데이터를 위해서이다. 예를 들어 수학 기호 파이의 값은 항상 3.14159.... 이다. 이런 값들은 객체가 굳이 가지지 않아도 되는 공용 데이터가 될 수 있다. 따라서 static double pi = 3.14159 로 선언하면 객체를 사용하지 않아도 가져다 쓸 수 있는 정적 필드가 된다. 마찬가지로 인스턴스 필드를 사용하지 않고 오로지 매개값만을 가지고 연산하는 메소드는 static으로 선언해줄 수 있다. 이런 정적멤버들을 외부에서 사용하려면 클래스이름.필드, 클래스이름.메소드(매개값) 형식으로 사용하는 것이 원칙이다.


인스턴스 필드는 생성자에서 초기화가 가능하다. 그러나 static 필드는 생성자에서 초기화할 수 없다. 그래서 존재하는게 static block(정적블록)이다. 정적블록은 생성자처럼 여러개가 있어도 상관없으며, 블록은 클래스가 메모리로 loading될 때 자동으로 실행된다.

    static String info;
    static String name = "ksh";
    static int age = 23;
    int today;
    int year = 2020;
    int month = 6;

    static{
        info = name + "_" + age;
        today = year + "." + month;   ----- error line
    }

    static int plus(int x, int y){
    	year = 2021;    ----- error line
        return x + y;
    }

    static int minus(int x, int y){
        return x - y;
    }

정적블록 또는 정적메소드를 사용할때는 주의사항이 하나 있다. 바로 내부에 정적멤버가 아닌, 인스턴스 멤버가 들어갈 수 없다는 것이다. 위 코드를 보면 정적블록과 plus 메소드에는 에러를 야기시키는 부분이 있다. 올바르게 고치기 위해서는 정적블록 내부의 today = year + "." + month 를 지워야한다. 그리고 plus 메소드의 year = 2021 은 지우던지 아니면 올바르게 고쳐야한다. 정적메소드 내부에서 인스턴스 필드를 사용하고 싶을 때는 메소드 내부에서 클래스 객체를 생성해서 참조변수를 이용해야 한다.


final 필드는 프로그램 실행 중에도 변하지 않을, 최종적인 값을 가지는 필드를 말한다. static 처럼 일반적인 필드 선언 앞에 final만 붙여주면 된다. final 필드에 초기값을 주는 방법은 2가지가 있다. 하나는 필드 선언 시, 또 하나는 생성자 호출 시이다. 참고로 초기화 하지 않은 final필드는 그 자체로 컴파일 에러를 발생시킨다. final 필드하면 따라오는게 바로 상수이다. 상수는 static final 타입 상수이름; 형식으로 선언하며 마찬가지로 불변의 값을 갖는다. 똑같이 불변의 값을 저장하지만, 차이점이 있다면 final 필드는 객체마다 저장될 수 있다는 점이다.

 

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형