Java

Java 제어자

코드깎는머슴 2024. 2. 25. 15:06
728x90
반응형

제어자(modifier)

 

접근 제어자

public      : 제한 없음
protected   : 같은 패키지 + 다른 패키지의 자손 클래스
default     : 같은 패키지
private     : 같은 클래스

대상        사용 가능한 제어자

클래스      public, default, final, abstract
메서드      public, protected, default, private, final, abstract, static
멤버변수    public, protected, default, private, final, static
지역변수    final

    

1. 외부에 불필요한, 내부적으로만 사용되는 부분을 감추기 위해 사용

만일 메서드 하나를 변경해야 한다고 할 때, 접근 제어자가 public이라면 변경 후 오류가 없는 지 테스트해야 하는 범위가 넓다.

그러나 default라면 패키지 내부만 확인하면 된다.

    

2. 데이터의 보호

    생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다.

    자손클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야만 하는데, 

    생성자의 접근 제어자가 private이므로 자손클래스에서 호출이 불가능
    그래서 클래스 앞에 final을 추가하여 상속할 수 없는 클래스라는 것을 알리는 것이 좋다.

    

접근 제어자는 한 번에 하나만 사용할 수 있다.

 public과 private를 함께 사용할 수 없다는 뜻

그 외
static, final, abstract, native, transient, synchronized, volatile, strictfp

    

final

클래스      변경, 확장할 수 없는 클래스가 되서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드      오버라이딩 할 수 없게 됨

생성자를 이용한 초기화가 가능하다

일반적으로 상수는 선언과 초기화를 동시에 하지만 인스턴스 변수의 경우 생성자에서 초기화가 가능하다
성별같은 값은 절대 안바뀌는데 태어나기 전까지 남, 여를 알 수 없기 때문에 이럴 때 이용
    

abstract

클래스      클래스 내에 추상 메서드가 포함되어 있음
메서드      선언부만 작성하고 구현부는 작성하지 않은 추상메서드

드물지만 추상메서드가 없는 클래스, 완성된 클래스도 abstract를 붙이는 경우가 있다

public abstract class WindowAdapter{
    implements WindowListener ~~ {
        public void windowOpened(WindowEvent e){
            // 빈내용
        }
        public void windowClosing(WindowEvent e){
            // 빈내용
        }

        ~~
    }
}


이런 클래스는 인스턴스를 생성해봐야 할 수 있는게 없다.

그래서 인스턴스를 생성하지 못하게 클래스 앞에 abstract를 붙인 것이다.

이 자체로는 쓸모 없지만, 다른 클래스가 이 클래스를 상속받고 원하는 일부만 오버라이딩해도 된다는 장점이 있다. 

만약 이 클래스가 없다면 아무 내용도 없는 메서드를 잔뜩 오버라이딩 해야 한다

    

제어자 주의사항

        1. 메서드에 static과 abstract를 함께 사용할 수 없다
            static은 몸통이 있는 메서드에만 사용할 수 있기 때문

        2. 클래스에 abstract와 final을 동시에 사용할 수 없다
            클래스의 final은 확장할 수 없다는 의미, abstract은 상속을 통해 완성된다는 의미. 서로 모순됨

        3. abstract메서드의 접근제어자가 private일 수 없다
            abstract메서드는 자손에서 구현해줘야 하는데 private는 자손에서 접근할 수 없기 때문

        4. 메서드에 private와 final을 같이 사용할 필요 없다
            private인 메서드는 오버라이딩 될 수 없기 때문. 둘 중 하나만 사용해도 의미가 충분하다. 
            근데 상속 불가의 의미를 뚜렷히 하기 위해 final을 사용하자

728x90
반응형