반응형

[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으로 정의 된 상수의 값을 바꾸면 컴파일 시 여러 클래스에서 사용된 상수를 찾아 해당 값으로 대체한다. 컴파일 시 상수로 상수값을 바꿔야 할 경우라면 값을 바꾼 뒤 해당 상수를 사용한 클래스를 재 컴파일하면 현재 값으로 적용된다.

 

반응형
반응형

[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 필드는 개개의 구현에 연결하기 쉽고 여러분의 코드를 바꾸는 유연성을 제한하게 된다.

반응형