제어자는 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미를 부여해준다.
접근 제어자 : public, protected, (default), private
그 외 : static, final, abstract, native, transient, ...
- 접근 제어자를 가장 왼쪽에 입력한다.
- 하나의 대상에 여러 제어자를 같이 사용 가능하다.
- static 제어자
static | 멤버 변수 | - 모든 인스턴스에 공통적으로 사용(공유)되는 클래스변수 - 클래스 변수는 인스턴스를 생성하지 않고, 클래스가 메모리에 올라가면 사용 생성. |
메서드 | - 인스턴스를 생성하지 않고, 호출이 가능한 static 메서드가 됨. - static 메서드 내에서는 인스턴스 멤버들을 사용 불가함. |
class StaticTest {
static int width = 100; //static 변수
static int height = 10; //static 변수
static { //클래스 초기화 블럭(static 변수의 복잡한 초기화 수행)
}
static int max(int a, int b){ // static 메서드
return a > b ? a : b;
}
}
- final 제어자
final |
클래스 | - 변경, 확장될 수 없는 클래스이다. - 다른 클래스의 조상이 될 수 없다. - 상속계층에서의 마지막 클래스 |
메서드 | - 변경될 수 없는 메서드이다. - final 메서드는 오버라이딩을 통해 재정의 될수가 없다. |
|
멤버변수 | - 변수 앞에 final이 붙으면, 변경 불가한 상수가 된다. | |
지역변수 |
final class FinalTest { // 조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 상수
final void getMaxSize() { // 오버라이딩할 수 없는 메서드
final int LOCAL_VARIABLE = MAX_SIZE; // 상수
return MAX_SIZE;
}
}
- final키워드 활용 예시
- String 클래스: 보안을 의해서 final class를 사용하여 상속할 수 없는 클래스로 활용함.
- Math 클래스 : static 메서드 집합
- abstract 제어자
abstract | 클래스 | - 클래스 내에 추상메서드가 선언되어 있음을 의미. |
메서드 | - 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 의미. |
abstract class AbstractTest { // 추상 클래스
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
- 추상 클래스는 인스턴스 생성이 불가하다. (구현부가 없는 메서드는 미완성 메서드이고, 때문에 추상 클래스는 미완성 클래스이기 때문이다)
- 객체를 생성하기 위해서는 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성이 가능함.
접근 제어자
접근 제어자를 통해 설계를 잘 해야만 캡슐화가 될 수 있다.
접근제어자를 사용하는 이유는 아래와 같다.
- 외부로부터 데이터를 보호하기 위해서이다.(캡슐화)
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서이다.
- 접근 제어자의 종류와 범위
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스(다른 패키지) | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
- class는 public 또는 (default)만 사용가능하다.
- 멤버(멤버변수, 메서드)는 public, protected, default, private을 적절히 사용하여 캡슐화를 진행한다.
'JAVA' 카테고리의 다른 글
19. 다형성, 참조변수의 형변환 (0) | 2022.11.10 |
---|---|
18. 캡슐화 (0) | 2022.10.03 |
16. super()와 super (0) | 2022.10.02 |
15. 오버라이딩 (0) | 2022.10.02 |
14. 상속과 포함 (0) | 2022.10.02 |