자바의 패키지와 접근 지정자

7603 단어 JavaJava

패키지(package)

• 서로 관련있는 클래스 파일(컴파일된 .class파일)을 저장하는 디렉토리
• 자바 응용 프로그램은 하나 이상의 패키지로 구성된다.

접근 지정자

private : 외부로부터 완벽 차단
디폴트(접근지정자를 생략한 경우) : 동일 패키지에는 허용
protected : 동일 패키지와 자식 클래스에 허용
public : 모든 클래스에 허용

• 클래스나 일부 멤버를 다른 클래스에서 접근하도록 허용하기 위해서 사용
• 객체 지향 언어의 캡슐화는 멤버를 보호하는 것이다.
-> 접근 지정자는 캡슐화에 묶여있는 객체 보호의 일부를 해체할 목적으로 사용한다.

멤버 접근 지정

public 멤버

• 패키지에 관계 없이 모든 클래스에게 접근 허용

private 멤버

동일 클래스 내에서만 접근 허용
• 상속 받은 서브 클래스에서도 접근 불가능

protected

• 같은 패키지 내의 모든 클래스에게 접근 허용
• 상속 받은 서브 클래스는 접근 허용
• 상속 받은 서브 클래스가 다른 패키지에 있어도 접근 가능

디폴트(default) 멤버

• 같은 패키지 내의 다른 클래스에게 접근 허용

static

non-static 멤버의 특성

• 멤버들은 객체마다 독립적으로 별도로 존재한다. (인스턴스 멤버)
• 필드와 메소드는 객체 생성 후 비로소 사용이 가능하다.
• 멤버들은 다른 객체에 의해 공유되지 않는다.
• 멤버는 객체 내에 각각의 공간을 유지한다.
• 객체가 사라지면 멤버도 사라진다.

static 멤버란?

• 객체마다 생기는 것이 아니라 클래스마다 하나만 생성된다.
클래스 멤버라고도 한다.
• 객체를 생성하지 않고도 사용이 가능하다.(객체가 생성되기 전에 이미 생성됨)
• 클래스가 로딩될 때 공간을 할당받는다.
• 동일한 클래스의 모든 객체가 공유한다.
• 객체가 사라져도 멤버는 사라지지 않는다.
• 프로그램이 종료될 때 사라진다.

static 활용

1. 전역 변수와 전역 함수를 만들 때 활용
• 전역 변수와 전역 함수는 static으로 클래스에 작성
• 예) Math 클래스 (모든 필드와 메소드가 static으로 선언)

public class Math {
    public static int abs(int a);
    public static double cos(double a);
    public static int max(int a, int b);
    public static double random();
}

2. 공유 멤버를 작성할 때 활용
• static 필드나 메소드는 하나만 생성한다.
• 클래스의 모든 객체들이 공유하여 사용

static 메소드의 제약 조건

static 메소드는 non-static 멤버에 접근할 수 없다.

• static 메소드는 객체가 생성되지 않아도 실행될 수 있지만
• non-static 메소드는 객체가 생성되어야 사용할 수 있기 때문
• non-static 메소드는 static 멤버를 사용할 수 있다.

static 메소드는 this를 사용할 수 없다.

• this는 현재 객체를 가리키는 키워드이다.
• static 메소드는 객체가 생성되지 않아도 실행할 수 있기 때문이다.

final

final 클래스

• 클래스 상속 불가능

final class FinalClass {
    ........
}

class SubClassOfFinalClass extends FinalClass {
    ........  // 컴파일 오류 발생!
}

final 메소드

• 오버라이딩 불가능

public class SuperClass {
    protected final int finalMethod() {
        .....
    }
}

class SubClass extends SuperClass {
    @Override
    protected int finalMethod() {
        .... // 컴파일 오류 발생!
    }
}

final 필드

• 상수를 선언할 때 사용
• 상수 필드는 선언 시에 초기 값을 초기화하여야 한다.
• 상수는 실행 중에는 변경할 수 없다.

class Circle {
    public static final double PI = 3.14;
    
    void changePi() {
        PI = 3.1415; // 컴파일 오류 발생!
    }
}

좋은 웹페이지 즐겨찾기