패키지(Package)
- 자바에서는 클래스를 체계적으로 관리하기 위해 패키지(Package)를 사용한다.
- 패키지의 물리적인 형태는 파일 시스템의 폴더이지만, 단순히 파일 시스템의 폴더 기능만 하는 것은 아니다.
- 패키지는 클래스의 일부분으로 클래스를 유일하게 만들어 주는 식별자 역할을 한다.
- 즉, 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다.
- 형태는 : package 상위패키지.하위패키지.클래스
패키지 선언
- 클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지를 선언하는 것을 의미한다.
- 패키지는 클래스의 일부이다. 이유는, 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없기 때문!
- JDK 8 이전 버전에서는 패키지가 없는 클래스를 선언할 수 있었지만, JDK 11버전 이후 버전부터는 패키지가 없는 클래스를 생성하면 컴파일 에러가 뜬다.
① 패키지 이름의 규칙
- 숫자로 시작해서는 안 되고, _ $를 제외한 특수문자를 사용할 수 없다.
- java로 시작하는 패키지는 자바 표준 API에서만 사용하기 때문에 사용하서는 안된다.
- 모두 소문자로 작성하는 것이 관례이다.
- 참고로 여러 개발 회사들이 함께 참여하는 프로젝트의 경우 중복을 방지하기 위해 회사 도메인 이름으로 패키지를 만든다.
② import문
- 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있따면 import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 한다.
- 형식은 다음과 같다.
- import 상위패키지.하위패키지.클래스이름;
- import 상위패키지.하위패키지.*; (사용하고자 하는 클래스들이 동일한 패키지 소속일 경우 *을 사용)
- import문은 패키지 선언과 클래스 선언 사이에 작성한다.
- import문은 개수에 제한이 없고 얼마든지 추가할 수 있다.
- 주의할 점은 상위패키지를 import했다고 해서 하위 패키지까지 impoprt되는 것은 아니라는 점
- 즉, com.hankook과 com.hankook.project는 서로 다른 패키지로 인식된다.
※ 만약 서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import된 경우 컴파일에러가 발생한다.
- 이 경우에는 정확하게 패키지가 포함된 클래스 전체 이름을 기술해야 한다.
- 예를 들어, 두 패키지에 Tire라는 동일한 클래스명이 존재할 경우, 아래와 같이 전체 이름을 표기.
- ex) sec06.exam02.hankook.Tire Tire1 = ...., sec06.exam02.kumho.Tire Tire2 = ....
접근 제한자
- 접근 제한자(Access Modifier)는 말 그래로 접근을 제한하기 위해 사용된다.
- 여기서 접근이란, 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 의미한다.
- 클래스와 인터페잇를 다른 패키지에서 사용 못하도록 막을 필요가 있을 경우 사용한다.
- 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 하는 경우도 사용한다.
- 클래스를 선언할 때 public을 생략했다면, 클래스는 defalut 접근 제한을 가진다.
- 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다.
접근제한 | 적용 대상 | 접근할 수 없는 클래스 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
Getter와 Setter 메소드
- 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막기위해 사용.
- 그 이유는 외부에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문
- 예를 들면, 자동차 속력은 음수가 될 수 없는데 외부에서 음수로 변경할 경우 무결성이 깨진다고 할 수 있다.
- 클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호하고, 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.
① Setter : 외부에서 값을 받아 필드를 변경하는 메소드
- 필드는 외부에서 접근할 수 없도록 막고, 외부에서 메소드를 통해 필드에 접근하도록 하는 메소드
- 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있도록 한다.
② Getter : 필드의 값을 외부로 리턴해 주는 메소드
- 메소드로 필드값을 가공한 후 외부로 전달하는 역할
- 예를 들어 자동차의 속도를 마일에서 km단위로 환산해서 외부로 리턴해주는 getSpeed() 메소드를 다음과 같이 작성 할 수 있다.
'Coding > Java' 카테고리의 다른 글
[21] JAVA 타입변환과 다형성 (1) | 2022.12.02 |
---|---|
[20] JAVA 상속 (0) | 2022.11.30 |
[18] JAVA 인스턴스(객체) Instance (0) | 2022.11.27 |
[17] JAVA 자료구조 ArrayList (0) | 2022.11.25 |
[16] JAVA 메소드 (0) | 2022.11.24 |