제어자(modifier)
제어자(modifier)란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미합니다.
자바에서 제어자는 접근 제어자(access modifier)와 기타 제어자로 구분할 수 있습니다.
기타 제어자는 경우에 따라 여러 개를 함께 사용할 수도 있지만, 접근 제어자를 두 개 이상 같이 사용할 수는 없습니다.
이러한 접근 제어자와 기타 제어자는 조합에 따라 함께 사용할 수 있습니다.
접근 제어자 (Access Modifier)
접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
자바에서는 다음과 같은 네 가지의 접근 제어자를 제공합니다.
1. private
2. public
3. default
4. protected
접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다. 따라서 default 일경우에는 접근제어자를 지정하지 않는다.
접근제어자가 사용될 수 있는 곳은 클래스, 멤버변수, 메서드, 생성자 로
접근 범위 private < default < protected < public 순으로 보다 많은 접근을 허용한다
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | ||||
protected | ||||
default | ||||
private |
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다
- 이것을 데이터 감추기라고 하며 객체지향개념에선 캡슐화(encapsulation)이라 한다.
private 접근 제어자
private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없습니다.
public 접근 제어자
public 접근 제어자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수 있습니다.
자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있습니다.
따라서 public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface) 역할을 수행한다고 할 수 있습니다.
default 접근 제어
자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default 접근 제어를 별도로 명시하고 있습니다.
이러한 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 됩니다.
default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있습니다.
protected 접근 제어자
자바 클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축합니다.
여기에 부모 클래스(parent class)와 관련된 접근 제어자가 하나 더 존재합니다.
protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됩니다.
클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같습니다.
1. 이 멤버를 선언한 클래스의 멤버
2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버
3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버
다음 그림은 클래스의 protected 멤버에 접근할 수 있는 영역을 보여줍니다.
기타 제어자
final 제어자
자바에서 final 제어자는 '변경할 수 없다'는 의미로 사용됩니다.
즉, 필드나 지역 변수에 사용하면 값을 변경할 수 없는 상수(constant)가 됩니다.
또한, 클래스에 사용하면 해당 클래스는 다른 클래스가 상속받을 수 없게 됩니다.
메소드에 사용하면 해당 메소드는 오버라이딩(overriding)을 통한 재정의를 할 수 없게 됩니다.
자바에서 final 제어자를 사용할 수 있는 대상은 다음과 같습니다.
- 클래스, 메소드, 필드, 지역 변수
static 제어자
자바에서 static 제어자는 '공통적인'이라는 의미로 사용됩니다.
즉, static 제어자를 변수에 사용하면 해당 변수를 클래스 변수로 만들어 줍니다.
또한, 메소드에 사용하면 해당 메소드를 클래스 메소드로 만들어 줍니다.
이러한 static 제어자는 초기화 블록에도 사용할 수 있습니다.
static 제어자를 가지는 멤버는 다음과 같은 특징을 가지게 됩니다.
1. 프로그램 시작시 최초에 단 한 번만 생성되고 초기화됩니다.
2. 인스턴스를 생성하지 않고도 바로 사용할 수 있게 됩니다.
3. 해당 클래스의 모든 인스턴스가 공유합니다.
자바에서 static 제어자를 사용할 수 있는 대상은 다음과 같습니다.
- 메소드, 필드, 초기화 블록
abstract 제어자
자바에서 abstract 제어자는 '추상적인'이라는 의미로 사용됩니다.
선언부만 있고 구현부가 없는 메소드를 추상 메소드라 하며, 반드시 abstract 제어자를 붙여야 합니다.
또한, 하나 이상의 추상 메소드가 포함하고 있는 추상 클래스도 반드시 abstract 제어자를 붙여야 합니다.
자바에서 abstract 제어자를 사용할 수 있는 대상은 다음과 같습니다.
- 클래스, 메소드
제어자의 조합
자바에서는 접근 제어자와 기타 제어자를 한 대상에 함께 사용할 수 있습니다.
하지만 모든 경우가 가능한 것은 아니며, 대상에 따라 사용할 수 있는 조합은 다음과 같습니다.
대상함께 사용할 수 있는 제어자
클래스 | public, (default), final, abstract |
메소드 | 모든 접근 제어자, final, static, abstract |
필드 | 모든 접근 제어자, final, static |
지역 변수 | final |
초기화 블록 | static |
또한, 자바에서는 제어자의 특성상 몇몇 제어자는 함께 사용할 수 없습니다.
1. 클래스에 final과 abstract는 함께 사용할 수 없습니다.
: final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 되며, abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로, 이 두 제어자는 클래스에 함께 사용할 수 없습니다.
2. 메소드에 static과 abstract는 함께 사용할 수 없습니다.
: abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데, static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
3. 메소드에 private과 abstract는 함께 사용할 수 없습니다.
: abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데, private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
4. 메소드에 private과 final은 함께 사용할 필요가 없습니다.
: 메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 충분히 전달될 수 있습니다.
캡슐화(encapsulation)
캡슐화(Encapsulation)는 객체지향 프로그래밍에서 중요한 개념 중 하나로, 객체의 데이터와 메서드를 외부로부터 감추는 것을 의미합니다. 즉, 객체의 내부 구현을 외부에서 직접 접근하지 못하도록 하고, 오직 객체의 인터페이스를 통해서만 접근할 수 있도록 제한하는 것입니다.
캡슐화는 객체의 내부 구현을 외부로부터 감추어 정보 은닉을 실현할 수 있게 합니다. 이는 객체의 내부 데이터를 보호하고, 객체의 일관성과 안정성을 보장하는 데 도움이 됩니다. 또한, 객체의 내부 구현이 변경되더라도 외부에서 영향을 받지 않도록 하여 유연성과 유지 보수성을 높일 수 있습니다.
캡슐화는 객체 지향 프로그래밍의 세 가지 기본 개념 중 하나인 캡슐화, 상속, 다형성을 구현하는데 있어서 매우 중요한 역할을 합니다.
연관된 글 :
참고 :
chat gpt
https://wikidocs.net/232#private
http://www.tcpschool.com/java/java_modifier_accessModifier
'개발 > Java' 카테고리의 다른 글
[JAVA] Lambda (0) | 2023.03.20 |
---|---|
[Java] 삼항 연산자 (0) | 2023.03.19 |
[Java] Enum (0) | 2023.02.23 |
[JAVA] String 과 String Buffer, StringBuilder 의 차이 (0) | 2023.02.21 |
[JAVA] 정규표현식 (0) | 2023.02.21 |