접근 제어자
접근 지정자
자바 제어자 modifier
는 클래스, 필드, 메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소다.
접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할을 한다.
멤버 및 생성자의 접근 지정자
멤버 및 생성자에는 public
, protected
, default
(또는 package), private
라는 4가지 종류의 접근 지정자를 사용할 수 있다.
이때 접근 지정자는 필드나 메서드 또는 생성자 앞에 위치한다.
만약 아무것도 작성하지 않으면 default 접근 지정자가 자동으로 설정된다.
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 라고 한다.
정적 멤버의 가장 큰 특징은 객체의 생성 없이 ‘클래스명.멤버명’만으로 바로 사용할 수 있다 는 것이다.
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
변수는 한번 대입된 값을 수정할 수 없다.
즉, 한 번 대입된 값이 최종값이 되는 것이다.
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 메서드는 오버라이딩이 불가능하다.
// 상속이 불가능
public class B extends C {
int a;
final int b = 1;
}
final class C {
}
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개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의해야한다.
public class Cat extends Animal {
@Override
void cry() {
System.out.println("미야용");
}
}
abstract class Animal {
abstract void cry();
}
abstract 제어자의 장점
상속을 하였을때 오버라이딩을 강제함으로 자식 클래스에서 항상 추상 메서드가 정의돼 있다는 것이 보장된다.
댓글남기기