[JAVA] 패키지, 접근제어자

장성욱·2025년 7월 13일

JAVA

목록 보기
22/23

패키지

자바 클래스들을 정리하는 폴더
ㄴ패키지로 클래스들을 나눠서 정리

패키지를 사용해야 되는 이유

  1. 클래스를 논리적으로 그룹화하여 프로젝트 구조 깔끔하게 정리 가능
  2. 클래스 이름이 겹쳐도 구분 가능
- com.naver.User
- com.kakao.User
  1. 접근 제어자와 함께 사용해 캡슐화를 도와줌
- 내가 만든 프로그램에 있는 클래스들
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

이렇게 하면 보기도, 유지보수도 쉬워짐

리팩토리해서 클래스가 따로 분리되는것 = 패키지를 분리한 것

리팩토리 하지 않고 한 페이지에 여러 클래스를 작성하는 것은
패키지로 분리된 것이 아님

단순히 클래스만 리팩토리하는 것이 아닌 패키지를 따로 만들어
패키지 안에 클래스를 리팩토리하여 완전히 분리해야 함

기본 패키지 (default package)

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

위처럼 package문이 없는 클래스는 기본 패키지임
  • 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();
    }
}

접근제어자(Access Modifier)

클래스, 변수, 메서드 등을 누가 어디까지 접근 가능한지 정해주는
제어장치
보안, 유지보수, 역할구분에 편리함

public

public class Car {
    public String brand = "Hyundai";
    public void drive() {
        System.out.println("달립니다!");
    }
}

어디서든 이 클래스를 사용 가능
다른 패키지에서도 호출을 통해 자유로운 사용 가능

private

public class BankAccount {
    private int balance = 10000;

    public void showBalance() {
        System.out.println("잔액: " + balance);
    }
}

같은 클래스 내부에서만 접근 가능
외부에서는 직접 접근이 불가
외부에서 접근하려면 public메서드를 통해서만 가능

default

class Dog {
    String name = "푸들"; 
}

접근제어자를 안 붙이면 default임
같은 패키지 안에서 접근이 가능하며, 다른 패키지에선 불가

protected

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;
  }
}













profile
https://frost-puck-b0f.notion.site/B-2610fdaef71d80c49d1bccdcb575dcb5

0개의 댓글