강좌 Course 1. Part 3. ch3 요약
객체지향 프로그래밍에서는 객체 상호간에 접근을 제어할 수가 있다. A, B 두 클래스가 있다고 할 때, 서로가 가진 상태와 동작을 상호간에 접근해야 할 때나 접근을 제어해야 할 때가 생기기 때문이다. 접근 권한은 객체를 보호하기 위해 객체를 설계할 때 클래스와 클래스 내부 멤버에 외부 클래스의 접근을 허용할지 말지를 결정한다.
일반적으로 상태정보는 마음대로 수정하는 것을 막기 위해 접근을 막고(=은닉하고), 행위정보는 상호작용을 위해 접근을 허용한다.
접근 권한은 설계 단계에서 클래스와 클래스 내부 멤버에 접근제어자(Access Modifier)를 통해 설정할 수 있으며, public, private, protected, default 4가지가 있다.
1. public: public이 붙은 클래스나 클래스 내부 요소는 모든 패키지에서 접근이 가능하다.
모든 클래스와 메서드는 public으로 설정한다.
2. private: private은 모든 패키지에서 접근이 불가능하며, 자기 자신만 접근이 가능하다. 주로 마음대로 수정되는 것을 방지하기 위해 상태정보(=멤버변수)들에 설정한다.
3. protected: 상속 관계에서 하위 클래스가 상위 클래스에 접근 가능하게 한다.
4. default: default는 동일한 패키지 내에서만 접근이 가능하다. 패키지 내 기본적인 접근권한으로 설정되어 있으며, 접근제어자를 명시해주지 않을 경우 default로 설정된다. (따로 default라고 붙여줄 필요가 없다.)
// 예시: MemberDTO
public class MemberDTO {
public String name;
public String phone;
private int age;
}
// 예시: public, private 접근권한
import fc.java.model.MemberDTO;
public class AccessModifier {
public static void main(String[] args) {
MemberDTO m = new MemberDTO();
m.name="홍길동";
m.phone="010-1111-1111";
m.age=20; // 오류, private이라서
}
}
*default 참고자료
패키지는 서로 기능이 비슷한 클래스끼리 모아 쉽게 관리하기 위해 사용하는 일종의 폴더같은 것이다. 또, 보안 차원에서 패키지 외부에서 클래스에 접근하는 것을 막기도 한다.
자바가 기본적으로 제공하는 API도 패키지 형태로 제공되고 있다. 문자열 자료형의 경우 java.lang 패키지 안에, 입력을 받기 위해 사용하는 Scanner는 java.util 패키지 안에 있는 등 다양한 패키지가 존재한다.
프로젝트 밖에 있는 패키지에 접근하려면 클래스의 이름이나, 위치와 접근제어자를 알아야 한다. 기본적으로 다른 패키지에 있는 클래스에 접근하려면 클래스를 호출할 때마다 해당 패키지명을 적어주어야 한다. (jdk의 lib폴더 안 jar파일 내부에는 java.lang과 같은 폴더 내에 우리가 사용하는 클래스들이 저장되어 있는 것을 확인할 수 있다).
java.util.Scanner scan = new java.util.Scanner(System.in);
이 방법은 가독성을 저해하고 번거로워지기 때문에, 코드 상단에 import를 사용하여 쓸 클래스를 불러놓으면 이후로는 클래스 이름만 써도 해당 클래스를 호출할 수 있다.
import java.util.*;
Scanner scan = new Scanner(System.in);
*은 해당 패키지 내의 모든 파일을 뜻한다.
참고로 java.lang.*은 기본적으로 import되어있기 때문에 따로 import해줄 필요가 없다.