프로그래밍 공방

[Java의 정석] Chapter 7. 제어자 / Modifier 본문

개발/Java

[Java의 정석] Chapter 7. 제어자 / Modifier

hyosupsong 2021. 1. 24. 22:24

제어자 / Modifier

클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

- 접근 제어자 : public, protected, default, private
- 그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp 등

하나의 대상에 대해 여러 제어자를 조합해서 사용하는 것이 가능하다.
( * 접근제어자는 하나만 사용가능, 제어자간의 순서는 상관없지만 주로 접근제어자를 가장 왼쪽에 둔다.)

static

멤버변수, 메서드, 초기화 블록 앞에 사용해서 인스턴스와의 관계를 클래스와의 관계로 만들어준다.

<참고>
인스턴스 멤버를 사용하지 않는 메서드는 static을 고려하는 것이 좋다.
인스턴스를 생성하지 않아도 호출이 가능하고, 속도도 조금 더 빠르다.

final

거의 모든 대상으로 사용될 수 있으며 해당 대상을 변경할 수 없는 것으로 만든다.

* final 변수는 일반적으로 선언과 함께 초기화를 하지만 인스턴스 변수인 경우 생성자에서 초기화 할 수 있다.

abstract

1. 메서드의 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다.

2. 클래스에 사용해서 클래스 내에 추상 메서드가 존재한다는 것을 쉽게 알 수 있게 한다.

접근 제어자

클래스, 메서드, 멤버변수, 생성자에 사용되어 대상을 외부에서 접근하지 못하도록 제한하는 역할

접근 제어자를 이용한 캡슐화

1. 접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하기 위함
    외부로부터의 접근을 제한 -> 데이터 감추기 -> 객체지향개념의 캡슐화

2. 클래스 내에서만 사용되는 내부 작업을 위해 임시로 사용되는 멤버변수나 부분 작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위함

접근 제어자를 사용하는 이유

- 외부로부터 데이터를 보호하기 위해
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
예) getter, setter

생성자의 접근제어자

생성자에 접근제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다. (default는 클래스와 동일)

* 생성자의 접근제어자를 private으로 지정하면, 외부에서 인스턴스를 생성할 수 없지만 클래스 내부에서는 생성이 가능하다.
=> singleton
추가로 생성자가 private이면 부모 클래스가 될 수 없다. (자식 클래스의 생성자에서 super() 불가능)

제어자를 조합할 때의 주의사항

1. 메서드에 static과 abstract를 함께 사용할 수 없다. (static은 몸통이 있는 메서드에만 사용할 수 있다.)
2. 클래스에 abstract와 final을 동시에 사용할 수 없다. (abstract와 final은 서로 모순된다.)
3. abstract 메서드의 접근 제어자가 private 일 수 있다.
4. 메서드에 final과 private는 같이 사용할 필요가 없다 (의미 중복)