프로젝트를 하면서 public과 private은 확실히 알지만 protected는 써보지 않았고, service단에서 repository를 항상 private final로 불러왔지만 '왜'인지는 알지못해 정리한다.
접근 제한자는 public, protected, private와 같이 세 가지 종류가 있다.
위 세 가지 접근 제한자가 적용되지 않으면 default 접근 제한을 가진다.
클래스에서는 public과 default만 사용할 수 있다. default로 하면 해당 클래스를 같은 패키지내에서만 사용한다는 것이고, public으로 하면 다른 패키지도 허용하는 것이다.
생성자는 다음과 같이 4가지 접근 제한을 모두 가질 수 있다.
public class ClassName {
//public
public ClassName() {...}
//protected
protected ClassName() {...}
//default
ClassName() {...}
//private
private ClassName() {...}
클래스에 생성자를 선언하지 않을 경우 컴파일러에 의해 자동으로 기본 생성자가 추가된다. 이때 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다.
protected 는 같은 패키지에 속하는 클래스에서 생성자 호출이 가능하다. 그리고 다른 패키지여도 해당 클래스의 자식 클래스이면 호출이 가능하다.
필드와 메소드 접근 제한 또한 생성자 접근 제한과 동일하다.
클래스가 생성되지 않으면 함수를 사용할 수 없다. 하지만 꼭 함수가 클래스의 멤버 변수를 이용해 사용하는 것이 아니라 단순 계산 즉, 인스턴스와 관계없는 함수도 있을 수 있다. 이때 static을 사용한다.
클래스가 로딩될 때 static 선언된 자원들은 JVM에서 메모리에 딱 한번 올라간다.
main또한 프로그램 실행시 인스턴스를 생성하지 않고 바로 실행되기에 static이 붙는다.
가독성을 위해 import문에도 쓸 수 있다. 하지만 와일드 카드를 사용하는 것은 별로 권장되지 않는다고 한다.
(공식 가이드 출처)
final은 오직 한 번만 할당할 수 있는 entity를 정의할 때 사용한다. final로 선언된 변수는 항상 같은 값을 가진다.
프로젝트에서 보면 MemberRepository 타입의 memberRepository 객체를 다른 객체로 바꾸지 않기 위해 final을 붙였던 것이다.
객체에 final을 붙이면 객체가 불변한다는 뜻으로 잘못 이해할 수 있는데 인스턴스 자체를 바꾸는 것이 불가능한 것이였고 인스턴스 내부의 값은 변경이 가능하다.
만약 값이 고정적이고 객체마다도 모두 동일한 값이 있다면 static final을 사용해 더 효율적으로 사용이 가능하다.