Java의 정석_기초편

package와 import

DJDU 2022. 10. 7. 11:15

패키지(package)

  • 서로 관련된 클래스의 묶음
  • 클래스는 클래스 파일(*.class), 패키지는 디렉토리. 하위 패키지는 서브 디렉토리
  • 클래스의 실제 이름(full-name)은 패키지를 포함한다(java.lang.String)
더보기

서로 관련된 클래스의 묶음

  • Java 8 기준 약 4000개 클래스

클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더

클래스의 실제 이름(full-name)은 패키지를 포함한다(java.lang.String)

  • String클래스의 실제 이름 : java.lang.String
  • java.lang.String  - java.lang패키지에 속한 String클래스
  • java : 디렉토리(패키지)
  • lang : 서브 디렉토리(하위 패키지)
  • rt.jar는 자바 프로그램을 실행하는데 필요한 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)
  • jar : 클래스 파일 묶어놓은 것
  • Java9부터 rt.jar파일 없어짐
  • 모듈 개념 도입 - rt.jar파일의 크기가 너무 커서 작은 모듈로 쪼개놓음

 

패키지의 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
  • 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다.(default package) - 이클립스 기준
더보기

패키지는 소스파일의 첫 번째 문장으로 단 한번 선언

package 패키지명;

같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.

package com.codechobo.book;    // PackageTest.java

public class PackageTest {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

class PackageTest2 {}
C:\jdk1.8\work>java com.codechobo.book.PackageTest
Hello World!

 

예제7-5

더보기

PackageTest

소스파일 위치 탐색 : 파일 우클릭 > Show In > System Explorer

 

[테스트] PackageTest클래스파일을 IDE 도움 없이 직접 실행해보기

  • bin폴더 : 컴파일된 클래스파일(*class)이 있는 곳
  • src폴더 : 소스파일(*.java)이 있는 곳
  • 패키지 루트 : 패키지 시작 폴더의 상위 폴더
C:\Users\djdu4>java com.codechobo.book.PackageTest
Error: Could not find or load main class com.codechobo.book.PackageTest
  • 오류 : 기본 클래스 com.codechobo.book.PackageTest을(를) 찾거나 로드할 수 없습니다.

 

컴퓨터의 디스크 용량이 1TB일 때, 그 넓은 공간에서 클래스 파일을 찾을 수 없다.

그래서 클래스 파일이 있는 위치로 이동해야 한다. 그 위치를 '패키지 루트'라 한다.

여기로 이동을 해야 PackageTest.class 파일을 찾을 수 있다.

C:\Users\djdu4>cd C:\Users\djdu4\eclipse-workspace\ch07\bin

C:\Users\djdu4\eclipse-workspace\ch07\bin>java com.codechobo.book.PackageTest
Hello, world

매번 이렇게 패키지루트로 이동해야 한다면 매우 불편할 것이다. 이 불편함을 해소해주는 것이 클래스 패스(classpath)이다. 클래스패스에 패키지루트를 저장을 해 놓으면, 매번 이렇게 이동하지 않아도 클래스 파일을 실행할 수 있다.

 

클래스 패스(classpath)

