자바 클래스들을 정리하는 폴더
ㄴ패키지로 클래스들을 나눠서 정리
- com.naver.User
- com.kakao.User
- 내가 만든 프로그램에 있는 클래스들
1. Game.java
2. GameSound.java
3. Member.java
4. Member.Login.java
한 곳에 두면 처음엔 괜찮지만 나중에는 복잡해짐
=> 다른 패키지에 분리해서 저장
- game 폴더(패키지)
1. Game.java
2. GameSound.java
- member 폴더(패키지)
1. Member.java
2. MemberLogin.java
이렇게 하면 보기도, 유지보수도 쉬워짐
리팩토리해서 클래스가 따로 분리되는것 = 패키지를 분리한 것
리팩토리 하지 않고 한 페이지에 여러 클래스를 작성하는 것은
패키지로 분리된 것이 아님
단순히 클래스만 리팩토리하는 것이 아닌 패키지를 따로 만들어
패키지 안에 클래스를 리팩토리하여 완전히 분리해야 함

public class Test {
public static void main(String[] args) {
System.out.println("Hello");
}
}
위처럼 package문이 없는 클래스는 기본 패키지임
- 선언문 문법
package 패키지명;
- 선언문은 반드시 자바 파일 최상단에 있어야 함
package 패키지명;
import java.util.Scanner;
public class Main{
}
- 파일 위치와 패키지명은 같아야 함
패키지명 파일 경로
package com.test; com/test/파일명.java
package game; game/파일명.java
(패키지 없음) 프로젝트 루트(최상위 폴더)
위치가 맞지 않으면 컴파일 오류 발생하거나,
실행 시 클래스를 찾지 못 할 수도 있음
다른 패키지에 있는 클래스를 내 코드에서 사용하는 경우
import를 통해 호출함
- game/Game.java
package game;
public class Game {
public void start() {
System.out.println("게임 시작!");
}
}
- Main.java
import game.Game; // 패키지 호출
public class Main {
public static void main(String[] args) {
Game g = new Game();
g.start();
}
}
클래스, 변수, 메서드 등을 누가 어디까지 접근 가능한지 정해주는
제어장치
보안, 유지보수, 역할구분에 편리함
public class Car {
public String brand = "Hyundai";
public void drive() {
System.out.println("달립니다!");
}
}
어디서든 이 클래스를 사용 가능
다른 패키지에서도 호출을 통해 자유로운 사용 가능
public class BankAccount {
private int balance = 10000;
public void showBalance() {
System.out.println("잔액: " + balance);
}
}
같은 클래스 내부에서만 접근 가능
외부에서는 직접 접근이 불가
외부에서 접근하려면 public메서드를 통해서만 가능
class Dog {
String name = "푸들";
}
접근제어자를 안 붙이면 default임
같은 패키지 안에서 접근이 가능하며, 다른 패키지에선 불가
public class Animal {
protected String sound = "멍멍";
}
같은 패키지에서 접근 가능
다른 패키지여도 상속받은 자식클래스는 접근 가능
다른 패키지와 일반 클래스에서는 접근 불가

1) private과 public 실습 (기초)
class Main {
public static void main(String[] args) {
User u = new User("jsw");
System.out.println("초기 이름: " + u.getName());
u.setName("jsu");
System.out.println("변경된 이름: " + u.getName());
}
}
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() { // return값이 name인 메서드
return name;
}
public void setName(String name) { // return 값이 없는 void 타입의 메서드
this.name = name;
}
}
2) default 접근제어자 실습 (중간)
class Main{
public static void main(String[] args) {
Person p = new Person();
p.address = "Seoul";
System.out.println(p.address);
}
}
class Person {
String address;
}
앞에 아무것도 붙지 않으면 default 접근제어자로 같은 클래스와
패키지에서만 접근이 가능함
3) protected 접근제어자 실습 (중상)
- 같은 패키지에서 사용하는 경우
class Main{
public static void main(String[] args) {
Dog d = new Dog("멍멍");
System.out.println(d.sound);
}
}
class Animal {
protected String sound;
Animal(String sound) {
this.sound = sound;
}
}
class Dog extends Animal {
Dog(String sound) {
super(sound);
}
}
- 다른 패키지에서 사용하는 경우
Main class)
import animal.Dog; // animal 패키지의 Dog클래스 호출
public class Main{
public static void main(String[] args) {
Dog d = new Dog("멍멍"); // Dog타입 d 객체 선언
System.out.println(d.getSound());
}
}
Animal class)
package animal; // animal 패키지 선언
public class Animal {
protected String sound;
// sound는 같은 패키지 또는 자식 클래스에서만 접근 가능
public Animal(String sound) {
// public 생성자 생성
this.sound = sound;
}
public String getSound() {
return sound;
}
// sound값을 반환하는 public 메서드 생성
}
Dog class)
package animal; // animal 패키지 선언
public class Dog extends Animal { // Animal클래스 상속
public Dog(String sound) { // public 생성자 생성
super(sound); // 상속받은 생성자 정보
}
}
4) 각 접근제어자 테스트
public class Main {
public static void main(String[] args) {
Sample1 s1 = new Sample1();
Sample2 s2 = new Sample2();
Sample3 s3 = new Sample3();
Sample4 s4 = new Sample4();
System.out.println(s1.a);
System.out.println(s2.b);
System.out.println(s3.c);
System.out.println(s4.getD());
}
}
class Sample1 {
public int a = 1; // 어디서든 접근 가능
}
class Sample2{
protected int b = 2; // 같은 패키지, 상속받은 클래스에서 접근 가능
}
class Sample3{
int c = 3; // 같은 패키지에서 접근 가능
}
class Sample4 {
private int d = 4; // 같은 클래스에서만 접근 가능
public int getD() { // public 메서드를 통해서 접근은 가능함
return d;
}
}