5월 31일 -접근 제어 지시자

Yullgiii·2024년 5월 31일
0
post-thumbnail

접근 제어 지시자

자바에서 접근 제어 지시자는 클래스, 변수, 메소드 등의 접근 범위를 제어하는 데 사용된다. 이는 캡슐화를 구현하고 클래스 간의 의존성을 낮추는 데 중요한 역할을 한다. 기본적인 부분이지만, 실제로 사용할 때 의미를 파악하지 않고 남발하는 경우가 많아 정리하려 한다.

접근 제어 지시자의 종류

public

  • 설명: public으로 선언된 멤버는 어떤 클래스에서라도 접근이 가능하다. public 메소드는 private 멤버와 프로그램 사이의 인터페이스 역할을 수행하기도 한다.

  • 예제:

    public class Example {
        public int publicField;
    
        public void publicMethod() {
            System.out.println("This is a public method.");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Example example = new Example();
            example.publicField = 10;
            example.publicMethod();
        }
    }

    protected

  • 설명: protected 멤버를 포함하는 클래스가 정의되어 있는 해당 패키지 내 그리고 해당 클래스를 상속 받은 외부 패키지의 자식 클래스에서 접근이 가능하다.

  • 예제:

public class Parent {
    protected int protectedField;

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}

public class Child extends Parent {
    public void accessProtected() {
        protectedField = 10;
        protectedMethod();
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.accessProtected();
    }
}

private

  • 설명: private으로 선언된 멤버는 해당 멤버를 선언한 클래스에서만 접근이 가능하다. public 메소드를 이용하면 해당 객체의 private 멤버에 접근이 가능하다.
  • 예제:
public class Example {
    private int privateField;

    public int getPrivateField() {
        return privateField;
    }

    public void setPrivateField(int privateField) {
        this.privateField = privateField;
    }
}

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        example.setPrivateField(10);
        System.out.println(example.getPrivateField());
    }
}

Default (package private)

  • 설명: 접근 제어 지시자를 명시하지 않으면 기본적으로 default 접근 제어가 적용된다. 이는 같은 클래스의 멤버와 해당 클래스가 정의되어 있는 패키지 내에서만 접근이 가능하다.
  • 예제:

class Example {
    int defaultField;

    void defaultMethod() {
        System.out.println("This is a default method.");
    }
}

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        example.defaultField = 10;
        example.defaultMethod();
    }
}

참고 사항

private의 경우

private 멤버나 메소드를 가지고 있는 클래스를 A라고 하자. 그리고 B라는 클래스가 A를 상속받는다. 이 경우, B 클래스는 private으로 선언된 멤버 혹은 메소드에 접근할 수 없다. 따라서 상속을 받더라도 private한 멤버에는 접근이 불가능하다. 대신, public 메소드를 통해 getter를 만들면 private 멤버를 사용할 수 있다.


public class A {
    private int privateField;

    public int getPrivateField() {
        return privateField;
    }

    public void setPrivateField(int privateField) {
        this.privateField = privateField;
    }
}

public class B extends A {
    public void display() {
        // privateField는 접근 불가
        System.out.println(getPrivateField()); // getter를 통해 접근
    }
}

protected의 경우

protected 멤버나 메소드를 가지고 있는 클래스를 A라고 하자. 마찬가지로 B라는 클래스가 A를 상속받는다. 이 경우, B 클래스는 protected로 선언된 멤버 혹은 메소드에 접근이 가능하다. B라는 클래스가 다른 패키지에 선언되었을지라도 A 클래스의 멤버에 접근이 가능하다. 하지만, 다른 패키지의 A 클래스를 상속받지 않은 클래스는 A 클래스의 멤버에 접근할 수 없다. 마치 private처럼 말이다.


public class A {
    protected int protectedField;

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}

public class B extends A {
    public void display() {
        protectedField = 10; // 접근 가능
        protectedMethod();   // 접근 가능
    }
}

So...

접근 제어 지시자는 클래스, 변수, 메소드 등의 접근 범위를 제어하여 코드의 캡슐화를 돕고, 클래스 간의 의존성을 낮춘다. public, protected, private, default의 접근 범위와 사용 사례를 이해하고 적절하게 사용하는 것이 중요하다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글