2 분 소요

접근 지정자

자바 제어자 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 제어자의 장점

상속을 하였을때 오버라이딩을 강제함으로 자식 클래스에서 항상 추상 메서드가 정의돼 있다는 것이 보장된다.

참조

Do it! 자바 완전 정복

댓글남기기