클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여하며 하나의 대상에 대해 여러가지 제어자를 조합하여 사용할 수 있다.
🔸 접근 제어자 : public, protected, default, private
🔸 그 외 : static, final, abstract, native, trasient, synchronized, volatile, strictfp
‼️ 접근제어자는 4개중 1개만 사용할 수 있다.
🔸 외부에서 접근하지 못하도록 제한하는 역할
- private : 같은 클래스 내에서만 접근이 가능
- (default) : 같은 패키지 내에서만 접근이 가능(default는 보통 생략한다.)
- protected : 같은 패키지이거나 상속관계에 있는 자손클래스는 접근이 가능
- public : 접근 제한 없음
🔸 캡슐화
- 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 외부로부터의 접근을 제한하기 위해서
- 내부적으로만 사용되는 부분을 외부에는 드러내지 않도록 감추기 위해서
➡️ 보통은 멤버변수의 값을 읽어오거나 변경할 때는 getter, setter를 이용한다.
생성자에 접근제어자를 사용할 수도 있다.
final class Singleton{ // private static Singleton singleton = new Singleton(); private singleton(){ ... } // 인스턴스의 생성없이 사용할 수 있어야 하기 때문에 public에 static 제어자를 사용해야한다. public static Singleton getInstance(){ return singleton; } } // --------------- class Test{ public static void main(String args[]){ Singleton sigleton = Singleton.getInstance(); Singleton singleton = new Singleton(); // 에러 : 접근제어자가 private } }
🔸 '클래스의', '공통적인'
🔸 static이 붙은 멤버변수와 메서드 : 인스턴스를 생성하지 않고도 사용이 가능하다.
(static메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.)
🔸 static이 붙은 멤버변수 : 모든 인스턴스에서 공통적으로 사용하는 변수가 되며, 클래스가 메모리에 로드 될 때 생성된다.class Test{ // 클래스 변수 static int width = 10; static int height = 20; // 클래스 초기화 블럭 static { // static변수의 초기화 수행 } // 클래스 메서드 static int max(int a, int b){ return a > b ? a : b; } }
🔸 '변경될 수 없는'
🔸 final이 붙은 변수 : 상수
🔸 final이 붙은 클래스 : 변경할 수 없는 클래스 ➡️ 상속할 수 없다.
🔸 final이 붙은 메서드 : 변경할 수 없는 메서드 ➡️ 오버라이드 할 수 없다.// 조상이 될 수 없는 클래스 final class Test{ // 상수 final int WIDTH = 10; final int HEIGHT = 20; // 값을 변경할 수 없는 메서드 final int max(int a, int b){ return a > b ? a : b; } }
🔸 매개변수를 갖는 생성자를 선언
➡️ 생성자의 매개변수를 제공받아서 인스턴스 생성 시, final이 붙은 멤버변수를 초기화할 수 있다.
➡️ 인스턴스마다 멤버변수의 값을 다르게 할 수 있다.class Test{ final int WIDTH = 10; final int HEIGHT = 20; Test(int width, int height){ WIDTH = width; HEIGHT = height; } // 인스턴스 생성 시 넘겨받는 매개변수로 WIDTH, HEIGHT의 값을 초기화 한다. }
🔸 '추상의', '미완성의'
🔸 abstract가 붙은 클래스 : 추상메서드를 가진 클래스
🔸 abstract가 붙은 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 미완성된 메서드abstract class Test{ abstract void testA(); // 추상메서드 : 구현부가 없음 }
🔸 추상클래스는 미완성된 클래스이므로 인스턴스를 생성할 수 없다.(인스턴스를 생성해봐야 할 수 있는 게 없다.)
➡️ 다른 클래스가 추상클래스를 상속받아서 원하는 메서드만 구현해서 사용할 수 있다는 장점.