OOP 2.4 제어자

MMM·2023년 7월 20일
post-thumbnail

제어자

  • 접근 제어자 : public, protected, default, private
  • 그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 하나의 대상에 대해 여러 제어자 조합해 사용 가능 (접근 제어자는 하나만 선택해서 사용)
  • 순서는 상관없지만 주로 접근 제어자를 제일 왼쪽에 놓는 경향

static - 클래스의, 공통적인

  • 클래스변수(static 멤버변수)는 인스턴스에 관계없이 같은 값 : 하나의 변수를 모든 인스턴스가 공유하기 때문
    • cf) 인스턴스 변수 : 하나의 클래스로부터 생성되었더라도 각기 다른 값
  • static 사용 가능한 곳 : 멤버변수, 메서드, 초기화 블럭
  • static이 붙은 멤버변수, 메서드, 초기화 블럭은 인스턴스 생성 없이 사용 가능 : 인스턴스가 아닌 클래스에 관계된 것이기 때문
  • 인스턴스 메서드 vs. static 메서드 : 메서드 내에서 인스턴스 멤버를 사용하는가?의 차이
    • 인스턴스 멤버를 사용하지 않는다면 static 메서드 선언을 고려 : 더 편리하고 속도도 빠르다

final - 마지막의, 변경될 수 없는

  • final 사용 가능한 곳 : 클래스, 메서드, 멤버변수, 지역변수
  • 생성자를 이용한 final 멤버 변수의 초기화

    • final이 붙은 변수 = 상수 -> 일반적으로 선언과 동시에 초기화
      but 인스턴스 변수는 생성자에서 초기화할 수 있음

    • 클래스 내에 매개변수를 갖는 생성자를 선언 -> 인스턴스 생성 시 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 것

    • 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능

      class Card {
      
      static final int PATTERN_NUMBERS = 4;
      static final int CARDS_PER_PATTERN = 13;
      final int pattern;	// final 멤버 변수 선언
      final int number;
      
      Card(int pattern, int number) {
          this.pattern = pattern;		// final 멤버 변수 초기화
          this.number = number;
      	}
      }

abstract - 추상의, 미완성의

  • 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용

  • abstract 사용 가능한 곳 : 클래스, 메서드

  • 추상 클래스 : 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도'
    -> 인스턴스 생성 불가

    abstract class AbstractTest {   // 추상 클래스 (추상 메서드를 포함한 클래스)
    	abstract void move();       // 추상 메서드 (구현부 없는 메서드)
     }

접근 제어자

  • 접근 제어자 사용 가능한 곳 : 클래스, 멤버변수, 메서드, 생성자

  • private : 같은 클래스 내에서만 접근

  • default : 같은 패키지 내에서만 접근

  • protected : 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근

  • public : 접근 제한 없음

  • 대상에 따라 사용할 수 있는 접근 제어자

  • 접근 제어자를 사용하는 이유 : 캡슐화

    • 외부로부터 데이터 보호
    • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
  • 하나의 소스파일(*.java)에는 public 클래스가 단 하나만 존재 가능 + 소스파일의 이름은 반드시 public 클래스의 이름과 동일해야 함

  • 생성자의 접근 제어자

    • 생성자에 접근 제어자 사용 => 인스턴스의 생성 제한할 수 있음.

    • 보통 생성자 접근 제어자는 클래스 접근 제어자와 동일 but 다르게 지정 가능함

      • 생성자 접근 제어자를 private으로 지정 => 외부에서 생성자 접근 불가 => 인스턴스 생성 불가 but 클래스 내부에서는 인스턴스 생성 가능
        따라서 인스턴스를 생성 및 반환해주는 public 메서드(public & static) 제공 => 외부에서 인스턴스 사용하도록 할 수 있음
      
      public class SingletonTest {
      
             final class Singleton{
      
                 private static Singleton s = new Singleton();   // (1)
      
                 private Singleton() {
                     // ...
                 }
      
                 public static Singleton getInstance() {		// (2)
                     if (s == null)
                         s = new Singleton();
      
                     return s;
                 }
             }
      
             class SingletonTest {
                 public static void main(String args[]) {
         //            Singleton s = new Singleton();      // (3)
                     Singleton s = Singleton.getInstance();
                 }
             }
      
         }
      
      • (1) - getInstance()에서 사용될 수 있도록 인스턴스가 미리 생성되어야 함 -> static
      • (2) - 인스턴스를 생성하지 않고도 호출할 수 있어야 함 -> static
      • (3) - 에러 : Singleton() has private access in Singleton
    • 생성자를 통해 직접 인스턴스를 생성하지 못하게 하고 / public 메서드를 통해 인스턴스에 접근하게 함 -> 사용할 수 있는 인스턴스의 개수를 제한할 수 있음

    • 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없음 : 자손 클래스의 인스턴스를 생성할 때 조상 클래스의 생성자를 호출해야함 but 생성자의 접근 제어자가 private이면 자손 클래스에서 호출할 수 없기 때문
      -> 클래스 앞에 final을 추가하여 상속할 수 없는 클래스라는 것을 알리는 것이 좋다


제어자의 조합

  • 대상에 따라 사용할 수 있는 제어자
  • 제어자를 조합해 사용할 때 주의해야 할 사항
    1) 메서드static과 abstract 동시 사용 불가
    • static 메서드는 몸통이 있는 메서드에만 사용 가능!
    2) 클래스abstract, final 동시 사용 불가
    • 클래스에 사용되는 final은 클래스를 확장할 수 없다는 뜻
      vs. abstract는 상속을 통해서 완성되어야 한다는 뜻
      -> 모순 발생
    3) abstract 메서드의 접근 제어자가 private일 수 없다
    • abstract 메서드 -> 자손 클래스에서 구현 필요
      but 접근 제어자가 private이면 자손 클래스에서 접근 불가
    4) 메서드에 private과 final을 동시에 사용할 필요는 없음
    • 접근 제어자가 private이면 오버라이딩 될 수 없으므로 둘 중 하나만 사용해도 ㅇㅋ



아래로는 여담.
반나절동안 블로그에 정리하면서 느낀 건데, ubuntu는 엑셀 대신 LibreOffice Calc를 제공하고 있고 웬만한 단축키와 기능들이 다 동일하지만 가장 중요한 알트 단축키와 동일한 기능을 하는 키가 없는 건지 안 보이는 건지 그렇다.. 생산성이 확 떨어져서 못생긴 기본 표만 사용하고 있었는데, 문득 미리 캔버스가 생각나서 들어가보니 훨씬 가독성 좋은 표를 만들어준다. 정리할 때 표가 필요하다면 한동안 미리 캔버스를 사용할 것.... 아니 근데 진짜 왜 알트 단축키가 없냐.... 정확히 말하면 메뉴에 바로 단축키가 보이는 경우엔 동시에 눌러서 열 수 있는데 이러려면 내가 일일이 메뉴탭을 돌아다녀야 한단 말이지.. 는 근데 보니까 엑셀과 달리 탭마다 아이콘들이 변하는 구조가 아니다. 그래서 없나보네...하... 우분투에서는 그냥 미리캔버스 쓰자 ㅠㅠ

profile
과거의 내가 현재의 나보다 똑똑할 때가 있다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 잘 읽었습니다, 고맙습니다!

답글 달기