본문 바로가기

Java

Java의 패키지와 접근 지정자

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

자바의 패키지


자바에서 패키지란, 관련이 있는 .class파일 (컴파일된 것)을 저장하는 폴더입니다.

간단히 말해서, 자바에서는 폴더를 패키지라고 말합니다.

 

한 패키지에는 협업을 할 가능성이 높은 패키지들이 모여 있습니다. (그렇게 구성을 하게 됩니다.)

자바 응용 프로그램은 한 개 이상의 패키지로 구성되어 있으며,

프로젝트에서 기반이 되는 폴더인 src 이하 폴더로 구성되게 됩니다.

 

package exam;

public class PackageExam {

}

위 예시처럼 소스코드 최 상단에 어떤 package에 속해있는지 표기하게 됩니다.

 

자바에서는 패키지가 다른데 이름이 같은 클래스가 존재할 수 있습니다.

그래서 클래스 이름을 표현할 때 패키지까지 붙여주게 됩니다.

위 예시에서 PackageExam 클래스는 exam.PackageExam이 되는 것입니다.

 

또 한 가지 주의할 것이 있습니다. 아래를 보겠습니다.

package exam.inexam;

public class InPackageExam {

}

InPackageExam 클래스는 exam폴더 하위의 inexam폴더 안에 존재합니다.

PackageExam 클래스는 exam폴더 하위에 존재합니다.

 

exam폴더가 inexam폴더를 하위 폴더로 갖고 있다고 해서 종속되는 패키지가 아닙니다.

exam패키지와 exam.inexam패키지는 전혀 다른 패키지입니다.

 

패키지 기본에 대해서 알아보았습니다.


 

접근 지정자


자바의 접근 지정자에는 4가지 종류가 있습니다.

private -> default -> protected -> public

순서대로 점점 접근 범위가 커집니다.

 

우선 간단하게 정리하면

private는 선언된 클래스 내부

default는 선언된 패키지 내부 (선언 방법은 접근 지정자를 붙이지 않는 것)

protected는 선언된 패키지 내부 + 외부에서 상속받은 클래스 내부

public은 어디에서든 접근이 가능하다.


그렇다면 '접근' 지정자에서 접근은 무엇을 의미할까요?

접근이란 식별자를 사용할 수 있는 것을 의미합니다.

식별자란 무엇이었죠? 네 맞습니다. 변수 이름이었습니다.

 

접근이란 그 이름으로 해당 클래스, 메서드, 필드에 접근하는 것을 의미합니다.

간단한 예시로 아래 클래스에서

AccessExam accessExam = new AccessExam();
accessExam.i;
accessExam.print();

이처럼 인스턴스를 생성하고, 필드에 접근하고, 메서드를 호출하는 것. 그 자체가 접근입니다.


자바에서 접근 지정자는 기본적으로 3곳에 붙을 수 있습니다.

public class AccessExam {

    private int i;
    
    public void print() {
        
    } 
}

1. 클래스 앞

public / default 두 개 밖에 올 수 없음

public class는 어디에서든 접근이 가능한 클래스

default class는 같은 패키지 내부에서만 접근이 가능한 클래스

 

2. 필드 (멤버 변수 but not 지역변수)

private / default / protected / public 모두 올 수 있음

위에서 설명한 대로

 

3. 메서드 (함수)

private / default / protected / public 모두 올 수 있음

위에서 설명한 대로

 

여기까지 접근 지정자의 개념에 대해서 알아보았습니다.


 

사용법


앞에서 접근 지정자에 대한 개념을 알아보았습니다.

이제는 어떻게 사용하는 것이 좋은지 알아보겠습니다.

 

1. 기본, 공통 사용법

private -> default -> protected -> public

접근 지정자에 대해서 처음 알아보고 코딩을 하려고 하면 감이 오지 않습니다.

경험을 통해 실력이 쌓이는 것인데, 경험이 없기 때문입니다.

그럴 때는 그냥 모든 접근 지정자를 작은 접근 범위에서 시작하여,

꼭 필요하다 싶을 때 큰 범위로 넓혀가면 됩니다.

어차피 넓힐 건데 뭐하러 작은 것부터 시작하냐?라고 의문을 가질 수 있습니다.

그러나 처음부터 큰 접근 범위에서 시작한다면 패키지를 넘어 이곳저곳에서 접근이 이뤄지고

나중에 좁은 범위의 접근 지정자로 바꾸려고 할 때 코드를 많이 고쳐야 할 것입니다.

클래스가 한 개 두 개밖에 없는 작은 코드에서는 가능할지 몰라도

수백수천 개의 클래스가 있는 거대한 프로그램에서 접근 지정자를 낮추는 것은 정말 어려울 것입니다.

그리고 작은 것에서부터 시작하여 넓혀가게 된다면, 

나중에 전부 완성이 되었을 때 각각 특성에 맞는 접근 지정자를 갖고 있을 것입니다.

이것을 기반으로 데이터를 쌓고 나중에 코딩할 때 활용할 수 있습니다.

 

2. 필드

필드는 그냥 private 접근 지정자를 사용한다.라고 생각하면 됩니다.

객체 지향의 특성 중 캡슐화라는 특성이 있습니다. 내부 정보를 외부에서 접근하지 못하도록 한다는 특성이 캡슐화의 한 부분인데요, 이것을 실현하는 행위 중 하나가 private 필드를 사용하는 것입니다.

그러나 private 변수를 사용하면 외부에서 그 변수의 값을 읽을 수도, 바꿀 수도 없습니다.

그래서 사용하는 것이 getter/setter 메서드입니다.

getter로 private 변수의 값을 얻어오고, setter로 private 변수의 값을 바꿀 수 있게 합니다.

그러면 어차피 값 얻어오고 바꾸고 다 할 수 있게 해 주면서 뭐하러 메서드를 두 개나 만드냐?라고 생각할 수 있습니다.

그러나 getter setter는 각각 분리된 메서드이므로 각각 따로 접근 지정자를 지정하여

꼭 필요한 시점에만 사용되게 할 수 있습니다.

 

3. 메서드

만약 하나의 큰 메서드가 여러 개의 작은 메서드로 나눠진다면

큰 메서드는 외부에서 이용해야 하므로 원래 접근자를 따라가고

분리된 작은 메서드들은 큰 메서드에서 호출되는 용도로만 사용되기 때문에 private 접근 지정자를 붙여주면 됩니다.

 

여기까지 접근 지정자의 사용법에 대해서 알아보았습니다.

'Java' 카테고리의 다른 글

자바 상속 기본  (0) 2021.05.07
Java static / non-static  (0) 2021.05.06
생성자  (0) 2021.04.13
클래스와 객체(미완성)  (0) 2021.04.06
예외 처리  (0) 2021.04.06