Claire's Study Note

06-6. 패키지와 접근 제한자

by Hi.Claire
반응형

📓 혼자 공부하는 자바 (신용권, 한빛미디어)

 

06. 클래스

06-6. 패키지와 접근 제한자

06-6-1. 패키지 선언

패키지(package)

파일 시스템의 폴더 기능을 하며, 클래스의 일부분으로서 클래스를 유일하게 만들어주는 식별자 역할을 한다.

 

패키지 선언

클래스를 작성할 때 클래스가 어떤 패키지에 속할 것인지를 선언한다.

package 상위패키지.하위패키지;

public class ClassName {...}

 

패키지 이름 작성 규칙

  • 모두 소문자로 작성하는 것이 관례이다.
  • 숫자로 시작하면 안 되고, $나 _를 제외한 특수 문자를 사용하면 안 된다.
  • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안 된다.

 

import문

사용하고자 하는 클래스나 인터페이스가 다른 패키지 소속이라면, import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 한다.

이때, 패키지 선언과 클래스 선언 사이에 import문을 작성한다.

import 상위패키지.하위패키지.클래스이름;

 

어떤 패키지에 속한 여러 클래스들을 사용할 때에는 아래와 같이 import문을 작성한다.

import 상위패키지.하위패키지.*;

 

이때 주의할 점은, 자바는 패키지 전체 이름으로 패키지를 식별하기 때문에 상위 패키지를 import했다고 해서 하위 패키지까지 import되는 것은 아니라는 점이다.

 

경우에 따라서 코드에 패키지가 포함된 클래스 전체 이름을 기술해야 하는 때가 있다.

서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import되었다면 컴파일러는 어떤 패키지의 클래스를 사용해야 할지 모호해지므로 컴파일 에러를 발생시킨다.

이 경우에는 정확하게 패키지가 포함된 클래스 전체 이름을 기술해야 한다.

 

(참고) 이클립스 import문 자동 추가 단축키

Ctrl + Shift + O

 

06-6-2. 접근 제한자

접근 제한자(Access Modifier)

클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 제한하기 위해 사용된다.

 

접근 제한자의 종류

public 모든 외부 클래스에서 접근 가능
protected 같은 패키지에 소속된 클래스와 자식 클래스에서 접근 가능
default 같은 패키지에 소속된 클래스에서 접근 가능
private 같은 클래스 내에서만 접근 가능

 

클래스의 접근 제한

default 접근 제한과 public 접근 제한을 가질 수 있다.

만약 라이브러리 클래스를 개발할 경우 public 접근 제한을 갖도록 해야 한다.

 

생성자의 접근 제한

객체를 생성하기 위해 new 연산자로 생성자를 호출하는데, 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.

생성자는 public, protected, default, private 접근 제한을 가진다.

클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다.

자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다.

 

싱글톤(Singleton) 패턴에서는 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 한다.

생성자를 private 접근 제한으로 선언하고, 자신의 유일한 객체를 리턴하는 정적 메소드를 선언하여 이를 구현할 수 있다.

 

필드와 메소드의 접근 제한

필드와 메소드는 public, protected, default, private 접근 제한을 가질 수 있다.

 

Getter와 Setter

일반적으로 객체 지향 프로그래밍에서는 객체의 필드를 외부에서 직접적으로 접근하는 것을 막는다.

외부에서 마음대로 변경할 경우 객체의 무결성이 깨질 수 있기 때문이다.

대신 메소드를 통해서 필드를 변경하는 방법을 선호한다.

필드는 외부에서 접근할 수 없도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근하도록 유도한다.

이때 메소드에서 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있도록 할 수 있다.

이러한 역할을 하는 메소드가 Setter()이다.

 

외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다.

왜냐하면 필드값을 직접 사용하면 부적절한 경우도 있기 때문이다.

이런 경우에는 메소드로 필드값을 가공한 후 외부로 전달하면 된다.

이런 메소드가 바로 Getter()이다.

 

결론적으로 클래스를 선언할 때 가능하면 필드를 private으로 선언해서 외부로부터 보호하고, 필드에 대한 Getter, Setter 메소드를 작성해서 필드값을 안전하게 사용하고 변경하는 것이 좋다.

 

(참고) 이클립스의 Getter/Setter 메소드 자동 생성 기능

필드를 생성한 후 [Source] - [Generate Getters and Setters] 메뉴를 선택한다.

 

예시1. Getter와 Setter 메소드 선언

public class Car {

    //필드
    private int speed;
    private boolean stop;
    
    //메소드
    public int getSpeed() {
        return speed;    
    }
    
    public void setSpeed(int speed) {
        if(speed < 0) {
            this.speed = 0;
            return;
        } else {
            this.speed = speed;
        }
    }
    
    public boolean isStop() {
        return stop;
    }
    
    public void setStop(boolean stop) {
        this.stop = stop;
        this.speed = 0;
    }
}

 

예시2. Getter와 Setter 메소드 사용

public class CarExample {

    public static void main(String[] args) {

        Car myCar = new Car();
        
        //잘못된 속도 변경
        myCar.setSpeed(-50);
        
        System.out.println("현재 속도 : " + myCar.getSpeed());
        
        //올바른 속도 변경
        myCar.setSpeed(60);
        
        //멈춤
        if(!myCar.isStop()) {
            myCar.setStop(true);
        }
        
        System.out.println("현재 속도 : " + myCar.getSpeed());
    }
}

현재 속도 : 0

현재 속도 : 0

 

반응형

'☕️ Java > 혼자 공부하는 자바' 카테고리의 다른 글

07-2. 타입 변환과 다형성  (1) 2023.09.23
07-1. 상속  (0) 2023.09.18
06-5. 인스턴스 멤버와 정적 멤버  (0) 2023.09.13
06-4. 메소드  (0) 2023.09.13
06-3. 생성자  (0) 2023.08.30

블로그의 정보

Claire's Study Note

Hi.Claire

활동하기