접근 제한자(Access Modifier)
클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 제한하기 위해 사용
- public : 외부 클래스가 자유롭게 사용할 수 있도록 함
- protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함
- private : 개인적인 것이라 외부에서 사용될 수 없도록 함
- default : 위 3가지 접근 제한자가 사용되지 않을 경우 적용되고 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 함
접근 제한자 | 클래스 내부 | 동일 패키지 | 자식 클래스 | 다른 패키지 |
private | O | X | X | X |
default | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
클래스의 접근 제한
클래스 선언 시 해당 클래스를 어느 범위까지 사용할 것인지 결정해야 하며 클래스는 public, default 접근 제한을 갖는다
// default 접근 제한
class 클래스 {...}
// public 접근 제한
public class 클래스 {...}
default 접근 제한
클래스 선언 시 public을 생략하면 default 접근 제한을 갖으며
같은 패키지 내에서는 제한 없이 사용되고 다른 패키지에서는 사용할 수 없도록 제한된다
public 접근 제한
클래스 선언 시 public 접근 제한자를 붙이면 되고 같은 패키지뿐만 아니라 다른 패키에서도 제한없이 사용 가능
인터넷으로 배포되는 라이브러리 클래스 모두 public 접근 제한을 갖고 있음
생성자의 접근 제한
객체를 생성하기 위해서는 new 연산자로 생성자를 호출하는데, 생성자가 어떤 접근 제한을 갖는지에 따라 호출 가능 여부가 결정
클래스에 생성자를 선언하지 않으면 자동으로 기본 생성자가 추가, 기본 생성자의 접근 제한은 해당 클래스의 접근 제한과 동일하게 설정
- public 접근 제한 : 모든 패키지에서 아무런 제한 없이 생성자 호출
- protected 접근 제한 : default와 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있으나 다른 패키지에 속한
클래스가 해당 클래스의 자식 클래스라면 생성자를 호출할 수 있음 - default 접근 제한 : 다른 패키지에서 생성자를 호출할 수 없고 같은 패키지에서만 호출이 가능함
- private 접근 제한 : 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있음(동일 패키지X, 다른 패키지 X)
단 하나의 객체만 만들도록 보장해야 하는 경우, 싱글톤 패턴으로 설계
싱글톤 패턴 : 생성자를 private 접근 제한으로 선언하고 자신의 유일한 객체를 리턴하는 getInstance() 정적 메소드를 선언하는 것
필드와 메소드의 접근 제한
어떤 접근 제한을 갖는지에 따라 필드와 메소드의 사용 범위가 결정
필드와 메소드는 public, protected, default, private 접근 제한을 가질 수 있다
- public 접근 제한 : 모든 패키지에서 아무런 제한 없이 사용 가능
- protected 접근 제한 : default와 마찬가지로 같은 패키지에 속하는 클래스에서 사용할 수 있으나 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있음
- default 접근 제한 : 다른 패키지에서 필드와 메소드 사용할 수 없음
- private 접근 제한 : 오로지 클래스 내부에서만 사용 가능(동일 패키지X, 다른 패키지X)
Getter와 Setter 메소드
일반적인 객체 지향 프로그래밍에서는 객체의 무결성이 깨질 수 있기 때문에 필드를 객체 외부에서 직접적으로 접근하는 것을 막음
필드는 private로 선언하여 외부로부터 보호, Getter와 Setter 메소드를 작성해서 필드값을 안전하게 변경 및 사용하는 것이 좋음
Setter 메소드
- 데이터를 변경하는 역할
- 매개값을 검증해서 유효한 값만 객체의 필드로 저장
- 형식 : set + 필드이름(첫 글자는 대문자) + ()
Getter 메소드
- 데이터를 읽어오는 역할
- 외부에서 객체의 데이터를 읽을 때 필드값을 가공한 후 외부로 전달
- 필드 타입이 boolean일 경우 get으로 시작하지 않고 is로 시작하는 것이 관례
- 형식 : get + 필드이름(첫 글자는 대문자) + () / is + 필드이름(첫 글자는 대문자) + ()
메소드 | 읽기 전용 | 쓰기 전용 | 모두 | 접근 제어 |
Getter(get / is XXX) | O | X | O | X |
Setter(setXXX) | X | O | O | X |
'혼자 공부하는 자바 📖 > Chapter 06 클래스' 카테고리의 다른 글
Chapter 06-6(1) 패키지와 접근 제한자 (0) | 2022.12.02 |
---|---|
Chapter 06-3(2) 생성자 오버로딩, 다른 생성자 호출: this() (0) | 2022.11.28 |