공부/Java

자바 패키지

Stair 2024. 8. 31. 12:34
반응형

소규모의 프로그램은 상관없지만 기능이 정말 많아 프로그램이 커지게 된다면 많은 클래스가 등장하며 기능들 분류가 어려워질 것이다.

 

이러한 문제를 해결하기위해 패키지라는 개념을 제공한다.

패키지를 동해 기능별로 클래스를 묶거나 관련 있는 것들을 묶을 수 있다.

 

 

package pack;

public class Data {

    public Data(){
        System.out.println("패키지 pack Data 생성");
    }

}

 

pack 패키지에 Data라는 클래스를 만들고 생성자도 만들었다.

 

이번엔 pack의 하위 패키지 a를 만들어보자.

package pack.a;

public class User {

    public User(){
        System.out.println("패키지 pack.a 회원 생성");
    }
}

 

package pack.a; 와 같이 패키지 하위에 패키지를 만들수도 있다.

 

생성자에는 public 을 사용했다. 다른 패키지에서 이 클래스의 생성자를 호출하려면 public 을 사용해야 한다. 자세한 내용은 접근 제어자에서 설명한다. 지금은 코드와 같이 생성자에 public 키워드를 넣어두자

 

 

이렇게 다른 패키지에 있는 클래스를 어떻게 사용해야 할까?

이런 경우엔 pack.a.User로 풀 네임을 적어주며 객체를 생성해야 한다.

 

package pack;

public class PackageMain1 {
    public static void main(String[] args) {
        Data data = new Data();
        pack.a.User user = new pack.a.User();
    }
}

 

PackageMain1은 pack 패키지 안에 있고 pack패키지 하위에 있는 a 패키지의 User를 풀네임으로 호출하는 코드이다.

패키지를 풀네임으로 사용하는건 불편하기 그지 없다.

이런 문제를 해결해 주는게 import 이다.

package pack;

import pack.a.User;

public class PackageMain2 {
    public static void main(String[] args) {
        Data data = new Data();
        User user = User();
    }
}

 

import pack.a.User를 통해 풀네임을 쓰지 않고도 사용할 수 있다.

만약 pack.a의 패키지에서 User클래스 한개가 아닌 다른 클래스들도 같이 사용하고 싶을땐 애스터리스크(*)를 사용하여 해결할 수 있다.

package pack.a;

public class User {

    public User(){
        System.out.println("패키지 pack.a 회원 생성");
    }
}

 

package pack.a;

public class User2 {

    public User2(){
        System.out.println("패키지 pack.a 회원 생성");
    }
}
package pack;

import pack.a.*;

public class PackageMain2 {
    public static void main(String[] args) {
        Data data = new Data();
        User user = new User();
        User user2 = new User();
    }
}

 

 

만약 다른 패키지의 동일한 이름의 클래스가 있을때 이 두개를 호출하고 싶은 경우에는 어떻게 해야할까?

이럴 땐 어쩔 수 없이 둘중 하나는 풀네임을 다 적어주어야 한다.

package pack.a;

public class User {

    public User(){
        System.out.println("패키지 pack.a 회원 생성");
    }
}
package pack.b;

public class User {

    public User(){
        System.out.println("패키지 pack.b 회원 생성");
    }
}

 

package pack;


import pack.a.User;

public class PackageMain3 {
    public static void main(String[] args) {
        User userA = new User();
        pack.b.User userB = new pack.b.User();
    }
}

 

 

 

이러한 패키지들도 규칙이 있다.

1. 패키지의 이름과 이치는 폴더 위치와 같아야한다.(필수)

2. 패키지 이름은 모두 소문자를 사용한다.(관례)

3. 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. com.company.myapp 과 같이 사용한다.(관례)

 

패키지는 보통 다음과 같이 계층 구조를 이룬다.

a

a.b

a.c

계층 구조상 a 패키지 하위에 a.b, a.c가 있다. 근데 이것은 우리 눈에 보기에 계층 구조를 이룰 뿐 서로 완전히 다른 패키지 이다. 따라서 a패키지의 클래스에서 a.b 패키지의 클래스가 필요하면 import 해서 사용해야 한다. 반대도 물론 마찬가지이다.

 

정리하면 패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지이다. 사람이 이해하기 쉽게 계층 구조를 잘 활용해서 패키지를 분류하는것은 좋다.

 

패키지를 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고, 관련이 적은 클래스는 다른 패키지로 분리하는 것이 좋다.

 

 

 

 

반응형

'공부 > Java' 카테고리의 다른 글

자바 메모리 구조와 static  (2) 2024.09.02
자바 접근 제어자  (5) 2024.08.31
자바 생성자  (1) 2024.08.30
자바 객체 지향 프로그래밍  (0) 2024.08.30
자바 기본형과 참조형  (0) 2024.08.29