-
제어자(Modifier)백엔드/자바 2020. 7. 27. 16:12
1. 제어자(modifier)란?
클래스와 클래스 멤버의 선언시 사용하여 클래스나 멤버에 부가적인 의미를 부여하는 키워드를 말한다.
이를 통해 클래스나 클래스 멤버의 특성이나 사용 범위 등을 제한할 수 있다.
제어자는 크게 접근 제어자(access modifier)와 기타 제어자로 나뉜다.
2. 접근 제어자(access modifier)
정보 은닉을 위해 만들어진 제어자이다.
접근 제어자를 통해서 외부에서 클래스 내 멤버의 접근 범위를 설정할 수 있다.
접근 허용 범위를 표로 나타내면 다음과 같다.
접근자 / 접근 범위
같은 클래스
같은 패키지
상속 클래스
전체
public
O
O
O
O
protected
O
O
O
default
O
O
private
O
(1) public
public 제어자가 붙은 멤버 변수, 메소드는 어떤 클래스에서든 접근이 가능하다.
(2) protected
protected이 붙은 멤버 변수, 메소드는 해당 변수, 메소드가 위치한 패키지 내에 있는 클래스에서만 접근 가능하다.
그리고 해당 클래스를 상속받은 외부 패키지에서 접근 가능이 가능하다.
(3) default
접근 제어자가 없는 경우를 default라고 한다.
default 일 경우 멤버 변수와 메소드는 해당 변수, 메소드가 위치한 패키지 내에 있는 클래스에서만 접근 가능하다.
(4) private
private이 붙은 멤버 변수와 메소드는 해당 클래스 내에서만 접근이 가능하다.
접근 제어자는 대상에 따라서 사용이 달라진다.
대상
사용 가능 접근 제한자
클래스
public, default
메서드
public, protected, default, private
멤버 변수
public, protected, default, private
지역 변수
없음
3. 기타 제어자
(1) final 제어자
상수를 만들어줄 때 사용하는 것.
필드, 지역 변수에 사용하면 값을 변경할 수 없는 상수(constant)가 된다.
final을 클래스에 사용하게 되면 다른 클래스는 해당 클래스는 상속받을 수 없게 된다.
메소드에 사용하면 해당 메소드는 오버라이딩을 통해 재정의가 불가능하다.
(2) static 제어자
static 제어자를 멤버 변수에 사용하면 해당 멤버 변수를 클래스 변수로 만들어줌.
또한 메소드에 사용하면 해당 메소드를 클래스 메소드로 만들어줌. static은 초기화 블록에도 사용 가능.
즉 static을 붙이면 별도의 객체 생성 없이도 클래스 단계에서 접근이 가능하다.
static 제어자는 다음과 같은 특징을 갖는다.
● 프로그램 시작시 최초에 단 한번 생성된다.
(생성자를 새로 생성해서 이용하더라도 값을 초기화되지 않는다)
● 인스턴스를 생성하지 않고 바로 사용이 가능하다.
● 해당 클래스의 모든 인스턴스가 공유한다.
● static 제어자를 사용할 수 있는 대상은 메소드, 필드, 초기화 블록이다.
(3) abstract 제어자
선언부만 있고 구현부가 없는 메소드를 추상 메소드라고 한다.
반드시 앞에 abstract 제어자를 붙여야 한다.
하나 이상의 추상 메소드를 포함한 추상 클래스도 반드시 abstract 제어자를 붙여야 한다.
4. 제어자의 조합
대상
함께 사용 가능한 제어자
클래스
public / default + final / abstract
메소드
public / protected / default / private + final / static / abstract
필드(멤버변수)
public / protected / default / private+ final / static
지역변수
final
초기화 블록
static
위 표와 같이 접근 제어자와 기타 제어자를 조합하여 사용할 수 있다.
몇 가지 주의점이 있다.
(1) 클래스에 final과 abstract는 함께 사용할 수 없다.
final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 된다.,
abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로,
이 두 제어자는 클래스에 함께 사용할 수 없다.
(2) 메소드에 static과 abstract는 함께 사용할 수 없다.
abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데
static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로
이 두 제어자는 메소드에 함께 사용할 수 없다.
(3) 메소드에 private과 abstract는 함께 사용할 수 없다.
abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데
private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로
이 두 제어자는 메소드에 함께 사용할 수 없다.
(4) 메소드에 private과 final은 함께 사용할 필요가 없다.
메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한
재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 전달된다.
'백엔드 > 자바' 카테고리의 다른 글
메서드(method)에 대해서 (0) 2020.07.27 필드와 변수(field & Variable) (0) 2020.07.27 객체(object)에 대해서 (0) 2020.07.27 자바의 기본(클래스, 메서드, 필드, 생성자, 인스턴스) (0) 2020.07.27 자바(Java) 메모리 구조 / Runtime Data Area (1) 2020.07.27