[Day 4 | Java] 접근제어자

y♡ding·2024년 10월 17일

데브코스 TIL

목록 보기
20/163

📌 접근 제어자(Access Modifiers)

접근 제어자는 자바에서 클래스, 필드(멤버 변수), 메서드에 대한 접근 범위를 제한하기 위한 키워드이다. 접근 제어자는 캡슐화(Encapsulation)를 구현하는 중요한 요소로, 클래스의 내부 구현을 숨기고 외부로부터 보호하여 데이터의 무결성과 보안성을 유지할 수 있게 한다. 자바에서 제공하는 접근 제어자는 public, protected, default(기본), private 네 가지이다.


🗣️ 각 접근 제어자 설명

1) private

  • 해당 클래스 내부에서만 접근할 수 있으며, 외부 클래스나 상속받은 자식 클래스에서도 접근할 수 없다.

  • 클래스 내부에서만 관리하고 외부에서는 접근을 차단하고 싶은 경우에 사용한다. 보통 캡슐화를 위해 필드(변수)를 private로 선언하고, 외부에서 접근할 수 없도록 설정한다.

    class Example {
        private String secret = "비밀";
    
        private void displaySecret() {
            System.out.println(secret);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Example ex = new Example();
            // ex.secret;  // 컴파일 에러 (private 접근 불가)
            // ex.displaySecret();  // 컴파일 에러 (private 메서드 접근 불가)
        }
    }

2) public

  • 어디서든지 접근 가능한 접근 제어자이다. 클래스, 패키지, 상속 관계와 무관하게 모든 클래스에서 접근할 수 있다.

  • 클래스나 메서드를 외부에서 자유롭게 사용할 수 있도록 허용하고 싶을 때 사용한다. 주로 공용 API에 많이 사용된다.

    public class Example {
        public String name = "공개된 이름";
    
        public void displayName() {
            System.out.println(name);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Example ex = new Example();
            System.out.println(ex.name);  // public 필드 접근 가능
            ex.displayName();  // public 메서드 호출 가능
        }
    }

3) protected

  • 같은 패키지 내에서는 자유롭게 접근할 수 있으며, 다른 패키지에 있는 경우에는 상속받은 자식 클래스에서만 접근할 수 있다. 즉, 상속 관계에서는 부모 클래스의 protected 멤버에 접근이 가능하다.

  • 외부에서 무분별한 접근을 막으면서도, 상속 관계에서는 접근을 허용하고 싶을 때 사용한다.

    class Parent {
        protected String familySecret = "가족 비밀";
    }
    
    class Child extends Parent {
        void displaySecret() {
            System.out.println(familySecret);  // protected 접근 가능
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Child c = new Child();
            c.displaySecret();  // 자식 클래스에서 부모의 protected 멤버에 접근 가능
        }
    }

4) default (기본 접근 제어자)

  • 접근 제어자를 명시하지 않은 경우 적용되며, 같은 패키지 내에서만 접근할 수 있다. 패키지 외부에서는 접근이 불가능하다.

  • 외부 패키지에서는 접근할 수 없도록 제한하고, 패키지 내부에서만 사용할 수 있는 클래스나 메서드를 만들 때 사용한다.

    class Example {
        String packageLevelAccess = "패키지 레벨 접근";
    }
    
    public class Main {
        public static void main(String[] args) {
            Example ex = new Example();
            System.out.println(ex.packageLevelAccess);  // 같은 패키지 내에서 접근 가능
        }
    }


1️⃣ 필드(변수)에 대한 접근 제어

  • 필드에 대한 접근 제어는 주로 데이터 은닉을 위한 목적으로 사용되며, 외부에서 멤버 변수를 직접 조작하는 것을 막고 메서드를 통해서만 간접적으로 조작할 수 있도록 한다.
  • private로 필드를 선언하고, getter와 setter 메서드를 public으로 만들어 외부에서 안전하게 접근할 수 있다.
class Example {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Example ex = new Example();
        ex.setAge(30);  // setter를 통해 값 설정
        System.out.println(ex.getAge());  // getter를 통해 값 가져오기
    }
}

2️⃣ 메서드에 대한 접근 제어

  • 메서드에도 접근 제어자를 사용하여 외부에서 호출 가능한 범위를 제한할 수 있다.
  • private 메서드는 클래스 내부에서만 호출 가능하며, public 메서드는 외부에서 자유롭게 호출할 수 있다. protected는 상속 관계에서만 외부 접근이 가능하게 설정된다.
class Example {
    public void publicMethod() {
        System.out.println("public 메서드");
    }

    private void privateMethod() {
        System.out.println("private 메서드");
    }
}

public class Main {
    public static void main(String[] args) {
        Example ex = new Example();
        ex.publicMethod();  // 호출 가능
        // ex.privateMethod();  // 호출 불가 (컴파일 에러)
    }
}



접근 제어자같은 클래스같은 패키지상속받은 자식 클래스외부(전체)
privateOXXX
(default)OOXX
protectedOOOX
publicOOOO


👌🏻 접근 제어자의 활용

캡슐화

  • 접근 제어자를 통해 클래스의 내부 구현을 감추고, 외부에서 필요한 부분만 접근할 수 있도록 함으로써 캡슐화가 이루어진다. 이를 통해 데이터의 무결성을 보장하고 코드의 안정성을 높일 수 있다.

정보 은닉

  • 필드를 private로 선언하고, 외부에서는 getter/setter를 통해 접근하도록 하는 방식으로 정보 은닉을 실현할 수 있다.

상속과 다형성

  • protected는 상속을 통해 자식 클래스에서 부모 클래스의 필드와 메서드를 활용할 수 있도록 하여 다형성을 구현할 때 유용하게 사용된다.

자바의 접근 제어자는 클래스, 필드, 메서드의 접근 범위를 제한하여 코드의 안전성과 유지보수성을 향상시키는 중요한 기능이다. 각 접근 제어자는 필요에 맞게 적절히 설정하여, 데이터 은닉, 상속, 패키지 관리 등의 다양한 목적을 달성할 수 있다.

0개의 댓글