패키지 package


- 꾸러미, 묶음


클래스도 묶음이다. 그렇다면 무엇을 묶어주는가?


1. 묶음 : 클래스

- 클래스를 묶어주는 것이 패키지이다.

- 클래스의 묶음은 다양한 기능을 쓸 수 있지만 패키지는 그냥 묶음이다.


2. 효과

 1) 사용의 편의

 2) 이름 충돌 방지



어떤 이가 대형 출판사에 전산실에 취업을 했다. 
도서관리 프로그램을 개발하려고 했다.
특정 기능을 개발해 달라고 협력사에 요청했다.
협력사 개발자가 개발을 한다고 생각해보자.

이 부분은 이클립스로 하지 말고 윈도우라면 직접 cmd 창을 열어 도스에서 확인해보자.

workspace에 패키지 폴더를 만들어 주고 그 안에 코딩 후 컴파일 해보자.




<예제>

class Book{
    private String title;
    private String author;
    private int year;
    
    
    Book(String title, String author, int year){
        this.title = title;
        this.author = author;
        this.year = year;
        }
    void display(){
        System.out.println("책제목:" + title);
        System.out.println("작가:" + author);
        System.out.println("출판년도:" + year);
    }

}



컴파일은 했지만 테스트를 위한 메인클래스가 필요하다.


class Book{

private String title;

private String author;

private int year;

Book(String title, String author, int year){

this.title = title;

this.author = author;

this.year = year;

}


void display(){

System.out.println("책제목:" + title);

System.out.println("작가:" + author);

System.out.println("출판년도:" + year);

}


public static void main(String[] args){

Book[] books = new Book[4];

//연도는 임의대로

books[0] = new Book("어린왕자", "생떽쥐베리",1900);

books[1] = new Book("홍길동전", "허균",1800);

books[2] = new Book("동의보감", "허준",1850);

books[3] = new Book("난중일기", "이순신",1870);

for(int i=0; i<books.length; i++){

books[i].display();

}

}

}





소스를 만들고 나서 완성되면 패키지로 묶어두어야한다.

자바에서는 소스를 패키지로 묶어두는 것이 예의이다.

클래스 안에서 패키지 선언을 해주면 된다.


package 패키지이름;



//폴더를 패키지로 인정해줘야한다.

package BookPack;

class Book{

    private String title;

    private String author;

    private int year;

    

    

    Book(String title, String author, int year){

        this.title = title;

        this.author = author;

        this.year = year;

        }

    void display(){

        System.out.println("책제목:" + title);

        System.out.println("작가:" + author);

        System.out.println("출판년도:" + year);

    }

    public static void main(String[] args){

        Book[] books = new Book[4];

        //연도는 임의대로

        books[0] = new Book("어린왕자", "생떽쥐베리",1900);

        books[1] = new Book("홍길동전", "허균",1800);

        books[2] = new Book("동의보감", "허준",1850);

        books[3] = new Book("난중일기", "이순신",1870);

    

        for(int i=0; i<books.length; i++){

                books[i].display();

        }

    }

}



하지만 실행이 안된다.


왜 그럴까?


<패키지의 특성>

1.패키지를 실행할 때에는 반드시 패키지 직속 상위폴더에서 실행해야한다.

2.패키지는 반드시 패키지이름과 클래스이름을 같이 명시해야한다.


//폴더를 패키지로 인정해줘야한다.

package BookPack;

class Book{

    private String title;

    private String author;

    private int year;

    

    

    Book(String title, String author, int year){

        this.title = title;

        this.author = author;

        this.year = year;

        }

    void display(){

        System.out.println("책제목:" + title);

        System.out.println("작가:" + author);

        System.out.println("출판년도:" + year);

    }

    public static void main(String[] args){

        Book[] books = new Book[4];

        //연도는 임의대로

        books[0] = new Book("어린왕자", "생떽쥐베리",1900);

        books[1] = new Book("홍길동전", "허균",1800);

        books[2] = new Book("동의보감", "허준",1850);

        books[3] = new Book("난중일기", "이순신",1870);

    

        for(int i=0; i<books.length; i++){

                books[i].display();

        }

    }

}




이렇게 프로그램을 만들어서 Test한 

main파일을 제외하고 패키지 채로 출판사로 넘겨주었다.

출판사에서는 협력사에서 만든 프로그램을 사용하기로 했다.

그래서 따로 BookTest라는 자바 파일을 만들었다.





다른 패키지에서 코드를 받아올 경우

패키지 내의 클래스를 쓸 수 있도록 public을 선언해줘야하고,

값을 받아오고자 하는 클래스 파일과 패키지 명을 함께 명시해준다.


BookTest.java 파일

// 값을 받아오고자 하는 클래스 파일과 패키지 명을 함께 명시

