출처 및 아주 좋은 링크 : https://www.tcpschool.com/java/java_modifier_accessModifier
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
제어자
제어자는 클래스 내부의 데이터를 보호하기 위해 클래스와 클래스 멤버에 사용하는 키워드로 접근 제어자와 기타 제어자가 있다.
접근 제어자(access modifier) : (다른 클래스에서의) 접근 레벨을 제어.
기타 제어자(non-access modifier): 기타 다른 좋은 역할을 수행
접근 제어자
접근 제어자는 public, protected, default(따로 접근 제어자를 선언하지 않았을 시), private 4가지가 있다.
위 표로 말끔하게 정리된다.
public
해당 클래스를 사용하는 어디에서나 접근이 가능
protected
같은 클래스 + 같은 패키지 + 상속받은 자식 클래스(같은 패키지가 아니더라도) 에서 접근이 가능
default
같은 클래스 + 같은 패키지에서만 접근이 가능. 위 표에서는 no modifier로 된 부분으로 따로 접근 제어자를 사용하지 않으면 자동으로 적용이 된다.
private
같은 클래스에서만 접근이 가능.
알고 나면 간단하다. 이모저모를 써보자면
어떤 클래스의 private 멤버는 public 을 통해서만 접근이 가능하기 때문에 private + public 조합이 많이 쓰인다(ex. getter, setter)
접근 제어자는 한번의 선언에서 하나만 사용할 수 있다. public protected int name;는 않뒈요.
기타 제어자
기타 제어자는 이것저것 하는 친구들이다.
final, static, abstract, transient, synchronized, volatile 이렇게 있는데 앞 세가지 친구만 다루겠다. 초보라 죄송하다.
final
final 제어자는 말 그대로 클래스, 멤버, 메소드를 최종 버전, 즉 변경 불가능하게 만들어버린다.
필드와 전역 변수에 사용하면 constant 상수로 만들어 버리고
메소드에 사용하면 overriding이 불가능하게 되고
클래스에 사용하면 상속을 불가능하게 만든다
static
static은 특정 멤버를 모든 객체(클래스)에서 공유하고 싶을 때 사용한다.
즉 static 제어자를 가지는 멤버는 해당 클래스의 모든 인스턴스에서 접근이 가능하며.
따로 객체를 생성(new)하지 않아도 클래스명.멤버 로 접근이 가능하다.
static 멤버는 프로그램 시작 시 단 한번만 생성되며. 메모리 영역에서(code, data, heap, stack 구조로 봤을 때) data영역에 들어간다.
또한 garbage collector의 관리도 받지 않는다.
abstract
이 친구는 추상클래스, 추상메소드를 만들 때 사용된다.
abstract 제어자를 사용한 메소드에는 실제 로직이 존재하지 않고 선언만 해준다. abstract void eat(); 이런 식으로
자식 클래스에게 어떤 메소드를 강제적으로 구현하게끔 할 때 사용하면 좋다.
보너스 부록 private + static + final
절대 변하징 않을 상수를 선언할 때 private static final ~~ 조합을 많이 볼 수 있다.
생각해보면 private final만 해도 변경 불가능 하고 든든한 접근 제어자 private도 함께하니 보안적인 측면에서 봤을 때 문제가 없어 보인다.
실제로도 보안은 탄탄하지만 static을 이용하면 프로그램 시작 시 단 한번만 사용되기 때문에 메모리적인 이득이 있다.
그냥 변하지 않을 값인데 굳이 많이 생성될 수도 있는 인스턴스의 위험부담을 안을 필요가 없다.
'JAVA' 카테고리의 다른 글
[JAVA] 동일성(identity)와 동등성(equality) (feat. ==, equals, hashcode()) (1) | 2023.12.06 |
---|