* 제어자(modifier)
- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
* 접근제어자 : public, private, (default), protected
* 그 외 : static, final abstract, native, transient, synchronized, volatile, stricffp
- 하나의 대상에 여러 제어자를 같이 사용 가능(접근 제어자는 하나만 가능)
public class ModifierTest {
public static final int WIDTH = 200;
public static void main(String[] args) {
System.out.println("WIDTH="+WIDTH);
}
}
* static - 클래스의, 공통적인
- static 은 멤버변수, 메서드에 사용할 수 있다.
- 멤버변수에 사용할 때 의미 : 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨, 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다, 클래스가 메모리에 로드될 때 생성된다.
- 메서드에 사용할 때 의미 : 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨, static 메서드 내에서는 인스턴스 멤버(IV, IM)들을 직접 사용할 수 없다. -> IV 멤버들은 객체를 만들고 나서 사용할 수 있기 때문에 static에서는 사용 불가, static은 객체 생성없이 사용가능하기 때문에!
class StaticTest {
static int width = 200; // 클래스 변수(static 변수)
static int height = 100; // 클래스 변수(static 변수)
static { // 클래스 초기화 블럭
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b) { // 클래스 메서드(static 메서드)
return a > b ? a : b;
}
}
* final - 마지막의, 변경될 수 없는
- final 은 클래스, 메서드, 멤버변수, 지역변수에 사용할 수 있다.
- 클래스에 사용할 때 의미 : 변경될 수 없는 클래스, 확장될 수 없는 클래스, final로 지정된 클래스는 다른 클래스의 조상이 될 수 없음
- 메서드에 사용할 때 의미 : 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없음
- 멤버변수, 지역변수에 사용할 떄 의미 : 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
final class FinalTest { // 조상이 될 수 없는 클래스
final int max_size = 10; // 값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() { // 오버라이딩 할 수 없는 메서드(변경불가)
final int LV = max_size;// 값을 변경할 수 없는 지역변수(상수)
return max_size;
}
}
* abstract - 추상의, 미완성의
- abstract는 클래스, 메서드에 사용할 수 있다.
- 클래스에 사용할 때 의미 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
- 메서드에 사용할 때 의미 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
- 추상 클래스는 미완성 설계도이며, 제품 생성 불가 (즉, 객체(인스턴스) 생성 불가)
- 추상 클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성이 가능하다.
abstract class AbstractTest { // 추상 클래스(추상메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
* 접근 제어자 (public > protected > (default) > private 순으로 제한이 넓다)
public | 접근 제한이 전혀 없다 |
private | 같은 클래스 내에서만 접근이 가능하다 |
(default) | 같은 패키지 내에서만 접근이 가능하다 |
protected | 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능 |
package AFTERCH6;
class MyParent {
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근제한 없음.
public void printMembers() {
System.out.println(prv); // ok
System.out.println(dft); // ok
System.out.println(prt); // ok
System.out.println(pub); // ok
}
}
public class MyParentTest {
public static void main(String[] args) {
MyParent p = new MyParent();
// System.out.println(p.prv); // private 에러 발생, 같은 클래스 내에서만 사용이 가능하기 때문에
System.out.println(p.dft); // ok
System.out.println(p.prt); // ok
System.out.println(p.pub); // ok
}
}
'Programming > Java' 카테고리의 다른 글
[JAVA] 참조변수의 형변환, Instanceof 연산자 (0) | 2021.11.09 |
---|---|
[JAVA] 캡슐화, 다형성 (0) | 2021.11.08 |
[JAVA STUDY] 6주차 : 상속 (0) | 2021.11.07 |
[JAVA STUDY] 5주차 : 클래스(Class) (0) | 2021.10.29 |
[JAVA STUDY] 4주차 : 제어문 (0) | 2021.10.27 |