캡슐화란 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 의미한다.
캡슐화의 가장 큰 장점은 정보 은닉에 있다. 즉, 외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막고, 데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성을 확보할 수 있다. 더 나아가 유지보수와 코드 확장 시에도 오류의 범위를 최소화할 수 있어서 효과적으로 코드를 유지보수하기에 용이하다.
패키지란 특정한 목적을 공유하는 클래스와 인터페이스의 묶음을 의미한다.
// 패키지가 있는경우 소스 코드의 첫 번째 줄에 반드시 `package 패키지명`이 표시되어야 함
package practicepack.test; // 패키지 구문 포함. 패키지가 없다면 구문 필요없음
public class PackageEx {
}
자바에서 패키지는 물리적인 하나의 디렉토리. 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다. 이 디렉토리는 하나의 계층구조를 가지고 있는데, 계층 구조간 구분은 점(.)으로 표현한다.
- java.lang
System을 비롯하여 문자열, 수학 함수, 입출력 등과 같이 자바 프로그래밍에 필요한 기본 클래스와 인터페이스를 제공 import 문을 사용하지 않아도 자동으로 import 된다.
- java.util
날짜, 시간, 벡터, 해시맵 등 다양한 유틸리티 클래스와 인터페이스 제공
- java.io
키보드, 모니터, 프린터, 디스크 등에 입출력 할 수 있는 클래스와 인터페이스 제공
Import문은 다른 패키지 내의 클래스를 사용하기 위해 사용하며, 패키지 구문과 클래스문 사이에 작성한다.
public class ImportExample {
public static void main(String[] args) {
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println(sc.next());
}
}
만약 scanner를 이용해 이용자에게 입력을 받고자 했을 때Scanner가 등장할 때 마다java.util.Scanner의 경로명을 사용하면 번거롭고 코드가 길어진다.
import 패키지.클래스;
import문을 사용하면 매번 전체 경로명을 사용하지 않아도 된다.
import java.util.Scanner;
public class ImportExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(sc.next());
}
}
import문은 반드시 클래스 선언 전에 나와야 하며 소스의 앞 부분에 선언되어야 한다.
만약 java.util 패키지 내에서 Scanner 말고도 다른 클래스를 사용할 경우 java.util.* 을 이용하면 된다.
java.util.클래스명 // 사용하고자 하는 클래스의 정확한 위치와 이름을 지정.
java.util.* // util 패키지를 참조할 것.
접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 하며 접근제어자는 생략가능하고 생략했을 경우 자동으로 default임을 뜻하게 된다.
- private : 동일 클래스에서만 접근 가능
- default : 동일 패키지 내에서만 접근 가능
- protected : 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
- public : 접근 제한 없음
접근 범위 : private < default < protected < public 순으로 보다 많은 접근을 허용한다.
private 타입 fieldName;
//getter 메서드
public 리턴타입 getFieldName() {
return fieldName;
}
//setter 메서드
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
객체 외부에서 객체 필드값을 사용하기에 부적절한 경우가 있다.
이런 경우getter메서드로 필드값을 가공한 후 외부로 전달한다.
만약 필드 타입이 boolean일 경우, getter는 get이 아닌 is로 시작하는 것이 관례이다.
double getSpeed() {
double km = speed * 1.6
return km;
}
// 마일을 km로 환산 후 외부로 리턴
객체지향 프로그래밍에서 데이터는 외부에서 직접적으로 접근하는 것을 제한한다.
따라서 메서드를 통해 데이터를 변경하는 방법을 선호하는데 데이터는 외부에서 접근하지 않도록 막고 메서드는 공개해서 메서드를 통해 데이터에 접근하도록 유도한다.
void setSpeed(double speed) {
if(speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
// 값이 음수라면 필드에 0으로 저장하고 메서드 실행 종료