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

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

by Hoft 2025. 1. 2.
728x90
반응형

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 멤버가 많아질수록 변경 시 호환성 문제가 발생할 가능성이 높아집니다.

 

728x90
반응형

댓글