본문 바로가기
카테고리 없음

Java 접근제어자 (public, private, protected)

by Hoft 2025. 1. 2.

Java에서의 접근 제어자(Access Modifiers)

Java의 접근 제어자는 클래스, 메서드, 변수 등에 대한 접근 범위(사용 권한)를 제어하는 데 사용됩니다.

이를 통해 캡슐화를 구현하고, 코드의 보안성과 유지 보수성을 높일 수 있습니다.

주요 접근 제어자인 Public, Private, Protected 에 대해 알아볼게요.

 

Java 접근제어자

 


1. 접근 제어자의 종류와 특징

1.1 public

  • 설명: public으로 지정된 멤버는 어디서든 접근 가능합니다.
  • 사용 위치: 클래스, 메서드, 필드(변수)
  • 특징:
    • 같은 패키지와 다른 패키지의 클래스에서도 접근할 수 있습니다.
    • 주로 공용 API라이브러리를 작성할 때 사용됩니다.

public class PublicExample {
    public String message = "Hello, World!";
    
    public void printMessage() {
        System.out.println(message);
    }
}

1.2 protected

  • 설명: protected 멤버는 같은 패키지와 **서브클래스(상속 관계)**에서만 접근 가능합니다.
  • 사용 위치: 메서드, 필드
  • 특징:
    • 상속을 통해 하위 클래스에서 접근할 수 있지만, 외부 클래스에서는 직접 접근이 불가능합니다.
    • 주로 상속 구조에서 상위 클래스의 멤버를 하위 클래스에서 사용하도록 허용할 때 유용합니다.
package example;

public class Parent {
    protected String message = "Hello from Parent";
    
    protected void showMessage() {
        System.out.println(message);
    }
}

class Child extends Parent {
    public void display() {
        showMessage(); // 상속받은 protected 메서드 접근 가능
    }
}

1.3 default (package-private)

  • 설명: 접근 제어자를 명시하지 않은 경우, 기본값은 default이며 같은 패키지 내에서만 접근 가능합니다.
  • 사용 위치: 클래스, 메서드, 필드
  • 특징:
    • 외부 패키지에서는 접근이 불가능합니다.
    • 같은 프로젝트 내에서 특정 모듈 간의 협업을 위해 사용됩니다.
class DefaultExample {
    String message = "Default Access Modifier";
    
    void printMessage() {
        System.out.println(message);
    }
}

1.4 private

  • 설명: private 멤버는 클래스 내부에서만 접근 가능합니다.
  • 사용 위치: 메서드, 필드
  • 특징:
    • 외부 클래스 또는 하위 클래스에서는 접근할 수 없습니다.
    • 주로 캡슐화를 위해 사용되며, 외부에 노출되어서는 안 되는 데이터를 보호합니다.
public class PrivateExample {
    private String secret = "This is private!";
    
    private void printSecret() {
        System.out.println(secret);
    }
    
    public void accessSecret() {
        printSecret(); // 내부에서만 접근 가능
    }
}

2. 접근 제어자의 비교

접근 제어자 동일클래스 동일패키지 하위 클래스
상속 관계 (다른 패키지)
외부 클래스
다른 패키지
public O O O O
protected O O O X
default O O X X
private O X X X

 


3. 활용 사례

  1. 캡슐화를 통한 보안 강화
    • 클래스의 내부 데이터(private)를 숨기고, 접근 메서드(getter, setter)를 통해 필요한 경우에만 데이터를 제공.
    public class Person {
        private String name;
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }
    
  2. 상속 구조에서 데이터 보호
    • protected를 사용하여 하위 클래스에서만 데이터를 공유.
    public class Animal {
        protected String sound;
        
        public void makeSound() {
            System.out.println(sound);
        }
    }
    
    public class Dog extends Animal {
        public Dog() {
            this.sound = "Bark";
        }
    }
    
  3. 모듈화된 코드 설계
    • default를 사용하여 패키지 간의 불필요한 접근을 제한.

4. 주의사항

  1. 최소 권한 원칙
    • 클래스 또는 멤버는 필요한 최소한의 접근 수준만 허용해야 합니다.
    • 예: 외부에서 사용할 필요가 없다면 private 또는 default로 지정.
  2. 상속 사용 시 protected의 오용 주의
    • protected 멤버가 많아지면 하위 클래스에서 지나치게 많은 정보를 노출할 위험이 있습니다.
  3. API 설계 시 public의 남용 금지
    • public 멤버가 많아질수록 변경 시 호환성 문제가 발생할 가능성이 높아집니다.

 

댓글