1. 개념

    1. 클래스와 인터페이스를 논리적으로 묶는 단위
    2. 파일 시스템에서는 디렉터리(폴더) 구조로 표현됨
    3. 대규모 프로젝트에서 이름 충돌 방지, 코드 관리 용이성 확보
  2. 예시

    package com.example.member //여기 부분이다.
    
    public class Member{
    	private String name;
    	
    }
    
    1. 이런 경로 구조와 연결됨
  3. 패키지 규칙

    1. 소문자 사용
    2. 일반적으로 도메인 역순 사용 → com.company.project.module
    3. 특별한 이유 없으면 숫자 언더스코어 지양
  4. 구조 규칙

    1. 패키지 이름과 실제 디렉터리 구조가 일치해야 함
    2. package com.example.test; 라면 실제 경로는 src/com/example/test/
  5. 접근제어

    1. 같은 패키지에 있으면 default 접근제어자는 공유 가능
    2. 다른 패키지라면 public 이어야 가능
  6. import 규칙

    1. 다른 패키지의 클래스를 쓰려면 import필요
    2. import java.util.*; → 와일드카드 사용 가능(권장 x, 명시적으로 쓰는 것이 좋음)
  7. java.lang 패키지

    1. String, Object, System 같은 클래스들이 들어있음
    2. 자동 import 되므로 따로 적지 않아도 됨
  8. 장점

    1. 코드 관리가 편함
    2. 클래스 이름 충돌 방지
    3. 접근 제어를 통한 캡슐화 강화
  9. 단점

    1. 패키지가 많아지면 import가 많아짐
      1. 구조가 복잡하면 오히려 헷갈림
  10. default 특징

    1. 키워드 없음

    2. 같은 패키지 안에서는 자유롭게 쓸 수 있지만, 다른 패키지에서는 접근 불가

    3. 예시

      // 같은 패키지 안에 있는 경우
      package com.example.util;
      
      class Helper{
      	void printHello(){
      		System.out.println("Hello");
      		}
      }
      
      //같은 패키지
      package com.example.util;
      
      public class test {
      	public static void main(String [] args){
      		Helper h = new Helper(); // 0 {같은 패키지여서 접근 가능}
      		h.printHello(); // 0 
      	}
      }
      
      package com.example.main;
      
      import com.example.util.Helper;
      
      public class App{
      	public static void main(String [] args){
      		Helper h = new Helper(); // x 컴파일 에러(default라 접근 불가)
      	}
      }