패키지(package)
패키지는 클래스와 인터페이스의 집합이고 자바 클래스들을 효율적으로 구분하기 위해 사용합니다. 이름이 동일한 클래스들이 충돌을 일으키는 경우가 있습니다.
그리고 이러한 패키지들을 관리하기 위해 규칙이 있는데 패키지의 이름을 역도메인(reverse domain) 방식으로 하는 것입니다. 도메인은 인터넷에서 기관을 이름으로 구분한 것인데 패키지는 이를 뒤집어서 사용됩니다.
예를 들어, 구글의 도메인은 google.com이고 루트 패키지명은 com.google이 되는 것입니다. 메일 서비스의 클래스는 com.google.mail이라고 볼 수 있습니다. 이와 같은 규칙으로 인해 다른 곳애서 만든 클래스도 혼선 없이 사용할 수 있습니다.
package 선언
클래스에 패키지를 선언하는 것은 package 키워드를 이용해 소스 상단에 패키지를 이름을 넣어주는 것입니다.
package com.my.study;
class MyClass {
}
package import
현재 구현 중인 클래스에서 동일패키지에 있는 클래스가 아닌 다른 클래스(외부 라이브러리 등)를 사용하는 경우 반드시 import문을 사용해 해당 클래스의 패키지를 명시해 주어야 합니다. 만약 import 문을 사용하지 않는다면 소스코드에서 해당 클래스 사용 시 매번 클래스 이름 앞에 패키지명까지 붙어주어야 합니다.
class MyClass {
java.util.Scanner scan = new java.util.Scanner(System.in);
}
대부분의 경우 매번 패키지명을 붙여주는 방식보다는 해당 클래스의 패키지를 import 해주는 방법을 사용합니다.
import java.util.Scanner;
class MyClass {
Scanner scan = new Scanner(System.in);
}
원칙적으로는 사용되는 모든 클래스를 import 해주는 것이고 특정 패키지의 모든 클래스를 한 번에 import 하기 위해서는 *을 사용하기도 합니다.
import java.util.*;
그러나 이런 방식은 많은 라이브러리를 동시에 사용하는 경우 클래스 이름 중복으로 인한 문제가 발생할 수 있으므로 주의해야 합니다. 보통은 개발도구에서 자동으로 패키지 import를 관리하므로 개별 클래스들이 import 될 수 있도록 하는 것이 좋습니다.
제어자(Modifier)
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여합니다. public, static 같은 키워드들이 여기에 해당됩니다. 제어자에는 클래스의 접근 범위와 관련된 접근 제어자(access modifier)와 일반 제어자가 있습니다.
- 접근 제어자 : public, protected, default, private
- 일반 제어자 : static, final, abstract, native, transient, synchronized, volatile, strictfp
이들 제어자는 상황에 따라 클래스, 메서드, 변수등에 사용되며 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근제어자는 단 하나만 사용할 수 있습니다.
static
클래스 혹은 공통적인 의미를 가지고 있으며 클래스 변수나 메서드의 선언에 사용할 수 있습니다. static의 특징은 다음과 같습니다.
- 멤버변수와 메서드, 초기화 블럭은 인스턴스를 생성하지 않고도 사용할 수 있습니다.
- 모든 인스턴스에 공통적으로 사용되는 클래스 변수입니다.
- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능합니다.
- 클래스가 메모리에 로드될 때 생성됩니다.
- 인스턴스 생성 없이 클래스 이름.매서드명() 으로 사용가능한 static 메서드를 선언합니다.
final
변경할 수 없다는 의미를 가지고 있으며 변수나 메서드, 클래스에 사용할 수 있습니다.
- 메서드에 사용할 경우 오버라이딩을 통해 재정의 할 수 없습니다.
- 변수에 사용할 경우 상수가 됩니다.
- 클래스에 사용할 경우 더 이상 상속을 할 수 없는 클래스가 됩니다.
abstract
추상 클래스와 추상 메서드를 선언할 때 사용합니다.
- 메서드의 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메서드를 선언하는 데 사용합니다.
- 추상 메서드가 있는 클래스는 반드시 추상클래스로 선언되어야 합니다.
접근 제어자(access modifier)
접근 제어자는 멤버 또는 클래스에 사용하며 외부에서의 접근을 제어하기 위해 사용합니다. 내가 만든 패키지의 클래스들 중 일부는 외부에서 사용할 수 있도록 하고 일부 클래스는 내가 만든 클래스에서만 사용할 수 있도록 하기 위함입니다.
지정되어 있지 않다면 default가 됩니다.
- public : 접근 제한이 없습니다.
- protected : 같은 패키지 내에서 혹은 다른 패키지의 자손 클래스에서 접근이 가능합니다.
- default : 같은 패키지 내에서만 접근이 가능합니다.
- private : 같은 클래스 내에서만 접근이 가능합니다.
유형별로는 다음과 같은 접근제어자 사용이 가능합니다.
- 클래스 : public, default
- 메서드, 멤버변수 : public, protected, default, private
- 지역변수 : 지역변수 자체가 해당 블럭에서만 사용 가능하므로 접근 제어자의 의미가 없습니다.
일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치하며 생성자에 접근 제어자를 사용하는 경우 인스턴스의 생성을 제한할 수 있습니다.
'JAVA > JAVA 개념' 카테고리의 다른 글
JAVA 개념 4-2 - 추상클래스와 인터페이스 (0) | 2023.01.12 |
---|---|
JAVA 개념 4-1 - 상속과 오버라이딩 (0) | 2023.01.03 |
JAVA 개념 3-4 - 키보드 입력과 로깅 (0) | 2022.11.30 |
JAVA 개념 3-3 - 배열 (0) | 2022.11.25 |
JAVA 개념 3-2 - 반복문 (0) | 2022.11.24 |