본문 바로가기

자바 언어 & 객체지향 지식

내부 클래스의 접근제어의 의미를 예시와 함께

 

내부클래스의 접근 권한은 내부클래스를 다른 클래스가 사용할 때나 의미가 있음. 예를들어 아래 그림의 왼쪽은 BST클래스 파일이고 그 안에 TreeNode라는 내부클래스를 두었다. 오른쪽은 BST_Inorder_Iterator클래스이고 이 클래스에서는 BST클래스의 내부클래스인 TreeNode클래스를 사용한다. 이렇게 되었을때  타클래스인 BST_Inorder_Iterator클래스에서 다른 클래스의 내부클래스인 TreeNode에 접근할 때에는 BST.TreeNode<T>와 같이 점찍고 접근해야 하는 것이다. 그리고 만약 내부 클래스인 TreeNode의 접근제한을 private으로 해 놓는다면 TreeNode의 외부클래스인 BST에서는 아무문제가 없겠지만 타클래스인 BST_Inorder_Iterator에서는 내부 클래스에 더이상 접근할수 없는 문제가 생긴다. 이는 클래스 차원에서의 접근제한만 의미를 가지는 것이 아니라 내부클래스의 멤버변수의 접근제한자 또한 타 클래스가 그 내부클래스의 멤버변수에 접근할때 영향을 미치게 된다.

 

 

이와 같이 내부클래스를 private으로 설정하면
이처럼 타클래스에서 접근할때 문제 생김.

 

 

또한, 내부 클래스를 아래와 같이 접근제한을 public으로 해도

 

그 멤버변수가 여전히 private이라면 타클래스에서 이 내부클래스의 멤버변수에 접근할라고 하면 아래와 같은 오류발생함.

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

원래는 반복자는 자료구조 클래스의 내부구조 클래스 안에 내부 클래스로 정의된다(왜냐하면 반복자는 자료구조 객체 안에서만 쓰이는 것이므로 또한 반복자 클래스는 내부 클래스로 들어가기에 충분히 간단한 클래스임). 위 예제는 어디까지나 반복자를 독립클래스로 만들어 주었을시 그 자료구조 클래스의 데이터가 되는 템플릿 데이터 클래스(여기서는 TreeNode)역시 외부 독립 클래스로 와야 하는게 적절함을 보여 주고 있다. 왜냐하면 반복자 클래스가 독립클래스가 될시에 반복자 클래스 내부에서 템플릿 데이터 클래스에 위의 예시처럼 접근하고 있는데 반복자클래스를 독립 클래스로 만들어 주었음에도  템플릿 데이터 클래스(TreeNode)를 계속해서 BST(자료구조 클래스)의 내부 클래스로 남겨 둔다면 BST.TreeNode와 같이 효율적이지 못하게 접근해야 하기 때문이다.

 

정리하면 반복자 클래스는 자료구조클래스안에 내부 클래스로 정의하는것이 원칙이고 실험적으로 반복자 클래스를 독립 클래스로 만들어 준다면 템플릿 데이터 클래스 역시 독립클래스로 만들어 주는 것이 맞다는 것이다.