제어자(Modifiers)
public
이라는 단어가 예시에 계속해서 나왔었습니다.
public
은 접근 제어자 중에 하나입니다. 말 그래도 해당 클래스, 속성, 메서드에 접근 할 수 있는 단계를 설정합니다.
- 제어자를 2가지 그룹으로 나눌 수 있습니다
- 접근 제어자 - 접근 단계를 설정
- 비접근 제어자 - 접근 단계를 설정하지 않으나 다른 기능을 제공함
접근 제어자(Access Modifiers)
제어자 |
설명 |
public |
다른 클래스에서도 접근 가능 |
default |
같은 패키지 안에 있는 클래스에서 접근 가능. 제어자가 없을 시 기본값 |
- 속성, 메서드, 생성자의 접근 제어자는 총 4개 입니다.
제어자 |
설명 |
public |
다른 클래스에서도 접근 가능 |
protected |
같은 패키지 또는 상속 받은 클래스에서 접근 가능 |
default |
같은 패키지 안에 있는 클래스에서 접근 가능. 제어자가 없을 시 기본 값 |
private |
같은 클래스에서만 접근 가능 |
비접근 제어자(Non-Access Modifiers)
제어자 |
설명 |
final |
해당 클래스는 상속 불가 |
abstract |
해당 클래스는 객체 생성을 하지 못함 |
- 속성, 메서드의 비접근 제어자는 총 6개 입니다.
제어자 |
설명 |
final |
해당 속성과 메서드는 오버라이드 또는 변경 불가 |
static |
해당 속성과 메서드는 객체보다 클래스에 속함(객체 생성없이 사용 가능) |
abstract |
abstract 클래스에서만 메서드에 사용 가능. 해당 메서드는 정의되어있지 않아야함(예: abstract void run();). |
transient |
객체를 직렬화 할때 해당 속성과 메서드 스킵 |
synchronized |
하나의 쓰레드에서 한번만 실행 가능한 메서드 |
volatile |
속성 값이 지역 쓰레드에 할당되는 것이 아니라 메인 메모리에서 불러옴 |
- 주로 사용되는 것은 final, static, abstract 입니다.
상수(Final)
public class Main {
final int x = 10;
final double PI = 3.14;
public static void main(String[] args) {
Main obj = new Main();
obj.x = 50; // 에러 발생: 상수 값 변경 불가
obj.PI = 25; // 에러 발생: 상수 값 변경 불가
System.out.println(obj.x);
}
}
정적(Static)
public class Main {
// Static method
static void myStaticMethod() {
System.out.println("static 메서드는 객체 생성없이 호출 가능");
}
// Public method
public void myPublicMethod() {
System.out.println("public 메서드는 객체 생성 후 호출 가능");
}
// Main method
public static void main(String[] args) {
myStaticMethod(); // static method 호출 가능
// myPublicMethod; // 에러 발생
Main obj = new Main(); // Main의 객체 생성
obj.myPublicMethod(); // public 메서드 호출 가능
}
}
추상(Abstract)
// 추상 클래스
abstract class Main {
public String fname = "KyuSang";
public abstract void study(); // 추상 메서드
}
// 추상 클래스를 상속받은 클래스
public class Student extends Main {
public int graduationYear = 2018;
public void study() { // 추상 메서드를 여기서 정의함
System.out.println("귀차니즘 온");
}
}
public class Second {
public static void main(String[] args) {
// Student 클래스의 객체 생성
Student obj = new Student();
System.out.println("이름: " + obj.fname);
System.out.println("졸업년도: " + obj.graduationYear);
obj.study(); // 추상 메서드 호출
}
}