본문으로 바로가기

대규모 프로그램을 작성할 때는 여러 사람이 분담하여 프로그램을 작성하는것이 일반적이다.

여러 클래스를 파일 하나에 작성하면 불편할 수 있다.

클래스 여러 개를 다른 파일에 나누는 방법(파일 분할)에 대해 알아보겠다.

 

car.java 파일분할하기

// 자동차 클래스
class Car
{   
 private int num;   
 private double gas; 
 
 public Car()  
 {       
  num = 0;       
  gas = 0.0;       
  System.out.println("자동차가 만들어졌습니다.");  
 }  
 public void setCar(int n, double g) 
 {       
  num = n;       
  gas = g;       
  System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");
   
 }   
 public void show()   
 {       
  System.out.println("차량 번호는 " + num + "입니다.");      
  System.out.println("연료 양은 " + gas + "입니다.");  
 }
}

 

Sample1.java

class Sample1
{   
 public static void main(String[] args)  
 {       
  Car car1 = new Car();      
  car1.show();  
 }
}

Sample1은 지금까지 작성한 Car클래스와 거의 동일하다.

 

그러나 지금까지 파일 하나에 작성했었던 두 클래스를 각각 다른 파일로 나누었다는 점

 

Car.java ------> Car 클래스

Sample1.java --------> main() 메소드를 가지는 Sample1 클래스

 

Sample1의 컴파일 방법

 

 javac Sample1.java --------> 지금까지 사용한 컴파일 방법과 동일

컴파일 하게 되면 Sample1.class와 Car.class 2개의 파일이 동시에 실행된다.

 

Sample1의 실행화면

 

자동차가 만들어졌습니다.
차량 번호는 0입니다.
연료 양은 0.0입니다.

 

 

 

패키지의 기본

 

패키지의 원리를 이해하기

 

대규모 프로그램을 작성할 때에는 다른 사람들이 설계한 다양한 클래스를 이용해야 하는 경우도 있다. 때로는 이름이 충돌하는 클래스를

프로그램에 도입해야 하는 경우가 있다. 이럴때 java에서는 패키지(package)라고 하여 매커니즘을 사용하여 클래스이름을 구분하고 클래스 이름 충돌하는 것을 방지 한다.

 

구문

package 패키지 이름;

 

package pa; 패키지에 포함시킨다.
// 자동차 클래스
class Car 이 클래스는 패키지 pa에 포함된다.
{   
 private int num;   
 private double gas;   
 public Car()   
 {       
  num = 0;       
  gas = 0.0;       
  System.out.println("자동차가 만들어졌습니다.");   
 }  
 public void setCar(int n, double g)   
 {       
  num = n;       
  gas = g;      
  System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");
  
 }   
 public void show()   
 {       
  System.out.println("차량 번호는 " + num + "입니다.");     
  System.out.println("연료 양은 " + gas + "입니다.");  
 }
}

class Sample2 이 클래스는 패키지 pa에 포함된다.
{   
 public static void main(String[] args)  
 {       
  Car car1 = new Car(); 
  car1.show();  
 }
}

이 프로그램을 컴파일하기 전, 작업 폴더에 패키지 이름과 같은 'pa'라는 이름의 폴더를 만들어야 한다.

 

13 --- pa -- Sample2.java (각각의 디렉토리를 생성)

 

Sample2의 컴파일 방법

 

C:\YJSample\13> javac pa\Sample2.java

 

13 --- pa -- Sample2.java

     Car.class

Sample2.class 생성

 

Sample2의 실행 방법

 

 C:\YJSample\13> java pa.Sample2

 


자동차가 만들어졌습니다.
차량 번호는 0입니다.
연료 양은 0.0입니다.

패키지명.클래스 명(띄어쓰기 하지 않는다)


 

패키지 사용

 

같은 패키지에 포함시키기

 

package pa Car 클래스를 pa패키지에 포함시킨다.


// 자동차 클래스

class Car
{
   
 private int num;
   
 private double gas;

   

 public Car()
 {
       
  num = 0;
       
  gas = 0.0;
       
  System.out.println("자동차가 만들어졌습니다.");
   
 }

   
 public void setCar(int n, double g)
 {
       
  num = n;
       
  gas = g;
       
  System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");
   
 }

   
 public void show()
 {
       
  System.out.println("차량 번호는 " + num + "입니다.");
       
  System.out.println("연료 양은 " + gas + "입니다.");
   
 }

}

Sample3.java

package pa;   Sample3 클래스를 pa패키지에 포함시킨다.

 

class Sample3
{   
 public static void main(String[] args)  
 {       
  Car car1 = new Car(); 
  car1.show();  
 }
}

 

 

Sample3의 컴파일 방법

 

C:\YJSample\13> javac pa\Sample3.java

 

13 --- pa -- Sample2.java

     Car.class

Sample2.class 생성

 

Sample3의 실행 방법

 

 C:\YJSample\13> java pa.Sample3

 


