제어자

HYUNBIN CHO·2021년 7월 1일
0

java

목록 보기
17/23
post-thumbnail

🔷 제어자(modifier)란

클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여하며 하나의 대상에 대해 여러가지 제어자를 조합하여 사용할 수 있다.
🔸 접근 제어자 : 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
    }
}

🔷 그 외

🔹 1. static

🔸 '클래스의', '공통적인'
🔸 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;
    }
}

🔹 2. final

🔸 '변경될 수 없는'
🔸 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의 값을 초기화 한다.
}

🔹 3. abstract

🔸 '추상의', '미완성의'
🔸 abstract가 붙은 클래스 : 추상메서드를 가진 클래스
🔸 abstract가 붙은 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 미완성된 메서드

abstract class Test{
    abstract void testA(); // 추상메서드 : 구현부가 없음
}

🔸 추상클래스는 미완성된 클래스이므로 인스턴스를 생성할 수 없다.(인스턴스를 생성해봐야 할 수 있는 게 없다.)
➡️ 다른 클래스가 추상클래스를 상속받아서 원하는 메서드만 구현해서 사용할 수 있다는 장점.

profile
백견이 불여일타

0개의 댓글

관련 채용 정보