[Day 4 | Java] 접근제어자

y♡ding·2024년 10월 17일
0

데브코스 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로 필드를 선언하고, gettersetter 메서드를 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개의 댓글

관련 채용 정보