자동차가 만들어졌습니다.
차량 번호는 0입니다.
연료 양은 0.0입니다.

패키지명.클래스 명(띄어쓰기 하지 않는다)

 

 

다른 패키지 안의 클래스 사용하기

 

1. 다른 패키지의 클래스에서 사용될 클래스의 이름 앞에 public 붙이기

2. 다른 패키지의 클래스를 사용할 때 그 클래스의 이름 앞에 패키지 이름 붙이기

 

Car.java

 

package pc; Car 클래스를 pc패키지에 포함


// 자동차 클래스

public class Car  1. car클래스를 다른 패키지의 클래스에서 사용할 수 있게 만든다.

{
   
 private int num;
   
 private double gas;
   

 public Car()
   
 {
       
  num = 0;
       
  gas = 0.0;
       
  System.out.println("자동차가 만들어졌습니다.");
   
 }
   
 public void setCar(int n, double g)
   
 {
       
  num = n;
       
  gas = g;
       
  System.out.println("차량 번호를 " + num + "으로, 연료 양을 " + gas + "로 바꾸었습니다.");
  
  }
   
 public void show()
   
 {
       
  System.out.println("차량 번호는 " + num + "입니다.");
       
  System.out.println("연료 양은 " + gas + "입니다.");
   
 }

 

Sample5.java

package pb; Sample5 클래스를 pb패키지에 포함시킨다.

 

class Sample5

{
   
 public static void main(String[] args)
   
 {
        
  pc.Car car1 = new pc.Car(); 클래스 이름 앞에 패키지이름을 붙인다. 
        
  car1.show();
   
 }

}

 

실행결과

D:\YJSample\13>java pb.Sample5


자동차가 만들어졌습니다.
차량 번호는 0입니다.
연료 양은 0.0입니다.


 

임포트

 

다른 패키지 안의 클래스를 사용하기 위해서는 이름 앞에 패티지 이름을 붙여햐 한다는 것을 배웠다.

pc.Car car1 = new pc.Car();

 

 

다른 패키지에 속한 클래스의 이름 앞에 매번 패키지 이름을 붙이는 것은 상당히 번거롭다

그럴 때 파일의 앞머리에서 임포트(import)라는 작업을 해 줄 수 있다.

 

구문

import 패키지 이름.클래스 이름; 다른 패키지에 속한 클래스를 임포트 한다.

ex)

import pc.Car;

. . .

 

Car car1 = new Car(); 패키지 이름을 생략했다.

 

Sample6.java import문 사용하기

 

}

import  임 포 트 하면 ...
pc.Car;

 

class Sample6

{
   
 public static void main(String[] args)
   
 {
      
   Car car1 = new Car(); 패키지 이름 생략
        
  car1.show();
   
 }

 

서브 패키지 만들기

 

package pc.sub; Car 클래스를 pc폴더 아래 sub패키지 포함


// 자동차 클래스

public class Car  1. car클래스를 다른 패키지의 클래스에서 사용할 수 있게 만든다.

{
   
 private int num;
   
 private double gas;
   

 public Car()
   

Sample7의 컴파일 방법

 

C:\YJSample\13> javac pa\sub\Sample7.java

 

13 --- pa -- Sample2.java

     Car.class

Sample2.class 생성

 

Sample3의 실행 방법

 

 C:\YJSample\13> java pa.sub.Sample7

 


자동차가 만들어졌습니다.
차량 번호는 0입니다.
연료 양은 0.0입니다.

 


 

 

클래스 라이브러리의 패키지

 

 패키지 이름

패키지에 포함된 클래스 

java.applet

애플릿 관련 클래스

java.awt

윈도우 부품 관련 클래스

java.awt.event

이벤트 관련 클래스

java.awt.image

이미지 관련 클래스

java.lang

기본적인 클래스

java.lo

입출력관련 클래스

java.net

네트워크 관련 클래스

java.util

유틸리티 관련 클래스

java.math

수치 연산 관련 클래스

java.text

숫자 날짜 등의 국제화 관련 클래스

 

import java.lo.BufferedReader; 파일 앞머리에서 임포트 하고 있다.

 

 

여러 클래스 임포트하기

 

import java.io.BufferedReader;

import java.io.IOException; 매우 귀찮습니다.

. . .

 

그러나 같은 패키지 내의 클래스를 많이 사용해야 할 경우, 이는 매우 번거로운 작업이다. 이럴 때

패키지 안에 포함된 클래스를 모두 임포트하라고 할 수 있다.

 

import java.io*; 패키지 java.io 안에 있는 클래스를 모두 읽어 들인다.

 

 

import java.awt.*; 서브 패키지 클래스까지 읽어들이지 않는다.

import java.awt.image.*; 서브 패키지는 별도로 임포트해야 한다.

 

단 이 표현은 서브 패키지 클래스까지 읽어들이지 않는다.

각각 별도의 import문을 써야함.