접근 제어자
: 클래스, 필드, 메서드에 대해서 외부 접근에 대한 제어를 하는 것
★ private : 같은 클래스 내우베어서만 접근 가능
default(생략) : 클래스 앞에 접근제어자가 없으면 default 클래스로 같은 패키지 내부에서만 접근 가능
protected : 같은 패키지 내부 혹은 외부 패키지의 자손 클래스에서만 접근 가능
★ public : 모든 패키지에서 접근 가능,
class AccessModifier {
// int C_veriable; // 접근제어자가 default
void method () {
C_AccessModifier instance = new C_AccessModifier();
}
}
* C_AccessModifier 클래스는 접근 제어자가 private 이기 때문에 외부 클래스에서 접근이 불가능
import ch02.C_AccessModifier;
class SubClass extends C_AccessModifier {
void method () {
super.protectedVariable = 0;
}
}
* C_AccessModifier 클래스는 접근 제어자가 public 이기 때문에 외부 패키지에서 import가 가능
// C_AccessModifierSub 클래스와 같이 참조
public class C_AccessModifier {
private int privateVariable;
int defaultVariable;
protected int protectedVariable;
public int publicVariable;
void method () {
// C_AccessModifier 클래스와 privateVariable 필드는
// 접근 제어자가 private 이기 때문에 클래스 내부에서만 사용 가능
this.privateVariable = 0;
}
}
* ch02.AccessModifier 클래스는 접근 제어자가 default이기 때문에 외부 패키지에서 import가 불가능
import ch02.AccessModifier;
public class C_AccessModifierSub {
public static void main(String[] args) {
C_AccessModifier instance = new C_AccessModifier();
// C_AccessModifier 클래스와 privateVariable 필드는
// 접근 제어자가 private이기 때문에 외부 클래스에서 접근이 불가능
// instance.privateVariable = 0;
// C_AccessModifier 클래스와 defaultVariable 필드는
// 접근 제어자가 default이기 때문에 외부 패키지에서는 접근이 불가능
// instance.defaultVariable = 0;
// C_AccessModifier 클래스의 protectedVariable 필드는
// 접근 제어자가 protected이기 때문에 외부 패키지에서는 접근이 불가능
// 단, C_AccessModifier 클래스를 확장한 클래스에서는 접근이 가능
// instance.protectedVariable = 0;
// C_AccessModifier 클래스의 publicVariable 필드는
// 접근 제어자가 public이기 때문에 외부 패키지에서는 접근이 가능
instance.publicVariable = 0;
// instnace.a = 0; // 정의되지 않아서 생기는 컴파일러 에러
}
}
비접근 제어자(기타 제어자)
: 접근 제어자와 무관하게 동작을 제어하는 것
final 제어자
- 클래스 : final 제어자가 붙은 클래스는 확장(상속)할 수 없음
- 메서드 : final 제어자가 붙은 메서드는 오버라이딩할 수 없음
- 변수 : final 제어자가 붙은 변수는 재할당할 수 없음
final class FinalModifier1 {
int variable;
}
* class에 final을 붙이면 확장할 수 없다.
class subModifier1 extends FinalModifier1 { } (X)
class FinalModifier2 {
final void method () {
// void method 앞에 final 메소드를 붙이지 않은 것은 오버라이딩을 할 수 없다.
}
}
class FinalModifier3 {
final int variable = 10;
void method () {
}
}
* (variable = 20;을 부여해줘도) 이미 final로 값을 할당해줬기 때문에 다른 값을 할당해 줄 수 없음
static 제어자
- 메서드 : static 제어자가 붙은 메서드는 인스턴스 생성없이 클래스로 바로 호출 가능
- 변수 : static 제어자가 붙은 변수는 인스턴스 생성없이 클래스로 바로 접근 가능
class staticModifier {
static int variable;
static void method () {};
}
제어자의 조합
class Combination {
// public + static + final (주로 사용)// 쓰고 싶은 메시지를 저장하여 사용?, 자주사용되는 조합이다.
public static final int NUMBER = 10;
// 메서드에서 private + final (사용 X)
private final void method () {} // 작성은 가능, private 상태에서는 final을 붙일 의미가 없다.
// 메서드에서 private + abstract X (서로 상충) // 외부에서 접근 불가, 단, 반드시 오버라이드를 해야함 말이 안됨
// 클래스와 메서드에서 final + abstract X (서로 상충)
public class D_Modifier {
public static void main(String[] args) {
staticModifier.variable = 0;
staticModifier.method();
}
}
'AWS(산대특)' 카테고리의 다른 글
DAY 9 - JAVA (0) | 2024.01.30 |
---|---|
DAY 8 - JAVA (0) | 2024.01.29 |
DAY 6 -JAVA (0) | 2024.01.25 |
객체지향 프로그래밍 보충 (0) | 2024.01.25 |
DAY 5 -JAVA (0) | 2024.01.24 |