출처 및 아주 좋은 링크 : 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을 이용하면 프로그램 시작 시 단 한번만 사용되기 때문에 메모리적인 이득이 있다.

그냥 변하지 않을 값인데 굳이 많이 생성될 수도 있는 인스턴스의 위험부담을 안을 필요가 없다.

+ Recent posts