제어자(modifier)
제어자란?
- 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하는 것이 가능.
- 접근 제어자는 하나만 사용이 가능하다. public > protected > (default) > private
static - 클래스의, 공통적인
- 인스턴스 변수는 하나의 클래스로부터 생성되더라도 다른 값을 유지, 클래스 변수(static 멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다.
- static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
static 멤버변수
- 모든 인스턴스에 공통으로 사용되는 클래스 변수가 된다.
- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
static 메서드
- 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
final - 마지막의, 변경될 수 없는
- final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
final 클래스
- 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
- final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. (상속 X)
final 메서드
- 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
final 멤버변수 & 지역변수
- 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
- final이 붙은 변수는 상수이므로 선언과 초기화를 동시에 한다.
- 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있다.
- 클래스 내에서 매개변수를 갖는 생성자를 선언하고, 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로 제공받는 것이다.
- 이 기능을 활용해 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능하다.
package com.kh.chapter3;
import com.kh.chapter3.field.A_Field;
import com.kh.chapter3.field.B_StaticField;
import com.kh.chapter3.field.C_StaticFinalField;
import com.kh.chapter3.field.D_InitBlock;
public class Application {
public static void main(String[] args) {
// 3. 클래스 변수 테스트
// 클래스 변수는 프로그램 실행과 동시에 메모리(static)에 생성되었기 때문에 객체를 생성하지 않아도 접근이 가능하다.
System.out.println(B_StaticField.publicStacicField);
System.out.println(B_StaticField.getPrivateStacicField());
// 정적 멤버는 객체의 참조 변수로도 접근이 가능하지만, 정적 멤버는 클래스 이름으로 접근하는 것을 지향한다.
// B_StaticField staticField = new B_StaticField();
// System.out.println(B_StaticField.publicStacicField);
// System.out.println(B_StaticField.getPrivatesStacicField);
}
}
상수(static final)
[표현법]
public static final 상수명 = 값;
- static과 final의 순서는 상관없으며 선언과 동시에 초기화 해주어야 한다. (static 블록을 통해서도 가능)
- 초기화해주고 값을 변경할 수 없기때문에 setter가 필요없다.
- public으로 선언되었기 때문에 getter가 필요없다.
- 상수의 이름은 모두 대문자로 작성하는 것이 관례이다. 만약 서로 다른 단어가 혼합된 이름이면 언더바(_)로 단어들을 연결한다.
package com.kh.chapter3.field;
public class C_StaticFinalField {
public static final int MAX_LEVEL = 90;
}
abstract - 추상의, 미완성의
- abstract가 사용될 수 있는 곳 - 클래스, 메서드
- abstract 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
- abstract 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
접근 제어자(access modifier)
- 접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
- private : 같은 클래스 내에서만 가능
- default : 같은 패키지 내에서만 가능 (클래스에서 가능)
- protected : 같은 패키지 내 & 다른 패키지의 자손클래스에서 가능
- public : 접근 제한이 없다. (클래스에서 가능)
접근 제어자를 사용하는 이유
- 외부로부터 데이터를 보호할 수 있다.
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 사용한다.
get + 메서드
- 단순히 멤버변수의 값을 반환하는 일 → 멤버변수의 값을 읽는다.
set + 메서드
- 매개변수에 지정된 값을 검사해 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성 → 멤버변수의 값을 변경한다.
생성자의 접근 제어자
- 생성자에 접근 제어자를 사용해 인스턴스의 생성을 제한할 수 있다.
- 보통 생성자의 접근 제어자는 클래스의 접근 제어자와 같지만, 다르게 지정할 수 있다.
- 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다.
제어자(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' 카테고리의 다른 글
객체(Object) - 추상클래스(abstract class) (0) | 2022.09.24 |
---|---|
객체(Object) - 다형성(polymorphism) (1) | 2022.09.23 |
객체(Object) - package & import (0) | 2022.09.21 |
객체(Object) - 오버라이딩(overriding) (0) | 2022.09.20 |
객체(Object) - 상속(inheritance) (0) | 2022.09.19 |