클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

클래스와 객체 13 - 접근 제한자 본문

프로그래밍 언어/자바

클래스와 객체 13 - 접근 제한자

huenuri 2024. 8. 18. 09:41

이제 책으로 접근 제한자에 대해서 학습해보려고 한다. 우리가 활용하는 공간들을 보면서 접근 지정에 대해 한번 생각해보자.

객체 지향 언어에는 접근 지정자를 두고 있다. 객체를 캡슐화하기 때문에, 객체에 다른 객체가 접근하는 것으로 허용할지, 말지를 지정할 필요가 있기 때문이다.

 


 

 

 

1. 패키지

자바는 서로 관련있는 클래스 파일들을 패키지(package)에 저장하여 관리하도록 한다. 파키지는 디렉터리 혹은 폴더와 같은 개념이며 개발자는 클래스 파일들을 여러 패키지에 분산 관리하는 것이 일반적이다.


 

 

 

2. 자바의 4가지 접근 지정자

접근 지정자는 클래스나 멤버들을 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어이다.

  • private, protected, public, 접근 지정자 생략(default)


 

 

 

3. 클래스 접근 지정

클래스 접근 지정이란 다른 클래스에서 이 클래스를 활용할 수 있는지 허용 여부를 지정하는 것으로 말한다. 

 

public 클래스

클래스 이름 앞에 public으로 선언된 클래스로, 패키지에 상관없이 다른 어떤 클래스에게도 사용이 허용된다. 

public class World {	// pulbic 클래스
..........
}

 

 

디폴드 클래스(접근 지정자 생략)

접근 지정자 없이 클래스를 선언한 경우, 디폴트 접근 지정으로 선언되었다고 한다.

class Local {	// 디폴트  클래스
.........
}

 

디폴트 클래스는 같은 패키지 내의 클래스들에게만 사용이 허용된다.


 

 

 

4. 멤버  접근 지정

클래스 멤버에 대한 접근 지정을 알아보자.

 

private -> 디폴트 -> protected -> public 순으로 공개의 범위가 넒어진다.

 

 

 

public 멤버

패키지를 막론하고 모든 클래스들이 접근 가능하다.


 

 

 

private 멤버

클래스 내의 멤버들에게만 접근이 허용된다. 

 

 

 

protected 멤버

2가지 유형의 클래스에서만 접근을 허용한다. 첫째, 같은 패키지의 모든 클래스에 접근기 허용된다. 둘째, 다른 패키지에 있더라도 자식 클래스의 경우 접근이 허용된다. 

 

 

디폴트 멤버(default 또는 package-private)

접근 지정자가 생략된 멤버의 경우, 디폴트 멤버라고 한다. 동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근할 수 있다.

 


 

 

 

멤버의 접근 지정자

다음 코드의 두 클래스 Sample과 AccessEx 클래스는 동일한 패키지에 저장된다. 컴파일 오류를 찾아내고 이유를 설명하라.

 

 

 

 

Sample에서도 main에서도 오류가 뜨고 있다. 왜냐하면 b를 private으로 선언했기 때문이었다. 그렇기에 Sample에서 받고 있는 b도 오류가 뜨는 것이다. 이 코드가 정상 작동이 될 수 있도록 고쳐보자.


 

 

 

 

 

이제 오류가 모두 사라졌다. 오류를 고치고 정상 작동하는 걸 보는 것이 가장 기쁘다.


 

 

 

 

 

핵심 체크 문제 풀기

1. 다음 코드에서 SampleClass 클래스와 AcessEx 클래스가 각기 다른 패키지에 저장되어 있을 때 코드에서 발생한 오류 찾아내고 이유 설명하기

 

 

이렇게 field1에서 빨간줄이 표시되는데 이건 패키지 핵심체크에 있는 클래스를 public으로 선언하지 않았기 때문이다. 이렇게 하면 오류가 제거된다.


 

 

 

 

 

이제 오류가 모두 사라졌다. 클래스의 접근지정자를 지정하지 않으면 파일에 파란색 세모가 나타난다. 그리고 클래서에서 public으로 선언했다고 해도 변수를 public으로 다시 선언을 해야 진짜로 모든 필드에서 접근이 가능한 상태가 된다는 것도 알게 되었다.


 

 

 

 

2. 다음 코드에서 두 클래스가 같은 패키지에 저장된다고 할 때 컴파일 오류를 찾아내고 그 이유를 설명하기

 

 

이 코드는 field4가 private으로 지정되어 있어 접근할 수 없기에 그런 것이다. 코드를 수정하면 다음과 같다.


 

 

 

 

 

이제 오류가 모두 없어졌다.


 

 

 

3. 클래스의 필드 멤버는 private, public, 디폴트 중 어떤 것으로 선언하는 것이 좋은가?

private으로 선언하여 보호하는 것이 좋다. 그런 다음 getter와 setter 메소드를 사용해 값을 저장하고 수정하면 된다.


 

 

 

 

학습을 마치고

오늘 오전에 이 내용을 모두 학습을 마치려고 했으나 문제 풀이 부분은 오후에 예배를 드리고 부모님과 함께 외출을 한 후에 학습을 이어갔다. 집에 손님이 있으면 공부를 할 수 없고 다른 일들도 많아서 5시가 넘어서야 이 학습을 끝마쳤다.

그래도 포기하지 않고 공부를 다시 이어갈 수 있어서 감사했다.