public class BookTest{

    public static void main(String[] args){

        //패키지 이름도 함께 명시

        BookPack.Book[] books = new BookPack.Book[4];

        //연도는 임의대로

        books[0] = new BookPack.Book("어린왕자", "생떽쥐베리",1900);

        books[1] = new BookPack.Book("홍길동전", "허균",1800);

        books[2] = new BookPack.Book("동의보감", "허준",1850);

        books[3] = new BookPack.Book("난중일기", "이순신",1870);

    

        for(int i=0; i<books.length; i++){

                books[i].display();

        }

    }

}



BookPack 패키지의 안의 Book.java 파일

//폴더를 패키지로 인정해줘야한다.

package BookPack;

//클래스마다 public 선언

public class Book{

    private String title;

    private String author;

    private int year;

    

    //클래스마다 public 선언

    public Book(String title, String author, int year){

        this.title = title;

        this.author = author;

        this.year = year;

        }

    //클래스마다 public 선언

    public void display(){

        System.out.println("책제목:" + title);

        System.out.println("작가:" + author);

        System.out.println("출판년도:" + year);

    }

}


그런데 패키지 이름을 하나하나 달기에는 너무나 불편하다.


이 때 import를 쓰면 패키지 이름을 생략 할 수 있다.



//import를 쓰면 패키지 이름을 생략 할 수 있다.

import BookPack.Book;

public class BookTest{

    public static void main(String[] args){

        

        Book[] books = new Book[4];

        //연도는 임의대로

        books[0] = new Book("어린왕자", "생떽쥐베리",1900);

        books[1] = new Book("홍길동전", "허균",1800);

        books[2] = new Book("동의보감", "허준",1850);

        books[3] = new Book("난중일기", "이순신",1870);

    

        for(int i=0; i<books.length; i++){

                books[i].display();

        }

        //java.lang은 기본 core 핵심 패키지이기 때문에 생략할 수 있다.

        //java.lang 이외에 다른 것은 생략 할 수 없다.

        java.lang.System.out.println("...");

    }

}


//폴더를 패키지로 인정해줘야한다.

package BookPack;

public class Book{

    private String title;

    private String author;

    private int year;

    

    

    public Book(String title, String author, int year){

        this.title = title;

        this.author = author;

        this.year = year;

        }

    public void display(){

        System.out.println("책제목:" + title);

        System.out.println("작가:" + author);

        System.out.println("출판년도:" + year);

    }

}




참고로 System.out.println(); 은 원래

java.lang.System.out.println(); dmfh Tjdigksmsep

java.lang은 기본 core 핵심 패키지이기 때문에 생략할 수 있다.

java.lang 이외에 다른 것은 생략 할 수 없다.



만약 BookTest를 따로 다른 폴더에 옮겨 실행한다면 어떨까?





실행해보면 실행이 안된다.

어떻게 해야할까?

이 때 환경변수를 설정한다.


패키지를 모아 놓은 것을 라이브러리라고 한다.

이렇게 위치를 바꿀 때마다 다시 위치설정을 해야한다면

라이브러리를 사용할 때 너무 불편할 것이다.


Path

- 실행파일을 어디서나 경로와 상관없이 실행할 수 있도록 설정


ClassPath

- Class를 어디서나 경로와 상관없이 실행할 수 있도록 설정

여기서 .은 현재위치 ; 은 연결



classpath 라는 환경변수를 설정하고

.; + 내가 쓰고자 하는 클래스의 상위폴더

를 쓴다.


 



그리고 실행을 해본다.



★ 압축파일 jar


jar라는 프로그램은 압축프로그램이다. jar로 압축을 하면 java에서 쉽게 쓸 수 있기 때문에 편하다.

jar 압축파일을 자바가상머신이 알아서 압축을 풀어주기 때문에 압축을 풀 필요가 없다.

jar라는 파일을 어디에서나 실행할 수 있는 이유는 java를 설치할 때 환경변수를 설치했기 때문이다.

java에 있는 jar 프로그램을 확인해보고 dos에서 실행해보자.





jar --를 치면 jar의 도움말과 옵션을 확인할 수 있다.


참고로 모든 프로그램은 압축까지 해야 마무리가 된다.


jar cvf 옵션을 찾아보자.

압축을 할 때 쓰는 옵션은 3가지 이다.

c : 압축파일을 실행해주는 옵션

v: 정보들을 보여주는 옵션

f : 내가 원하는 이름으로 압축 할 수 있음

jar로 압축을 하면 java에서 쉽게 쓸 수 있기 때문에 편하다.


압축할 때에는 이 세가지 옵션을 많이 쓴다.

압축을 풀 때에는 xvf 옵션을 쓴다.

하지만 압축을 푸는 것은 다른 프로그램으로 해도 괜찮다.


