반응형
1. 제어자( modifier )란?
- 제어자란 클래스, 변수 또는 메소드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
- 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다.
접근 제어자 public, protected, ( default ), private 그 외 static, final, abstract, transient, synchronized, volatile, strictfp ... - 제어자는 클래스나 멤버변수와 메소드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다.
- 단, 접근제어자는 한 번에 4가지 중 하나만 선택해서 사용할 수 있다.
2. static - 클래스, 공통적인
- static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.
- 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만 클래스 변수는 인스턴스에 관계없이 같은 값을 갖는다.
- static이 붙은 멤버변수와 메소드, 그리고 초기화 블록은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.
* static이 사용될 수 있는 곳 - 멤버변수, 메소드, 초기화 블록
제어자 대상 의미 static 멤버변수 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. 클래스변수는 인스턴스를 생성하지 않고도 사용가능하다. 클래스가 메모리에 로드 될 때 사용된다. 메소드 인스턴스를 생성하지 않고도 호출이 가능한 static 메소드가 된다. static 메소드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
3. final - 마지막의, 변경될 수 없는
- final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.
- 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메소드에 사용되며 오버라이딩 할 수 없고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못한다.
제어자 대상 의미 final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 메소드 변경될 수 없는 메소드 final로 지정된 메소드는 오버라이딩을 통해 재정의 될 수 없다. 멤버변수, 지역변수 변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.
4. abstract - 추상의, 미완성의
- abstract는 '미완성'의 의미를 가지고 있다.
- 메소드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상메소드를 선언하는데 사용된다.
* abstract가 사용될 수 있는 곳 - 클래스, 메소드
제어자 대상 의미 abstract 클래스 클래스 내에 추상메소드가 선언되어 있음을 의미한다. 메소드 선언부만 작성하고 구현부는 작성하지 않는 추상메소드
5. 접근제어자( access modifier )
- 접근제어자는 멤버 또는 클래스에 사용되며 해당하는 멤버 또는 클래스 외부에서 접근하지 못하도록 제한하는 역할을 한다.
- 접근제어자가 default임을 알리기 위해 실제로 default를 붙이지는 않는다.
* 접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메소드, 생성자
제어자 같은 클래스 같은 패키지 자손 클래스 전체 public O O O O protected O O O X ( default ) O O X X private O X X X public > protected > ( default ) > private ( 접근범위가 넓은 쪽에서 좁은 쪽의 순으로 나열 )
- 접근제어자를 이용한 캡슐화
- 클래스나 멤버, 주로 멤버에 접근제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서 이다.
- 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서 외부로부터의 접근을 제한하는 것이 필요하다.
- 이를 데이터 감추기( data hiding )라고 하며, 객체지향개념의 캡슐화( encapsulation )에 해당하는 내용이다.
- 또 다른 이유는 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위해 메소드 등의 멤버들을 클래스 내부에 감추기 위함이다.
- 외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다.
- 생성자의 접근제어자
- 생성자에 접근제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.
- 보통 생성자의 접근제어자는 클래스의 접근제어자와 같지만 다르게 지정할 수 있다.
- 생성자의 접근제어자를 private으로 지정하면 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.
- 그래도 클래스 내부에서는 인스턴스를 생성할 수 있다.
6. 제어자( modifier )의 조합
대상 | 사용가능한 제어자 |
클래스 | public, (default), final, abstract |
메소드 | 모든 접근제어자, final, abstract, static |
멤버변수 | 모든 접근제어자, final, static |
지역변수 | final |
- 메소드에 static과 abstract를 함께 사용할 수 없다.
==> static 메소드는 몸통이 있는 메소드에서만 사용할 수 있기 때문이다. - 클래스에 abstract와 final을 동시에 사용할 수 없다.
==> 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서만 완성되어야 한다는 의미이므로 모순 - abstract 메소드의 접근 제어자가 private일 수 없다.
==> abstract 메소드는 자손클래스에서 구현해주어야 하는데 접근제어자가 private이면 자손클래스에서 접근할 수 없기 때문 - 메소드에 private과 final을 같이 사용할 필요는 없다.
==> 접근제어자가 private인 메소드는 오버라이딩될 수 없기 때문에 이 둘 중 하나만 사용해도 의미가 충분하다.
반응형
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] 추상클래스( abstract class ) (0) | 2022.01.26 |
---|---|
[JAVA] 다형성( polymorphism ) (0) | 2022.01.25 |
[JAVA] 상속( inheritance ), 오버라이딩( overriding ) (0) | 2022.01.20 |
[JAVA] 오버로딩( Overloading ), 생성자( Constructor ), 변수의 초기화 (0) | 2022.01.18 |
[JAVA] 변수와 메소드 (1) | 2022.01.16 |