Modifier
자바의 Modifier
static 예약어
인스턴스 변수와 클래스 변수
-
인스턴스 변수
- 클래스로부터 객체가 생성될 때마다 각 객체의 변수들이 생성됨
- 한 객체의 값이 변경되어도 다른 객체의 값에 영향을 미치지 않음
- 객체별로 다른 변수값을 지정해야 할 때 사용
-
클래스 변수
- 클래스로 생성된 모든 객체가 하나의 클래스 변수를 공유함
- 객체가 생성될 때 메모리 영역을 할당하지 않고, 클래스가 로딩되는 최초에 메모리에 한 번만 할당됨
static 예약어
를 사용한 변수가 클래스 변수에 해당됨- 객체를 생성하지 않고도 클래스 이름을 통해 클래스 변수에 접근 가능
클래스 메서드
- static 예약어를 사용한 메서드
- 객체를 생성하지 않고도 호출이 가능함
- 다만, 인스턴스 변수의 경우 인스턴스를 생성해야 메모리가 잡히기 때문에 클래스 메서드에서 인스턴스 변수를 사용할 수 없음
- 또한, 클래스 메서드에서는 클래스 메서드만 호출이 가능함. static 예약어가 붙지 않은 일반 메서드는 호출이 불가능함
final 예약어
최초 초기화 이후 값을 변경할 수 없는 상수로 만듦
변수와 final
static 예약어와 final 예약어를 결합하여 사용함으로써, 클래스 변수의 값을 변경할 수 없도록 함
- 상수의 이름은 일반 인스턴스 변수와 구분하기 위해 대문자로 선언, 단어와 단어 사이는
_
로 연결 -
static과 final
-
static final int cnt = 100;
- 클래스 내부의 모든 부분에 영향을 주고 싶은 상수일 경우
-
final int cnt = 100;
- 객체마다 다른 상수값을 주고 싶은 경우
- 생성자에서 초기화해야함
-
메서드와 final
메서드에 final 예약어를 붙일 경우 메서드 재정의(Overriding)을 금지할 수 있음
클래스와 final
클래스 선언 시 final 예약어를 붙일 경우 상속을 금지할 수 있음
abstract 예약어
추상 메서드
메서드 시그니처(리턴 타입, 메서드명, 매개변수)만 정의하고 블록({}) 부분은 정의되지 않은 메서드
추상 클래스
추상 메서드를 포함하고 있는 클래스의 경우 추상 클래스로 선언되어야 함
추상 클래스와 상속
추상 메서드를 가진 추상 부모 클래스를 상속받는 자식 클래스의 경우, 자식 클래스 내부에서 추상 메서드를 재정의 해야함
Java
// 부모 추상 클래스
abstract class SuperClass {
public void methodA() {
System.out.println("methodA() 실행");
}
public abstract void methodB(); // 추상 메서드
}
// 자식 클래스
class Subclass extends SuperClass {
public void methodB() { // 자식 클래스가 추상 메서드를 재정의
System.out.println("methodB() 실행");
}
}
클래스와 Modifier
클래스 정의 접근 제한 Modifier
Modifier | 설명 |
---|---|
public | 어디서든 인스턴스 생성이 가능 |
(default) | 동일 패키지에 속한 클래스 내에서만 인스턴스 생성 가능 |
멤버 변수 Modifier
구분 | Modifier | 설명 |
---|---|---|
접근 권한 | public | 모든 클래스에서 접근 가능 |
” | protected | 동일 패키지에 속한 클래스와 하위 클래스에서만 접근 가능 |
” | (default) | 동일 패키지에 속한 클래스에서만 접근 가능 |
” | private | 변수가 선언된 클래스 내에서만 접근 가능 |
활용 방법 | final | 변수를 상수로 이용하는 경우 |
” | static | 클래스에 소속된 클래스 변수 |
멤버 메서드 Modifier
구분 | Modifier | 설명 |
---|---|---|
접근 권한 | public | 모든 클래스에서 접근 가능 |
” | protected | 동일 패키지에 속한 클래스와 하위 클래스에서 접근 가능 |
” | (default) | 동일 패키지에 속한 클래스에서만 접근 가능 |
” | private | 클래스 내에서만 접근 가능 |
활용 방법 | final | Overriding이 불가능한 메서드 정의 |
” | static | 클래스에 소속된 클래스 메서드, 클래스 생성시 만들어짐 |
” | abstract | 하위 클래스에 의해 구현되는 추상 메서드 |
” | synchronized | Thread 동기화를 위한 메서드 |
접근 제한자(Access Modifier)
접근 관련 modifier를 통해 정보 은닉을 구현할 수 있음.
종류 | 동일 클래스 | 동일 패키지 | 하위 클래스 | 모든 클래스 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | X |
(default) | O | O | X | X |
private | O | X | X | X |
정보 은닉을 고려한 메서드 구현
- 멤버 변수들은 대부분 private로 선언하여 외부에서는 숨겨진 형태로 만듦
- public으로 지정한 메서드를 통해 접근하도록 클래스를 구현
-
ex)
- private 변수에 저장된 값을 리턴하는 Getter 메서드
- private 변수에 값을 저장하는 Setter 메서드
Java
public class Employee {
private String name;
private int age;
private String dept;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}