레이블이 접근지정자인 게시물을 표시합니다. 모든 게시물 표시
레이블이 접근지정자인 게시물을 표시합니다. 모든 게시물 표시

2015년 7월 10일 금요일

자바(JAVA)의 접근 지정자 (access modifier)

 자바도 클래스의 멤버 각각에 외부에서 접근할 수 있는 범위를 지정하는 접근 지정자(access modifier)를 둘 수 있다. 다음과 같은 네 가지가 있다.


접근 지정자
접근 범위
동일
클래스
동일
패키지
다른
패키지의
자식
클래스
다른
패키지
public
접근 제한 업음
O
O
O
O
protected
동일 패키지와 상속 받은 클래스 내부
O
O
O

default
동일 패지키 내에서만
O
O


private
동일 클래스 내에서만
O




public

 공개 정도가 가장 높고 어디에서든 자유롭게 접근할 수 있다.

protected

 같은 패키지 내에서 접근이 가능하고 다른 패키지에서도 상속을 받은 클래스 내부에서는 사용 가능하다. public과 다른 점은 다른 패키지의 자식 클래스 외부에서는 접근할 수 없다는 것이다.

default (package private)

 같은 패키지 내에서만 접근이 가능하다. 아무런 접근 지정자도 없을 경우 이 옵션이 자동으로 적용된다.

private

 동일 클래스 내에서만 접근이 가능한 가장 낮은 단계의 자유도를 갖는다.

다음과 같이 tut02 패키지의 CA클래스와 이를 상속받은 CB클래스가 있다고 하자.

package tut02;
public class CA {
   public int ia;
   protected int ib;
   int ic;
   private int id;
   
   public static int ie;
   protected static  int ig;
   static int ih;
   private static int ii;
}

같은 패키지(즉 tut02 패키지) 내에서는 클래스 외부에서 변수 ia, ib, ic를 자유롭게 접근할 수 있고 id는 외부에서는 접근이 안된다. 이 클래스가 같은 패키지 내에서는 public, protected, default 가 같은 효과를 갖는다. 이것을 상속받은 자식 클래스에서도 ia,ib,ic는 접근 가능하다.

 만약 외부에서 tut02패키지의 CA 클래스를 불러서 사용하는 경우를 보자.

package tut03;
import tut02.CA;

public class Tut03 {
   public static void main(String[] args) {
       CA a = new CA();// ia만 접근 가능
       CC c = new CC();// ia만
   }   
}

class CC extends CA {
   //ia, ib, ie, ig 접근 가능
}

객체 a와 c는 외부에서 ia 멤버만 접근할 수 있다. 즉 클래스 외부에서 접근할 수 있는 멤버는 public으로 지정된 것만이다. protected로 선언된 멤버들은 CA를 상속하는 CC 내부에서만 사용 가능하다. 즉, protected로 선언된 멤버는 다른 패키지에서 이것을 상속받은 자식 클래스의 private 멤버가 되는 것이다. 클래스 CC내부에서도 CA의 ic, id는 접근할 수 없는데 default, private 멤버는 다른 패키지에서는 접근이 안 되기 때문이다.


2015년 5월 11일 월요일

C++ 클래스의 접근 지정자

 접근 지정자(access specifier)는 클래스 외부에서 그 멤버들을 접근할 수 있는 범위를 지정하는 것이다. C++의 접근 지정자는 다음과 같이 세 가지가 있다.

  • public (접근/호출에 제한이 없음)
  • private (오직 클래스 안에서만 접근/호출 가능)
  • protected (클래스와 파생 클래스 안에서만 접근/호출 가능)

클래스 선언에서 같은 접근 범위를 가지는 멤버를 모아놓고 그 앞에 public: 또는 private: 라고 써주면 된다. 여기서는 일단 앞의 두 개에 대해서만 설명하겠다.

public 지정자


 키워드 public 은 클래스 외부에서 자유롭게 접근할 수 있음을 지정하며 변수의 경우 외부에서 읽고 쓰는 것이 허용되며 함수의 경우 외부 호출이 가능하게 된다. 다음 예를 보자
// 클래스 선언부
class Circle {
   public:
       double radius;
       double getArea();
   private:
       double pi = 3.14;
       double getCircum();
};
// 클래스 구현부
double Circle::getArea() {
   return pi*radius*radius;
}

double Circle::getCircum() {
   return 2.0*pi*radius;
}

위의 Circle 클래스에서 멤버 변수 radius는 public 으로 선언되었으므로 외부에서 자유롭게 변경이 가능하고 getArea()함수도 외부에서 호출이 가능하다.

private 지정자


 반면, private 지정자는 클래스 외부에서는 전혀 접근할 수 없고 오직 클래스 내부에서만 접근 가능함을 지정하는 것이다. 만약 접근 지정자가 생략되어 있다면 default로 이 private 이 적용이 된다. 위의 예에서 pi 라는 멤버 변수는 private 멤버이므로 외부에서 접근하여 읽거나 변경할 수 없다.

 단 멤버 함수에서는 private 멤버를 제한 없이 접근할 수 있다. 위 예에서 getArea()함수 내부에서 private 멤버인 pi를 사용할 수 있다. 또 필요하다면 이 함수 내부에서 private 멤버인 getCircum()함수도 호출할 수 있다. getCircum()함수 내부에서도 멤버들을 prviate이든 public 이든 접근하거나 호출할 수 있다.

 지정자 protected 는 클래스의 상속과 관련되어 있으므로 상속을 설명하는 데에서 자세히 설명하도록 하겠다.