패키지란 클래스의 묶음이다.
패키지란 클래스 또는 인터페이스를 포함할 수 있는 묶음으로, 실제 폴더로 구분되면서 클래스를 효율적으로 관리할 수 있도록 하는 체계이다.
예를 들어보자.
우리가 사진을 저장한다고 하면 그냥 사진폴더에 모든 사진을 몰아넣는것 보다는 사진폴더 안에 여행, 음식등 폴더를 더 나눠서 사진을 분류하거나, 년도와 날짜별로 분류를 하면 관리하기가 더 쉬울 것이다.
위 사진은 실제 필자의 여행 사진 분류이다.
자바 코드 역시 마찬가지이다.
결국에는 우리가 작성한 클래스 역시 파일로 작성이 되며, 이 클래스 파일들을 적절하게 분류를 해서 저장을 하도록 하는것이 바로 패키지
이다.
이러한 패키지는 .
으로 구분을 하며, com.study.packageStudy
일 경우 아래 사진과 같이 src
폴더 아래 com->study->packageStudy폴더가 생성이 된다.
또한, 이 위치에 코드를 작성하면 com->study->packageStudy폴더에 클래스 파일이 위치하게 된다.
대부분 이러한 패키지는 회사 도메인을 거꾸로 쓰는 방식을 사용한다.
예를들어 회사 도메인이 myCompany.com
이라면 패키지는 기본적으로 com.myCompany
가 된다.
또한, 모든 소스파일은 반드시 하나의 패키지에 속해야 한다.
패키지는
package
키워드를 사용해 선언할 수 있다.
우리가 이클립스에서 코딩을 하다보면 맨 위에 이런 코드가 항상 있었다.
package 패키지_이름;
위 코드는 패키지를 선언한 것으로, 정확히 말하면 패키지 안에 클래스 파일을 넣은 것이다.
앞에서 모든 소스파일은 반드시 하나의 패키지에 포함되야 한다고 언급했을 것이다. 즉, 우리가 package 패키지_이름;
을 작성하면 해당 패키지 내부에 클래스 파일을 포함시키는 형식이 되며, 아래 사진과 같이 패키지 폴더 내부에 클래스 파일이 위치하게 된다.
import는 다른 패키지에 있는 클래스를 사용할때 작성하는 구문이다.
import
는 우리가 직접 만들지 않은 패키지를 사용하려고 할때 사용할 수 있는 구문이다. 또한 패키지는 클래스의 묶음이기에 import
구문은 우리가 직접 구현하지 않은 클래스들을 사용하기 위한 구문이다.
사실 우리는 아래와 같이 이미 import
구문을 통해 직접 구현하지 않은 클래스를 사용한 적이 있다.
import java.util.Scanner;
public class scanner {
public static void main(String[] args) {
String str;
Scanner input = new Scanner(System.in);
System.out.print("input> ");
str=input.nextLine();
System.out.println("input: "+ str);
}
}
바로 Scanner
클래스다. 우리가 콘솔로 입력을 받을때 직접 콘솔입력 관련 클래스를 직접 구현하지 않고 Scanner
클래스를 사용해 콘솔로부터 입력을 받았었다. 또한, Scanner
클래스를 사용할때 java.util
과 같이 패키지명을 같이 사용하지 않은것 처럼 한번 import
를 작성하면 해당 클래스를 사용할때 패키지명은 생략할 수 있다.
import의 선언은 다음과 같다.
1.import 패키지명.클래스명;
import 패키지명.*;
import
구문을 선언하기 위해서는 import 패키지명.클래스명;
으로 선언하거나 import 패키지명.*;
으로 선언할 수 있다.
이때, import 패키지명.*;
에서 *
는 모두(all)라는 의미로, 해당 패키지의 모든 클래스를 포함하는 구문이다.
즉, import 패키지명.클래스명;
을 사용하면 해당 패키지에서 우리가 사용하려는 특정한 클래스만 사용할 수 있는 반면 import 패키지명.*;
을 사용하면 우리가 사용하려는 클래스 뿐 아니라 우리가 선언한 패키지에 있는 다른 클래스들 역시 사용할 수 있어서 편리하다는 장점이 있으나, 처음 컴파일시 시간이 조금 더 걸린다는 단점이 있다. 또한, 이 둘의 실행시 성능은 차이가 없다.
또한, import
할때 *
를 붙인다고 해서 하위 패키지의 클래스를 모두 포함한다는 의미는 아니기 때문에 import java.*
와 같이 작성한다고 해서 다음 패키지의 클래스까지 포함한다는 것은 아니다.
import java.util.*;
import java.text.*;
따라서 import java.*
를 작성한다 해서 위의 두 문장을 작성 안해도 되는 것이 아니다.
static import를 사용하면 static멤버의 클래스 이름을 생략할 수 있다.
선언 방법:import static 패키지명.클래스명;
원래는 static멤버의 경우 반드시 클래스 이름을 적어야 한다.
그러나, static import구문을 사용하면 import
를 사용할때 클래스의 패키지명을 생략할 수 있는것 같이 static멤버의 클래스 이름을 생략할 수 있다.
예를들어 아래와 같이 static import를 하면
import static java.lang.System.out;
out.printf("hello world");
와 같이 System
클래스를 생략해서 사용할 수 있다.
아주 유익한 내용이네요!