[Java] 제어자(Modifier)
by Choi HyeSun
제어자(Modifier) - 정의
-
클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여
-
클래스나 멤버변수와 메서드에 주로 사용
-
하나의 대상에 대해 여러 제어자를 조합해서 사용 가능
- 단, 접근 제어자는 한가지만 선택할 수 있음
-
제어자 순서는 무관하지만, 접근제어자를 가장 왼쪽에 놓는 경향이 있음
제어자 - 종류
-
접근 제어자
- public, protected, default, private
-
그 외의 제어자
- static, final, abstract, native, trnsient, synchronized, strictftp, volatile
[자주 쓰는 제어자] static - 클래스의, 공통적인
-
사용될 수 있는 곳
- 멤버변수, 메서드, 초기화 블럭
-
static이 붙으면
-
인스턴스가 아닌 클래스에 관계된 것으로 인스턴스를 생성하지 않아도 사용 가능
-
인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static 메서드로 선언하는 것을 고려
-
가능하면 static으로 하는 것이 인스턴스를 생성하지 않고 호출이 가능하기 때문에 더 편하고 빠름
-
대상 | 의미 |
---|---|
static 멤버변수 | - 모든 인스턴스에 공통으로 사용되는 클래스 변수 - 인스턴스를 생성하지 않고도 사용 가능 - 클래스가 메모리에 로드될 때 생성 |
static 메서드 | - 인스턴스를 생성하지 않고도 호출 가능 - 인스턴스멤버들을 직접 사용할 수 없음 |
[자주 쓰는 제어자] final - 마지막의, 변경될 수 없는
-
사용될 수 있는 곳
- 클래스, 메서드, 멤버변수, 지역 변수
-
final이 붙으면
-
변수 : 값을 변경할 수 없는 상수가 됨
-
메서드 : 오버라이딩을 할 수 없음
-
클래스 : 자신을 확장하는 자식클래스를 만들 수 없음
예) string, math
-
대상 | 의미 |
---|---|
final 클래스 | - (변경될)확장할 수 없는 클래스 (자식클래스를 만들 수 없음 - 상속불가) |
final 메소드 | - 변경될 수 없는 메서드 - 오버라이딩을 통해 재정의 불가 |
final 멤버/지역 변수 | - 값을 변경할 수 없는 상수 |
-
final멤버변수의 초기화
-
final이 붙은 변수 = 상수
-
인스턴스변수의 경우 생성자에서 초기화되도록 할 수 있어서 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능
방법) 클래스 내에 매개변수를 갖는 생성자를 선언
→ 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공
-
[자주 쓰는 제어자] abstract - 추상의, 미완성의
-
사용될 수 있는 곳
- 클래스, 메서드
-
abstract가 붙으면
-
클래스 : 인스턴스 생성 불가, 클래스 내에 추상메서드가 있음 표시
(간혹 이용) 추상메서드가 없는데 붙일 경우 → 인스턴스를 생성할 수 없음 -
메서드 : 메서드의 선언부만 작성하고 실제 내용은 수행하지 않는 추상 메서드
-
대상 | 의미 |
---|---|
abstract 클래스 | - 추상클래스 - 클래스 내에 추상 메서드가 선언되어 있음 - 인스턴스를 생성하지 못하게 막은 클래스 |
abstract 메서드 | - 추상메서드 - 선언부만 작성하고 구현부는 작성하지 않은 메서드 |
접근제어자
-
외부에서 접근하지 못하도록 제한하는 역할
-
사용 이유
-
외부로부터 데이터를 보호하기 위해서
-
외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 → 캡슐화
-
-
사용될 수 있는 곳
- 클래스, 멤버변수, 메서드, 생성자
-
접근 범위
제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 | 전체 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | |
(default) 아무것도 명시 안할 때 |
O | O | ||
private | O |
- 사용 대상
대상 | 사용가능한 접근 제어자 |
---|---|
클래스 | public, (default) |
메서드 멤버변수 |
public, protected, (default), private |
지역변수 | X |
접근 제어자를 이용한 캡슐화
-
데이터 감추기(data hiding) → 객체지향개념의 캡슐화(encapsulation)
-
데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 외부로부터의 접근을 제한
-
클래스 내에서만 사용하는, 내부 작업을 위해 임시로 사용되는 멤버변수 또는 부분 작업을 처리하기 위한 메서드 등의 멤버를 클래스 내부로 감춤
-
외부에서 접근할 필요가 없는 멤버들을 private로 지정 → 복잡성 ↓
-
-
보통 메서드 이름 (암묵적인 룰)
-
캡슐화되면 멤버변수를 private 등으로 변경하고, 외부에서 접근은 메서드를 통해 진행
-
getter(게터) / get(멤버변수이름) / 멤버변수의 값을 읽는 메서드
-
setter(세터) / set(멤버변수이름) / 멤버변수의 값을 변경
-
생성자의 접근 제어자
-
보통 클래스의 접근 제어자와 같지만 다르게 지정할 수도 있음
-
인스턴스 생성을 제한할 수 있음
-
생성자가 private인 클래스
-
Singleton 패턴 적용 가능
: private static한 인스턴스 참조변수를 생성하고 (static하니까 1회 생성)
그 인스턴스를 반환해주는 public static 메서드를 제공할 수 있음 -
다른 클래스의 부모클래스가 될 수 없음(상속 불가)
: 자식클래스에서 상속시 생성자를 호출해야하는데, 생성자가 private이면 접근이 불가능하기 때문
→ 클래스 앞에 final을 추가해서 상속 불가인 것을 알리는 것이 좋음
-
제어자(modifier)의 조합시 주의사항
-
메서드에 static과 abstract를 함께 사용할 수 없음
- static 메서드는 내용이 있는 메서드만 가능
-
클래스에 abstract와 final을 동시에 사용할 수 없음
-
final - 확장(상속) 불가
-
abstract - 확장(상속)을 통해 완성
-
-
abstract 메서드는 접근 제어자가 priavte일 수 없음
- abstract 메서드 - 자식클래스에서 구현해야 하기 때문
-
메서드에 private와 final을 같이 사용할 필요는 없음
- 접근제어자가 priavte인 메서드는 오버라이딩 불가하기때문에, 하나만 써도 됨
Subscribe via RSS