제어자의 정의
- 클래스, 변수 또는 메서드의 선언부에 사용되어 부가적인 의미 부여
- 크게 접근 제어자와 그 외 제어자로 나눌 수 있다.
- 접근 제어자는 두 개 이상 같이 사용할 수 없으나, 기타 제어자는 조합에 따라 여러개를 함께 사용할 수 있다.
(한 선언부에 접근 제어자는 하나, 그 외 제어자는 여러개) - 정의
- 멤버 또는 클래스에 사용되며, 해당하는 멤버 또는 클래스를 외부에서 접근할 때 제한해주는 역할
- 사용 장소
- 클래스
- 멤버 변수
- 생성자
- 사용 이유
- 외부로부터 데이터를 보호하기 위해서 (정보은닉, 캡슐화)
- 외부에서 사용하지 않는 내부적으로만 사용되는 부분을 감춰 복잡성을 줄이기 위해서
- 종류
- public
- 접근 제한이 없는 상태
- protected
- 같은 패키지와 다른 패키지의 자손클래스에서 접근 가능
- (default)
- 같은 패키지 내부에서만 접근 가능
- 생략 가능 - 접근 제어자가 지정되어있지 않다면 default이다.
- private
- 같은 클래스 내부에서만 접근 가능
- public
- 생성자의 접근 제어자
- 생성자에 private을 붙이는 경우
- 클래스 외부에서 인스턴스 생성 불가능
- 해당 클래스의 상속을 제한함
- 이를 활용해서 나온 개념이 정적 팩터리 메서드이다.
- 생성자에 private을 붙이는 경우
그 외 제어자
- static
- 의미 : “클래스의”, “공통적인”
- 사용 장소 : 멤버 변수, 메서드, 초기화 블럭
- static이 지정된 멤버 변수는 인스턴스에 관계 없이 같은 값을 갖는다.
- 모든 인스턴스가 하나의 변수를 공유한다는 의미에서 클래스 변수라고도 부른다.
- static이 지정되면, 인스턴스를 생성하지 않고도 사용 가능하다.
- 단, 인스턴스 멤버를 사용하는 경우, static 메서드가 될 수 없다.
- final
- 의미 : “마지막의”, “변경될 수 없는”, “재할당할 수 없는”
- 사용장소 : 클래스, 메서드, 멤버변수, 지역변수
- final 클래스 : 확장 불가 (다른 클래스의 조상이 될 수 없음)
- final 메서드 : 오버라이딩을 통한 재정의 불가
- final 변수 : 값을 변경할 수 없는 상수가 됨
- final 변수는 일반적으로 선언과 초기화가 동시에 이뤄지지만,
인스턴스 변수에 final이 붙은 경우 생성자 내에서 초기화 가능하다.
- final 변수는 일반적으로 선언과 초기화가 동시에 이뤄지지만,
- abstract
- 의미 : “추상의”, “미완성의”
- 사용장소 : 클래스, 메서드
- abstract 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 미완성 메서드
- abstract 클래스 : 클래스 내부에 추상 메서드가 선언된 클래스
- native
- 의미 : “고유의”
- 사용 장소 : 메서드
- 해당 메서드가 JNI(Java Native Interface)를 사용해서 구현되었음을 의미함
- java언어 자체로도 해결 안되는 경우, 운영체제가 구현된 언어로 만들어진 함수를 java 메서드와 연결
- transient
- 의미 : “일시적인”
- 사용 장소 : 멤버 변수
- 객체의 필드 중 직렬화하지 않을 것들을 지정하기 위해 사용
- synchronized
- 의미 : “공기화된”
- 사용 장소 : 메서드, 코드 블럭
- 여러 스레드가 동시에 접근하는 것을 금지하기 위해 사용
- volatile
- 의미 : “휘발성의”
- 사용 장소 : 변수
- 변수들 중 Main Memory에 저장할 것들을 지정하기 위해 사용
- strictfp
- 의미 : Strict Floating Point (엄격한 부동소수점)
- 사용 장소 : 클래스, 인터페이스, 비추상 메서드
- 부동 소수점 숫자를 IEEE 754 표준에 의해 결정된 규칙으로 엄격하게 처리하기 위해 사용
제어자의 조합
- 함께 사용이 불가능한 조합
- 클래스의 final과 abstract
- (의미적 모순) final - 상속 불가, abstract - 상속을 통해서만 사용 가능
- 메소드에 private과 abstract
- (의미적 모순) final - 오버라이딩 불가, abstract - 오버라이딩을 통해서만 사용 가능
- 메소드에 static과 abstract
- statuc 메서드는 인스턴스 생성 없이 바로 사용되어야 하므로 구현부가 필요한데, abstract 메서드는 구현부가 없으므로
- 클래스의 final과 abstract
- 함께 사용이 불필요한 조합
- 메소드의 private과 final
- 둘 다 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미
- 메소드의 private과 final
레퍼런스
- 자바의 정석 3판 p.344 ~ 353
- http://www.tcpschool.com/java/java_modifier_ectModifier
- 이펙티브 자바 아이템 16
'Develop > Java' 카테고리의 다른 글
추상 클래스와 인터페이스 (0) | 2023.04.04 |
---|---|
다형성 (0) | 2023.04.04 |
메서드 오버라이딩(Overriding) (0) | 2023.04.04 |
메서드 오버로딩 (Overloading) (0) | 2023.04.03 |
클래스와 인스턴스 (0) | 2023.04.03 |