접근 제어자
접근 지정자
자바 제어자 modifier
는 클래스, 필드, 메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소다.
접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할을 한다.
멤버 및 생성자의 접근 지정자
멤버 및 생성자에는 public
, protected
, default
(또는 package), private
라는 4가지 종류의 접근 지정자를 사용할 수 있다.
이때 접근 지정자는 필드나 메서드 또는 생성자 앞에 위치한다.
만약 아무것도 작성하지 않으면 default 접근 지정자가 자동으로 설정된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test {
public int a;
protected int b;
default int c; // default 접근 지정자 자동 설정
private int d;
public void abc() {
}
protected void bcd() {
}
void cde() {
} // default 접근 지정자 자동 설정
private void def() {
}
}
접근 지정자 | 사용가능 범위 |
---|---|
public | 동일 패키지의 모든 클래스 + 다른 패키지의 모든 클래스 |
protected | 동일 패키지의 모든 클래스 + 다른 패키지의 자식 클래스 |
default | 동일 패키지의 모든 클래스 |
private | 동일 클래스 |
static 제어자
static
은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 제어자다.
이제까지 클래스의 멤버를 다른 클래스 내에서 사용하기 위해서는 가장 먼저 클래스의 객체를 생성해야 한다고 했다.
이렇게 객체 안에 있을 때 사용할 수 있는 상태가 되는 멤버를 인스턴스 멤버(instance member) 라고 한다.
쉽게 말해, 인스턴스 멤버는 멤버 앞에 static
이 붙어 있지 않은 것을 말한다.
반면 앞에 static
이 붙어 있는 멤버를 정적 멤버 static member 라고 한다.
정적 멤버의 가장 큰 특징은 객체의 생성 없이 ‘클래스명.멤버명’만으로 바로 사용할 수 있다 는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A {
int a = 1;
static int b = 2;
public static void staticMethod() {
System.out.println("hello");
}
public static void main(String[] args) {
// 객체 생성없이 사용가능하다
A.staticMethod();
System.out.println("b1 = " + A.b);
}
}
final 제어자
fianl
제어자는 필드, 지역변수, 메서드, 클래스 앞에 위치할 수 있으며, 어디에 위치하느냐에 따라 의미가 다르다.
final 변수
final
제어자는 변수를 선언할 때만 지정할수 있으며, fial
변수는 한번 대입된 값을 수정할 수 없다.
즉, 한 번 대입된 값이 최종값이 되는 것이다.
1
2
3
4
5
6
7
8
9
10
11
public class B {
int a;
final int b = 1;
public static void main(String[] args) {
B b1 = new B();
b1.a = 1;
b1.b = 2; // 대입 불가능
}
}
final 메서드와 final 클래스
final 메서드, 클래스도 각각 최종 메서드 클래스의 의미를 지닌다.
그러므로 final 클래스는 상속이 불가능 하며 final 메서드는 오버라이딩이 불가능하다.
1
2
3
4
5
6
7
8
// 상속이 불가능
public class B extends C {
int a;
final int b = 1;
}
final class C {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class B extends C {
@Override
void overRidingOk() {
super.overRidingOk();
}
// 오버라이딩이 불가능하다.
@Override
void overRidingNotOk() {
super.overRidingOk();
}
}
class C {
void overRidingOk() {
}
final void overRidingNotOk() {
}
}
abstract 제어자
abstract
의 사전적 의미는 추상적인이다. 추상적은 말 그대로 ‘구체적이지 않다’ 이다.
쉽게 말해서 아직 무슨 기능을 정의할지 정해지지 않은 미완성이라 생각하면 된다.
추상 메서드를 1개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의해야한다.
1
2
3
4
5
6
7
8
9
10
11
public class Cat extends Animal {
@Override
void cry() {
System.out.println("미야용");
}
}
abstract class Animal {
abstract void cry();
}
abstract 제어자의 장점
상속을 하였을때 오버라이딩을 강제함으로 자식 클래스에서 항상 추상 메서드가 정의돼 있다는 것이 보장된다.
댓글남기기