[자바] 접근 제한자와 static/final정리

박지운·2023년 8월 6일
0

자바 꽉 자바

목록 보기
6/12

프로젝트를 하면서 public과 private은 확실히 알지만 protected는 써보지 않았고, service단에서 repository를 항상 private final로 불러왔지만 '왜'인지는 알지못해 정리한다.

접근 제한자

접근 제한자는 public, protected, private와 같이 세 가지 종류가 있다.

  • public : 외부 클래스가 자유롭게 사용
  • protected : 같은 패키지 또는 자식 클래스
  • private : 외부에서 사용 불가능

위 세 가지 접근 제한자가 적용되지 않으면 default 접근 제한을 가진다.

  • default : 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 한다.

클래스 접근 제한

클래스에서는 public과 default만 사용할 수 있다. default로 하면 해당 클래스를 같은 패키지내에서만 사용한다는 것이고, public으로 하면 다른 패키지도 허용하는 것이다.


생성자 접근 제한

생성자는 다음과 같이 4가지 접근 제한을 모두 가질 수 있다.

public class ClassName {
	//public 
    public ClassName() {...}
    //protected
    protected ClassName() {...}
    //default
    ClassName() {...}
    //private
	private ClassName() {...}

클래스에 생성자를 선언하지 않을 경우 컴파일러에 의해 자동으로 기본 생성자가 추가된다. 이때 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다.
protected 는 같은 패키지에 속하는 클래스에서 생성자 호출이 가능하다. 그리고 다른 패키지여도 해당 클래스의 자식 클래스이면 호출이 가능하다.

필드와 메소드 접근 제한 또한 생성자 접근 제한과 동일하다.


static

클래스가 생성되지 않으면 함수를 사용할 수 없다. 하지만 꼭 함수가 클래스의 멤버 변수를 이용해 사용하는 것이 아니라 단순 계산 즉, 인스턴스와 관계없는 함수도 있을 수 있다. 이때 static을 사용한다.
클래스가 로딩될 때 static 선언된 자원들은 JVM에서 메모리에 딱 한번 올라간다.
main또한 프로그램 실행시 인스턴스를 생성하지 않고 바로 실행되기에 static이 붙는다.

  • 장점
    • 공용 자원으로 쓰여 메모리를 아낄 수 있다.
    • 속도가 빠르다.(객체 생성 시간이 없기 때문에)
  • 단점
    • 미리 메모리를 할당 받는 것이기에 무분별한 사용은 오히려 낭비가 될 수 있다.
    • static method에서는 static 변수만 사용이 가능하다.

가독성을 위해 import문에도 쓸 수 있다. 하지만 와일드 카드를 사용하는 것은 별로 권장되지 않는다고 한다.
(공식 가이드 출처)

final

final은 오직 한 번만 할당할 수 있는 entity를 정의할 때 사용한다. final로 선언된 변수는 항상 같은 값을 가진다.
프로젝트에서 보면 MemberRepository 타입의 memberRepository 객체를 다른 객체로 바꾸지 않기 위해 final을 붙였던 것이다.
객체에 final을 붙이면 객체가 불변한다는 뜻으로 잘못 이해할 수 있는데 인스턴스 자체를 바꾸는 것이 불가능한 것이였고 인스턴스 내부의 값은 변경이 가능하다.

만약 값이 고정적이고 객체마다도 모두 동일한 값이 있다면 static final을 사용해 더 효율적으로 사용이 가능하다.


출처 :
혼공
명월 일지 블로그
로춘남 티스토리

profile
앞길막막 전과생

0개의 댓글