본문 바로가기
프로그래밍 언어/JAVA

[JAVA] 접근 제어자 & 그 외 제어자

by 느링 2017. 8. 4.

제어자(modifier)란?

각 변수들이 사용됨에 있어서 어느 범위까지 사용 가능한지 정해주는 입니다.

클래스, 변수, 메소드의 선언부에 사용되어 접근 및 사용 범위를 결정합니다.

제어자는 크게 접근제어자 그 외 제어자로 분류되며,

하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나 접근 제어자는 단 하나만 사용할 수 있습니다.

 

 

1. 접근제어자

멤버 또는 클래스에 사용되어, 외부로부터의 접근을 제한합니다.

특히 생성자에는 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있습니다.

접근 제어자를 사용하는 이유

→ 외부로부터 데이터를 보호하기 위함이며 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서입니다.

 

① public - 전체에서 접근 가능합니다. ( 접근 제한이 전혀 없습니다.)

② protected - 같은 패키지, 그리고 다른 패키지의 자손클래스에서 접근 가능합니다. (상속관계에서 사용가능)

③ [default] - 따로 접근제어자를 지정하지 않고 기본상태일 때를 의미합니다.

다른 패키지의 접근이 불가능하며 상속관계여도 안됩니다. 같은 패키지 안에서만 접근 가능합니다.

④ private - 같은 클래스 안에서만 접근 가능합니다.

→ private는 중요한 data의 경우 외부에 노출시키지 않기 위해 캡슐화 하는데 사용되는 경우가 많습니다.

캡슐화란? 외부의 영향으로 class의 중요한 변수 또는 메소드가 변형 또는 노출되는 것을 막기 위한 방법입니다.

보안성을 필요로하는 프로그램에선 캡슐화란 필수요소입니다.

(data가 제 3자의 접근으로 부터 변환/변조되지 않도록 무결성을 보장하기 위함입니다.)

 

 

2. 그 외 제어자

① static

멤버변수, 메소드, 초기화 블럭에서 사용 가능합니다.

<예제 1>

 

② final

상수, 한번 선언하면 값을 바꿀 수 없습니다.

클래스, 멤버변수, 메소드, 지역변수에서 사용 가능합니다.
- 변수 : 변수 초기화 이후 값을 바꿀 수 없는 변수로 만듦
- 메소드 : 변경 할 수 없는 메소드
- 클래스 : 확장 될 수 없는 클래스(final클래스는 조상 클래스가 될 수 없다.)

 

 

final이 붙은 변수는 상수이므로 보통은 선언과 초기화를 동시에 하지만, 인스턴스변수의 경우 생성자에서 초기화 할 수 있다.

 

③ abstract

딱히 기능을 갖고 있는 제어자는 아니고, 추상클래스 혹은 추상메소드임을 선언하는 것입니다.

클래스, 메서드에서 사용 가능합니다.

{ } ← 없어야 하며, 자식 클래스에서 반드시 기술해 줘야 합니다.

메서드에서 쓰일 때는 접근 제어자는 public과 protected만 사용 가능하며, 상속을 위해 쓰입니다.

 

 

추상 클래스 & 추상 메소드

추상 클래스

- 그 외 제어자

- 하나 이상의 추상메소드(미완성 메소드)를 포함하고 있는 클래스

- 클래스가 설계도라면 추상클래스는 미완성 설계도(미완성 설계도라서 직접 객체 생성 불가능합니다)

- 추상 클래스에서 정의된 추상적인 기능은 자손클래스에서 상속 받아서 상세 구현(오버라이딩)

- 추상 클래스 안에 하나 이상의 추상 메소드가 존재해야 한다.

 

추상 메소드

- 추상 메소드는 { } 중괄호를 쓰지 않습니다.

 

**

1. 메소드에 static과 abstract를 함께 사용할 수 없습니다.

- static메소드는 몸통(구현부)이 있는 메소드에만 사용할 수 있기 때문입니다.

2. 클래스에 abstract와 final을 동시에 사용할 수 없습니다.

- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서

완성되어야 한다는 의미이므로 서로 모순되기 때문입니다.

3. abstract메소드의 접근제어자가 private일 수 없습니다.

-abstract메소드는 자손클래스에서 구현하기 위해 접근해야 하기 때문입니다.

4. 메소드에 private과 final을 같이 사용할 필요는 없습니다.

-접근 제어자가 private인 메소드는 오버라이딩될 수 없기 때문입니다. 이 둘 중 하나만 사용해도 충분합니다.