[작성일: 2023. 01. 28]
목차
제어자(Modifier)
- 클래스와 클래스의 멤버 (멤버 변수, 메서드)에 부가적인 의미를 부여하는 것
접근 제어자 public, protected, (default), private
그 외 static, final, abstract, native, transient, synchronized, volatile, sticftp
- 하나의 대상에 여러 제어자를 같이 사용 가능
- 접근 제어자는 하나만 사용 가능
public class ModifierTest {
public static final int WIDTH = 200;
// 제어자 3개 사용
// 순서는 상관없으나 대부분 접근제어자를 제일 앞에 사용함.
public static void main(String[] args) {
System.out.println("WIDTH= " + WIDTH);
}
}
static
- 클래스의, 공통적인
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨. - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능 - 클래스가 메모리에 로드될 때 생성됨 |
메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨. - static 메서드 내에서는 인스턴스 멤버들 직접 사용 불가 |
class StaticTest { // 객체 생성 없이 사용 가능
static int width = 200; // 클래스 변수(static 변수), cv
static int height = 120; // 클래스 변수(static 변수), cv
static { // 클래스 초기화 블럭
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b) {
// 클래스 메서드(static 메서드)
// iv, 인스턴스 메서드 사용 불가
return a > b ? a : b;
}
}
final
- 마지막의, 변경될 수 없는
제어자 | 대상 | 의미 |
final | 클래스 | - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 됨 - final로 지정된 클래스는 다른 클래스의 조상이 될 수 없음. - String, Math, ... |
메서드 | - 변경될 수 없는 메서드 - 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(); // 추상 메서드(구현부가 없음)
// 괄호 {}가 없음
}
AbstractTest a = new AbstactTest();
// 에러. 추상 클래스는 인스턴스 생성 불가
접근 제어자(Access Modifier)
private 같은 클래스 내에서만 접근 가능
(default) 같은 패키지 내에서만 접근 가능
protected 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근 가능
public 접근 제한 없음
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 (다른 패키지) |
전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
public class AccessModifierTest {
(default) int ic; // 멤버변수(인스턴스 변수)
static int cv; // 멤버변수(클래스 변수)
public
protected void method() {}
(default) }
private
캡슐화와 접근 제어자
- 접근 제어자를 사용하는 이유?
- 외부로부터 데이터를 보호하기 위해서
- iv의 외부접근을 막고 메서드(setHour)를 통해 접근하는 것
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
public class Time {
private int hour; // 접근제어자를 private로 하여
private int minute; // 외부에서 iv 직접 접근 막음
private int second;
// 메서드는 public으로 작성
public int getHour() { return hour; }
public void setHour(int hour) {
if (hour < 0 || hour > 23) return;
this.hour = hour;
}
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.