  • 클래스 파일(*.class)의 위치를 알려주는 경로(path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용
  • classpath(환경변수)에 패키지 루트를 등록해야 함
  • set classpath : 환경변수 확인 명령어
  • set classpath=경로 : 환경변수 설정 명령어
더보기

환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용

  • 환경변수 : OS 레벨에서 관리하는 변수

 

classpath(환경변수)에 패키지 루트를 등록해야 함

1. 윈도우즈

환경 변수 설정을 완료했으면, cmd창을 재시작해야 변경 내용이 적용된다.
Microsoft Windows [Version 10.0.19044.2075]
(c) Microsoft Corporation. All rights reserved.

C:\Users\djdu4>set classpath=C:\jdk-11.0.2\lib;C:\Users\djdu4\eclipse-workspace\ch07\bin

C:\Users\djdu4>set classpath
classpath=C:\jdk-11.0.2\lib;C:\Users\djdu4\eclipse-workspace\ch07\bin

2. macOS

  • macOS에서 경로간의 구분자는 ‘;’가 아닌 ':'를 사용
jiwoo@Jiwooui-MacBookPro  ~  open ~/.zshrc
  • 쉘 열기 명령어

| 출처 | classpath 두개를 어떻게 잡아서 컴파일 하나요?

 

import문

  • import문을 선언하면 클래스를 사용할 때 패키지이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.
  • 기본 패키지인 java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
더보기

import문을 선언하면 클래스를 사용할 때 패키지이름을 생략할 수 있다.

  • 컴파일러에게 클래스가 속한 패키지를 알려준다. 
  • 이클립스 단축키 : Ctrl + Shift + o 

java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.

  • java.lang패키지 : 기본 패키지, 생략 가능
  • (String, Object, System, Thread, …)
import java.lang.*;  // * - 모든 클래스(생략 가능)
 
class ImportTest2 {
    public static void main(String[] args) {  // java.lang패키지의 String클래스
        System.out.println("Hello World!");   // java.lang패키지의 System클래스
    }
}
public static void main(java.lang.String[] args) {  // 생략이 안 된다면
    java.lang.System.out.println("Hello World!");   
}

 

import문의 선언

  • import문을 선언하는 방법은 다음과 같다.
  • import문은 패키지문과 클래스 선언의 사이에 선언한다(이클립스 단축키로 자동 선언하면 된다)
  • import문은 컴파일 시에 처리되므로 프로그램 실행 시 성능상의 차이는 전혀 없다.
  • 다음의 두 코드는 서로 의미가 다르다.
  • 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 명시해야 한다.
더보기

import문을 선언하는 방법은 다음과 같다.

import 패키지명.클래스명; 
// 또는 
import 패키지명.*; // 패키지에 속한 모든 클래스

 

import문은 패키지문과 클래스 선언의 사이에 선언한다

  • 이클립스 단축키로 자동 선언하면 된다

 

import문은 컴파일 시에 처리되므로 프로그램 실행 시 성능상의 차이는 전혀 없다.

package com.codechobo.book;          // 1. 패키지 선언

import java.text.SimpleDateFormat;   // 2. import문
import java.util.*;                  // 2. import문

public class PackageTest {           // 3. 클래스 정의
	public static void main(String args[]) {
        Date today = new Date();    // java.util.Date today = new java.util.Date();
        SimpleDateFormat date = new SimpleDateFormat("yyyy/mm/dd");
	}
}    // import문은 패키지문과 클래스 선언의 사이에 선언한다.

다음의 두 코드는 서로 의미가 다르다.

이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 명시해야 한다.

import java.sql.*; // java.sql.Date
import java.util.*; // java.util.Date - 클래스 이름 동일

public class ImportTest {
    public static void main(String args[]) {
        java.util.Date today = new java.util.Date();
    }
}

 

static import문

  • static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
더보기

static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.

import static java.lang.Integer.*; // Integer클래스의 모든 static멤버(cv, cm)
import static java.lang.Math.random; // Math클래스의 random메서드, 괄호() 안 붙임
import static java.lang.System.out; // System.out을 out만으로 참조 가능
                                    // out - static변수

// 사용 x
System.out.println(Math.random());

// static import문 사용 o
out.println(random());

 

예제 7-6

더보기
import static java.lang.System.out;  // out - System클래스의 static변수
import static java.lang.Math.*;      // * - Math클래스의 모든 static멤버(cv, cm)

class Ex7_6 {
	public static void main(String[] args) {
//		System.out.println(Math.random());
		out.println(random());
		
//		System.out.println("Math.PI : " + Math.PI);
		out.println("Math.PI : " + PI);  // PI - static상수
		
	}
}

클래스이름이 있으면 명확히 알아보기 좋기 때문에, static import문은 웬만하면 쓰지 말고, 꼭 필요할 때만 사용하자.

 


🍪

 

📄 - 객체지향개념 암기노트 바로가기