본문 바로가기
IT/김영한의실전JAVA-기본_inFlearn

5. 패키지 - 시작 / 패키지(import) / 패키지 규칙 / 패키지 활용

by for-learn 2025. 2. 9.

5-1. 패키지 시작

쇼핑몰 시스템을 개발한다고 가정했을 때, 기능이 점점 추가되어 프로그램이 아주 커지게 됨

매우 많은 클래스가 등장하고 이를 관련있는 기능들끼리 분류해서 관리 => 패키지

pack.Data.java (패키지 위치에 주의)

package pack; 
// 패키지를 사용하는 경우 항상 코드 첫줄에 package pack과 같이 패키지 이름 입력

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

pack.a.User.java

package pack.a;

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

다른 패키지에서 이 클래스의 생성자를 호출하려면 생성자에 public 을 사용해야 함.

pack.PackageMain1.java

package pack;

public class PackageMain1 {
    public static void main(String[] args) {
        Data data = new Data(); // PackageMain1과 같은 패키지의 클래스
        pack.a.User user = new pack.a.User(); // 다른 패키지의 클래스
    }
}
  • 사용자와 같은 위치: 패키지 경로 생략
  • 사용자와 다른 위치: 패키지 전체 경로를 포함해서 클래스 입력

 

5-2. 패키지 - import

다른 패키지의 클래스를 사용할 때, 전체 경로를 적는 것 대신 import를 사용

pack.PackageMain2.java

package pack;

import pack.a.User; // 다른 패키지의 User 클래스 사용
import pack.a.*; // pack.a 패키지의 모든 클래스 사용(User, Useer2)

public class PackageMain2 {
    public static void main(String[] args) {
        Data data = new Data(); // PackageMain1과 같은 패키지의 클래스
        User user = new User(); // import 사용으로 패키지 명 생략 가능
        User2 user2 = new User2(); // *로 모든 클래스 사용
    }
}

 

클래스 이름 중복

pack.a.User
pack.b.User

pack.b.User.java

package pack.b;

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

pack.PackageMain3.java

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();
    }
}
  • 다른 패키지의 같은 이름의 클래스를 사용하고 싶으면,
  • 다른 하나의 클래스는 패키지를 포함한 전체 경로를 입력해야 함.

 

5-3. 패키지 규칙

  • 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수) => ex) C:\java_learn\java-basic ~~~
  • 패키지 이름은 모두 소문자를 사용한다. (관례)
  • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다.
    예를 들어, com.company.myapp 과 같이 사용한다. (관례) => 큰개념.회사명.회사앱명
    • 이 부분은 필수는 아니지만, 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있다. 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있다.
    • 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다.
    • 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통 문제가 되지 않는다

패키지와 계층 구조

- a
  - b
  - c

a, a.b, a.c 3개의 패키지가 존재

 

계층 구조상 a 패키지 하위에 a.b, a.c 패키지가 있지만, a 패키지와 a.b, a.c 패키지는 서로 완전히 다른 패키지이다.

a 패키지의 클래스에서 a.b 패키지의 클래스가 필요하면 import해서 사용해야 함.

 

패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지.

 

5-4. 패키지 활용 (예시)

com.helloshop.user 패키지

package com.helloshop.user;

public class User {
    String userId;
    String name;
}
package com.helloshop.user;

public class UserService {
}

com.helloshop.product 패키지

package com.helloshop.product;

public class Product {
    String productId;
    int price;
}
package com.helloshop.product;

public class ProductService {
}

com.helloshop.order 패키지

package com.helloshop.order;

import com.helloshop.product.Product;
import com.helloshop.user.User;

public class Order {
    User user;
    Product product;

    public Order(User user, Product product) {
        this.user = user;
        this.product = product;
    }
}
package com.helloshop.order;

import com.helloshop.product.Product;
import com.helloshop.user.User;

public class OrderService {
    public void order() {
        User user = new User();
        Product product = new Product();
        Order order = new Order(user, product);
    }
}
package com.helloshop.order;

public class OrderHistory {
}