반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

필드 초기화 (Initializing Fields)

필드를 선언할 때 초기값을 설정할 수 있는 것은 이미 알고 있을 것이다.

      public class TestClass {

           public static int a = 10; //10으로 초기화

           private Boolean b = false; //false로 초기화

      }

단 한 줄에 선언 및 초기화를 할 수 있고 잘 작동한다. 그러나 한 줄 선언과 초기화는 너무 간단해서 제약이 있다. 에러 핸들링이나 for순환문을 이용한 복합 배열 선언 시엔 부적절한 것이다. 인스턴스 변수는 오류 처리나 다른 로직을 사용할 수 있는 생성자에서 초기화될 수 있다. 클래스 변수를 위한 같은 기능을 자바 프로그래밍 언어에서 제공하는데 바로 static 초기화 블록이다.

비록 클래스 시작부분에 필드를 초기화하는 게 일반적이긴 하지만 꼭 그럴 필요는 없다. 그냥 필드가 사용하기 전에만 선언과 초기화를 하면 된다.

static초기화 블록(static Initialization Blocks)

static초기화 블록은 중괄호 { }를 사용한다. 그리고 중괄호 앞에 “static:” 키워드를 두면 된다.

     static {

           초기화 할 코드를 여기에 구현

     }

클래스는 static초기화 구문을 얼마든지 가질 수 있다. 그리고 클래스 어디서든 구현할 수 있다. 런타임 시스템은 static 초기화 블록이 나타나는 순서대로 호출되는 것을 보장한다.

static블록의 대안으로 전용 static메서드를 사용할 수 있다.

     class Test {

           public static Type myVar = initClassVar();

           private static Type initClassVar() {

                ////초기화할 코드를 여기에 구현

          }

      }

이 방식의 장점은 클래스 변수를 다시 초기화하고 싶을 때 재사용할 수 있다는 것이다.

인스턴스 멤버 초기화 (Initializing Instance Members)

보통은 인스턴스 변수는 생성자 안에서 초기화 한다. 생성자에서 초기화하는 방법을 대신할 2가지 방법이 있다. 초기화 블록과 final메서드이다.

 

 

인스턴스 변수를 위한 초기화 블록(Initializer blocks)static초기화 블록과 비슷하다. 물론 static 키워드는 없다.

{

//초기화 할 코드를 넣는다

}

자바 컴파일러는 모든 생성자에 초기화 블록을 복사한다. 따라서 이 처리방법은 생성자들 간에 코드 블록을 공유하기 위해 사용되어진다.

Final 메서드는 서브클래스에서 오버라이드 될 수 없다. 이 부분은 인터페이스와 상속에서 더 자세히 설명하겠다. 아래는 final메서드 예제이다.

      class Test {

           private Type myVar = initInstVar();

          protected final Type initI:nstVar() {

               //초기화 코드 작성

         }

     }

만약 서브클래스가 초기화 메서드를 재사용하기를 원할 때 특히 유용하다. 메서드가 final인 이유는 인스턴스 초기화 중에 비final 메서드 호출하면 문제가 발생할 수 있기 때문이다.

반응형
반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

클래스 멤버 이해하기(Understanding Class Members)

이번 포스팅에서는 클래스에 속한 static 키워드를 위한 필드와 메서드의 생성하는 것에 대해 얘기할 것이다.

클래스 변수(Class Variables)

많은 객체가 같은 클래스에서 생성될 때 그 객체들은 각각 별개의 인스턴스 변수들을 가지고 있다. 이 변수들은 각각 독립적으로 값을 가지고 있고 다른 메모리 위치에 저장된다.

가끔 모든 객체에 공통으로 사용할 수 있는 변수가 필요하다. 이런 경우 static 키워드를 사용하면 된다. static 수식어가 붙은 필드가 선언되면 static필드 또는 클래스 변수라고 부른다. static는 객체보단 클래스와 잘 어울린다. 모든 클래스의 인스턴스들은 한 군데 메모리에 고정되어 있는 클래스 변수를 공유한다. 어떤 객체도 클래스 변수의 값을 변경할 수 있다. 그런데 클래스 변수는 클래스의 인스턴스 생성 없이 다뤄진다.

static 필드의 예제를 확인해 보자

      public class TestInstance {

           private int a;

           private int b;

           private static int numCnt = 0;

          

      }

위에서 numCntTestInstance의 클래스 변수이며 클래스명에 .을 사용해서 접근한다.

     TestInstance.numCnt

이렇게 사용함으로써 클래스 변수로 확실히 인지된다.

사실 객체의 참조로 static필드를 참조할 수 있다.

     object.numCnt

그러나 이것이 클래스 변수라고 명확하게 인지하기 힘들 수 있다.

 

 

클래스 메서드(Class Methods)

자바 프로그래밍 언어(Java Programming Language)static필드처럼 static메서드도 지원한다. 선언할 때 static 수식어를 붙인 메서드는 클래스 이름으로 호출이 가능하다. 클래스의 인스턴스를 생성 및 이용할 필요가 없다.

     ClassName.methodName(args)

클래스 메서드 또한 클래스의 인스턴스로 접근이 가능하지만 그렇게 할 경우 클래스 메서드인지 판단하기 힘들 수 있다.

클래스 메서드의 일반적인 사용은 클래스 필드에 접근하기 위해서이다.

인스턴스와 클래스 변수와 메서드의 일부 조합은 허용되지 않는다.

  • 인스턴스 메서드는 인스턴스 변수와 인스턴스 메서드에 직접 접근할 수 있다.

  • 인스턴스 메서드는 클래스 변수와 클래스 메서드에 직접 접근할 수 있다.

  • 클래스 메서드는 클래스 변수와 클래스 메서드에 직접 접근할 수 있다.

  • 클래스 메서드는 인스턴스 변수 또는 인스턴스 메서드에 직접 접근할 수 없다.

무조건 객체의 참조를 이용해서 접근해야 한다. 그리고 클래스 메서드는 this키워드를 사용할 수 없다. this로 참조할 인스턴스가 없기 때문이다.

상수(Constants)

staticfinal 수식어를 같이 사용하면 상수로 사용된다. final수식어는 이 필드의 값을 바꿀 수 없음을 나타낸다.

아래 PI 상수를 선언하는 예제이다.

static final double PI = 3.14;

상수는 다시 할당되지 않는 방법으로 정의된다. 혹시 상수에 값을 할당하려는 시도를 하면 컴파일 에러가 발생한다. 협약에 따라 상수 이름은 대문자로 지정한다. 만약 이름이 여러 단어로 구성되어 있다면 단어 사이에 “_”를 붙여서 연결한다.

원시 데이터나 string으로 정의 된 상수의 값을 바꾸면 컴파일 시 여러 클래스에서 사용된 상수를 찾아 해당 값으로 대체한다. 컴파일 시 상수로 상수값을 바꿔야 할 경우라면 값을 바꾼 뒤 해당 상수를 사용한 클래스를 재 컴파일하면 현재 값으로 적용된다.

 

반응형