반응형

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

반응형
반응형

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

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

클래스 더 알기(More on Classes)

지금부터는 클래스의 객체의 참조와 점(.) 연산자에 의존하는 좀 더 다양한 측면을 다룬다.

메서드 리턴 값(Returning a Value from a Method)

다음 같은 코드에서 메서드는 리턴한다.

  • 메서드 내에서 모든 구문을 실행 완료 후 (메서드 끝)

  • return구문을 실행했을 때

  • 예외(exception)를 던질 때

셋 중 무엇이든 먼저 실행되면 리턴한다.

메서드 선언 시 리턴 타입을 선언한다. 그리고 메서드 내에서 return구문을 선언에 맞는 타입으로 리턴 값을 구현한다.

리턴할 값이 없다면 void 키워드를 사용한다. void를 사용하면 메서드 내에 return키워드를 사용할 필요가 없다. 제어 구문, 순환 구문 또는 메서드를 중간에 빠져나가야 할 경우엔 void를 사용했더라도 return 구문을 사용할 수 있다. 아래처럼

   return;

하지만 void로 선안하고 return값을 지정해서 메서드 내에서 사용하면 컴파일 오류가 발생한다.

즉 메서드를 선언할 때 리턴 타입을 지정하면 반드시 return 구문을 사용해서 해당 타입의 값을 구현해야 하고 void로 지정한 경우는 값이 있는 return을 사용하면 오류가 난다.

   return 리턴 값;

메서드 선언할 때 사용한 데이터 타입과 실제 메서드 내에서 리턴 값의 타입은 같아야 한다. 다르면 오류가 발생한다.

리턴 타입은 원시 데이터뿐 아니라 참조형(객체 등)도 가능하다.

 

 

this키워드 사용하기(Using the this Keyword)

인스턴스 메서드 또는 생성자에서 this는 현재 객체를 참조하는 것이다. This를 사용해서 인스턴스 메서드나 생성자에서 현재 객체의 어떤 멤버든 참조할 수 있는 것이다.

필드에서 this 사용하기 (Using this with a Field)

this를 사용하는 가장 중요한 이유는 메서드 또는 생성자의 파라미터를 통해 클래스 필드 값에 접근할 수 있기 때문이다.

아래 예제를 확인해 보자.

      public class Point {

           public int x = 0;

           public int y = 0;

           //생성자

           public Point(int a, int b) {

                x = a;

                y = b;

           }

      }

위 예제는 파라미터와 클래스 필드의 이름이 다르다. 하지만 아래와 같이 사용할 수 도 있다.

      public class Point {

           public int x = 0;

           public int y = 0;

           //생성자

           public Point(int x, int y) {

                this.x = x;

                this.y = y;

          }

      }

위 예제를 보면 필드명과 생성자의 파라미터 명이 같다. 그래서 생성자 내에서 x=x라고 하면 문제가 발생한다. 원하는 건 생성자로 입력 받은 파라미터의 값을 클래스 필드에 할당하는 것이다. 그래서 this를 사용해서 현재 클래스의 필드를 지정해 주는 것이다. This는 이 지금 클래스라고 이해하면 된다.

생성자로 this 사용하기 (Using this with a Constructor)

같은 클래스에서 생성자 내에서 다른 생성자를 호출할 때 this를 사용할 수 있다. 이렇게 보면 this는 그냥 지금의 클래스를 지칭하는 것이다. 오버라이딩 된 여러 개의 생성자 중 호출하고 싶은 생성자가 있다면 this(파리미터들)로 식별해서 호출하면 된다.

      public class Test {

           private int x, y;

           private int a, b;

          //기본 생성자

          public Test() {

               this(0,0,0,0); //오버로딩 된 파라미터가 4개인 생성자 호출

          }

          public Test(int a, int b) {

               this(0,0,a,b); //오버로딩 된 파라미터가 4개인 생성자 호출하는 데 파라미터 2개는 받아서 넘김.

         } 

         public Test(int x, int y, int a, int b) {

              this.x = x;

              this.y = y;

              this.a = a;

              this.b = b;

         }

      }

위 클래스는 여러 개의 생성자를 가지고 있다. 각 생성자는 각각 Test 클래스의 맴버 변수들 전부 또는 일부를 초기화한다.

다른 생성자를 호출하는 게 있다면 반드시 생성자 내의 첫 번째 줄에 있어야 한다.

 

반응형