[Java] Java의 정석 정리 (제어자)

송병훈·2022년 9월 26일
0

자바의 정석

목록 보기
9/15
post-thumbnail

제어자 (Modifiers)

제어자는 접근제어자와 그 외의 제어자로 나뉩니다.

객체지향의 특징 중에 "캡슐화"라고 있어요.
어떤 데이터는 보호할 필요가 있기에
아무나 접근하지 못하도록 제한을 두는 거예요.

캡슐화를 코드에서 구현하는 방법이
접근제어자를 사용하는 겁니다.

접근제어자와 나머지 제어자들 모두
클래스, 변수, 메소드에 붙어서
부가적인 의미를 부여해요.

1. 접근 제어자 (access modifier)

클래스 또는 멤버에 사용되어, 외부로부터의 접근을 제한해요.
"접근" 이 단어에 집중해봐요.

  • public - 모두 접근 가능
  • protected - 동일 패키지, 다른 패키지는 자손클래스에서 접근 가능
  • default - 동일 패키지 안에서만 접근 가능
  • private - 동일 클래스 안에서만 접근 가능

/** domain or DTO **/
public class Member {
    private Long id;    // 시스템이 정하는 임의의 값
    private String name;    // 고객의 이름

    // getter setter
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

나중에 프로젝트를 하게 되면,
domain 혹은 DTO라는 개념을 배우게 될 거예요.

프로젝트에서 자주 사용할 클래스에요.
이 클래스로부터 여러 객체를 생성하죠.

근데 이런 클래스에는 중요한 정보를 담아요.
Id, Password, Phone Number, 등...

중요한 데이터들을 보호하기 위해 변수는 private를 붙여 선언하고
이 데이터를 변경하고 내보내는 getter, setter라는 메소드를 public으로 만들어서
변수에 직접 접근하지 않고, 메소드를 통해 접근해요.

접근제어자를 붙이는 기준은
해당 클래스 or 변수가 어디까지 사용되는 지 보면 됩니다.

  • 이 클래스 or 변수는 이 클래스 안에서만 사용하네? -> private
  • 이 클래스 or 변수는 같은 패키지 안에서만 사용하네? -> default (안 붙임)
  • 이 클래스 or 변수는 다른 패키지의 자손클래스에서도 사용하네? -> protected
  • 이 클래스 or 변수는 다른 패키지에서 막 가져다 사용하네? -> public

생성자에서도 접근제어자를 사용한다고 합니다.
생성자의 접근제어자는 보통 클래스와 일치하게 만듭니다.
생성자에 접근제어자를 사용하면 어떻게 되는 걸까요?
인스턴스의 생성을 제한합니다.


2. 그 외 제어자

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

: static :

'고정된' 이라는 뜻.

이거는 많이 봤죠.
변수, 메소드, 초기화 블럭에 붙죠.
이것들은 프로그램이 실행되어 클래스가 메모리에 로드될 때
메모리 > JVM > Method Area에 같이 올라가요.

그래서 인스턴스를 생성하지 않고도
클래스명.변수명, 클래스명.메소드명()
이렇게 사용할 수 있었죠.

그렇기에 클래스 메소드, 클래스 초기화 블럭에서는
인스턴스 변수를 사용할 수 없는 것이구요.

Method Area 올라간 static 멤버들은 고정이 되어있어,
이 클래스로부터 생성된 다른 모든 인스턴스가 공유하죠.

: final :

'최종, 마지막' 이런 뜻이죠. 그래서

  • 클래스에 붙으면 상속 불가
  • 변수에 붙으면 변경 불가
  • 메소드에 붙으면 오버라이딩 불가

가 돼요.

: abstract :

'추상의, 미완성의'

  • 클래스에 붙으면 클래스 내에 추상 메소드가 있다는 지표에요.
  • 메소드에 붙으면 구현부를 작성하지 않은 메소드를 의미해요.

그러니 추상메소드는 상속받은 클래스에서 오버라이딩을 통해 구현을 해야겠죠.


나머지 제어자들은 시간이 지나면서 알게 될 거예요.
추가로 제어자에는 이런 특징이 있습니다.

  • 접근제어자는 하나만 쓴다.
  • 그 외 제어자는 여러 개를 섞어서 쓸 수 있지만, 아닌 경우도 있다.
    ex)
    • 메소드에 static과 abstract는 함께 사용할 수 없다.
      (static은 구현부가 있는 메소드에서만 사용 가능하다.)
    • 클래스에 abstract와 final을 동시에 사용할 수 없다.
      (추상클래스는 상속을 해야하기 때문이다.)
    • abstract 메소드가 private 일 수 없다.
      (자손클래스에서 오버라이딩 해야 한다.)
    • 메소드에 private와 final을 같이 사용할 필요는 없다.
      (의미가 겹친다.)
profile
성실하고 꼼꼼하게

0개의 댓글