반응형

[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, 자바 튜토리얼]

클래스 멤버들 접근제어자(Controlling Access to Members of a Class)

접속 레벨 수식어가 다른 클래스가 특정 필드를 사용하거나 메서드를 실행할 수 있을지 결정한다. 2개의 접속 제어 레벨이 있는데 아래와 같다.

  • 최고 레벨 – public 또는 package-private (명시된 수식어 없음)

  • 멤버 레벨 – public, private, protected, or package-private (명시된 수식어 없음)

public으로 선언된 클래스는 모든 클래스들에게 어디서든 보이게 된다. 만약 클래스에 접근제어자가 없다면 (디폴트 또는 패키지용) 이 경우는 같은 패키지 내에서 접근이 가능하다.

최고 레벨에서는 이 두 가지를 사용할 수 있다. 멤버 레벨에서는 여기에 두가지를 더할 수 있다. 바로 protectedprivate이다. Private는 오직 해당 클래스에서만 접근이 가능하다. 외부에서는 접근이 불가능하다. protected는 같은 패키지 내에서 접근이 가능하고 또한 다른 패키지라도 서브클래스라면 접근이 가능하다. 이 네가지 접근제어자를 정리해 본다.

public (class, package, subclass, all)

protected (class, package, subclass)

디폴트 (class, package)

private (class)

모든 접근제어자는 자신의 클래스에는 접근이 가능하다.

 

 

접근 레벨은 두 가지 방법으로 영향을 끼친다. 첫째, 자바 플랫폼에 있는 클래스들 같은 또 다른 소소에서 가져온 클래스를 사용할 때 접속 레벨은 우리가 만든 클래스가 사용할 수 있는 그 클래스들의 멤버들로 결정된다. 둘째, 클래스를 작성할 때 우리가 작성한 클래스에 있는 모든 멤버 변수와 메서드들의 접근 레벨을 결정해야 한다.

접근 레벨 선택 팁!

만약 다른 프로그래머가 여러분의 클래스를 사용한다면 오용으로 인해 오류가 발생하지 않는지 확인하기를 원할 것이다. 접근 레벨은 이런 경우 도움이 될 것이다.\

  • 특정 멤버에 대해 적합한 가장 제한적인 접근 레벨을 사용해라. 특별히 좋은 이유가 없다면 private를 사용해라.

  • 상수 선언 외엔 public를 사용하지 마라. Public 필드는 개개의 구현에 연결하기 쉽고 여러분의 코드를 바꾸는 유연성을 제한하게 된다.

반응형