도스에서 압축을 해보자.


jar cvf bookpack.jar BookPack


BookPack이라는 이름의 폴더를 압축하겠다.



여기서 확장자 .jar은 바꾸어도 상관없지만 .jar로 쓰는 것을 추천한다.


압축한 bookpack을 환경변수 설정해보자.



이제 멀리 떨어진 BookTest파일을 실행해보자.




실행이 된다.


여기서 환경변수 설정을 수정하면 역시


실행이 안된다.



만든 BookPack 패키지 압축을 풀면 못 보던 폴더가 나오는데 jar가 압축을 위해 만든 파일이다.




또 다른 패키지를 만들어 보자.


//패키지가 길어지면 길어질 수록 매우 복잡하다.

package first.second.third.fourth.fifth;

class PackageTest{

    public static void main(String[] args){

        System.out.println("패키지 테스트");

    

    }

}


이런 경우 패키지가 길어지면 길어질 수록 패키지 폴더를 하나씩 직접 만들어야 해서 너무 귀찮다.

이런경우 어떻게 패키지를 만들어야 할까?


이럴 때는 실행하고자 하는 파일에서 도스창을 불러온 뒤


javac -d . PackageTest.java


라고 쓰면 된다.

여기서 -d 는 실행하고자 하는 폴더를 찾아주기도 하지만 패키지 폴더를 만들어주기도 하는 명령어이다.

. 은 현재위치를 말한 것이다.


이제 패키지를 배웠으니 다시 접근제어명시자를 살펴보자.


Protected

Protected는 밖에서는 클래스를 보호하면서 안에서는 쉽게 쓸 수 있도록 상속도 해준다.




//폴더를 패키지로 인정해줘야한다.

package BookPack;

public class Book{

    //public 외부로부터 접근가능

    public String title;

    //protected로 바꾸면 자식클래스에게 상속받으면서 외부 침입을 지킬 수 있다.

    protected String author;

    protected int year;

    

    //기본생성자는 항상 만들어줘라

    public Book(){}

    public Book(String title, String author, int year){

        this.title = title;

        this.author = author;

        this.year = year;

        }

    public void display(){

        System.out.println("책제목:" + title);

        System.out.println("작가:" + author);

        System.out.println("출판년도:" + year);

    }

}



import BookPack.Book;

class BookExt extends Book{

    private String pubName;

    

    public BookExt(String t, String a, int y, String p){

        

        title = t;

        author = a;

        year = y;

        pubName = p;

        /*

        //내가 저장할 능력이 없으므로 부모 생성자를 호출한다.

        super(t, a, y);

        pubName = p;

        */

        

    }

    public void display(){

        super.display();

        System.out.println("출판사명:"+pubName);

        System.out.println();

    }    

}


//import를 쓰면 패키지 이름을 생략 할 수 있다.

import BookPack.Book;

public class BookTest{

    public static void main(String[] args){

        

        BookExt[] books = new BookExt[4];

        //연도는 임의대로

        books[0] = new BookExt("어린왕자", "생떽쥐베리",1900, "영진");

        books[1] = new BookExt("홍길동전", "허균",1800, "정보문화사");

        books[2] = new BookExt("동의보감", "허준",1850, "홍익");

        books[3] = new BookExt("난중일기", "이순신",1870, "제이펍");

    

        for(int i=0; i<books.length; i++){

                books[i].display();

        }

        //java.lang은 기본 core 핵심 패키지이기 때문에 생략할 수 있다.

        //java.lang 이외에 다른 것은 생략 할 수 없다.

        System.out.println("...");

        

        books[0].title = "늙은왕자";

        books[0].display();

        

        books[0].author = "생쥐";

    }

}




★javaAPI 꼭 공부해야하는 패키지


java.base


1.java.lang : 기본 패키지 ★

2.java.util : 유용한 기능 ★



java.IO : 입출력


java.~ : 자바 초창기부터 있던 패키지

javax.~ : 나중에 추가된 패키지


https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html



JAVA패키지를 출력할 때 두 가지 주의 할 점!

1. 패키지는 상위 폴더에서, 실행파일이 있는 곳에서 실행한다.

- 주로 bin 폴더이다.


2. 패키지 이름+클래스이름 을 함께 쓴다. 

예) java bitestream.ByteTest1



'개발 > Java' 카테고리의 다른 글

[java] java.util 패키지를 알아보자.  (0) 2017.10.27
[java] 인터페이스(InterFace)  (0) 2017.10.26
[java] 클래스 (Class) part.3 : 상속 (Inheritance )  (0) 2017.10.24
[java] 클래스 (Class) part.2  (0) 2017.10.24
[java] 배열 (Array)  (0) 2017.10.19

+ Recent posts