JAVA/기초공부

[JAVA] 접근 제한자

SoU330 2024. 10. 3. 03:40

 

 

자바에서 접근 제한을 두는 이유

캡슐화 개념을 구현하기 위해서

캡슐화 : 객체 지향 프로그래밍의 중요한 원칙 중 하나로 객체의 내부 상태를 숨기고 외부에서는 제공된 메서드를 통해서만 접근할 수 있도록 제한하는 것. 코드를 더 안전하게 만들고 유지보수를 쉽게 할 수 있다.

 

 

 

 

클래스 접근 제한자

1.  public 접근 제한자

  • 어느 패키지에서나 접근이 가능
  • 프로젝트 내의 모든 코드에서 해당 클래스를 사용할 수 있다.

 

2. default 접근 제한자

  • 접근 제한자를 명시하지 않으면 default 접근 제한자를 갖는다.
  • 같은 패키지 내에서만 접근이 가능하다.

 

public 이 자주 사용되어 해당 클래스가 다른 패키지에서도 사용될 수 있도록 한다.

하지만 내부적인 처리를 위한 클래스는 default로 설정하여 외부에서의 접근을 제한할 수 있다.

 

 

 

 

 

 

 

 

멤버변수, 메소드 접근 제한자

1. public

접근 범위 : 모든 클래스에서 접근 가능

  • 다른 패키지에 있는 클래스에서도 이 변수나 메서드에 접근할 수 있다.

 

2. protected

접근 범위 : 같은 패키지 내의 클래스상속받은 클래스 에서 접근 가능

  • 주로 상속 관계에서 활용된다.
  • 다른 패키지에 있는 상속받지 않은 클래서에서는 접근할 수 없다.

 

3. default

접근 범위 : 같은 패키지 내의 클래스에서만 접근 가능

  • 접근 제한자를 명시하지 않았을 때 기본적으로 적용된다.
  • 패키지 외부에서는 접근할 수 없다.
  • 상속 관계에서도 다른 패키지에 있는 자식 클래스는 접근할 수 없다.

 

4. private

접근 범위 : 같은 클래스 내에서만 접근 가능

  • 외부에서 절대로 접근할 수 없다.
  • 클래스의 내부 상태를 완전히 감출 수 있다.

 

 

 

 

 

 

멤버 변수와 메서드에서의 활용 (캡슐화)

맴버 변수를 private 으로 선언하고 이를 수정하는 메서드(getter, setter) 를 public 으로 제공하는 방식이 일반적이다.

-> 외부에서 직접 변수를 변경하는 것을 막고 데이터의 무결성을 유지한다.

 

 

 

 

 

private 접근 제한자 사용 예

public class PersonInfo {
    private String name;
    private String telNo;
    private int age;

    // 생성자 작성
    public PersonInfo(String name, String telNo, int age) {
        this.name = name;
        this.telNo = telNo;
        this.age = age;
    }

    // Setters() : write
    // Getters() : read

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTelNo() {
        return telNo;
    }

    public void setTelNo(String telNo) {
        this.telNo = telNo;
    }

    public int getAge(){
        return age;
    }

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

-> private 으로 변수를 설정하고 메소드를 통해 접근 가능하도록 구현한 모습

 

public class PersonInfoTest_01 {
    public static void main(String[] args) {
        // 생성자를 통해서 초기값을 전달
        PersonInfo pi = new PersonInfo("소유진","010-3333-0000",25);
        String telNo = pi.getTelNo();
        int age = pi.getAge();
        System.out.println(pi.getName() + " : " + telNo + " : " + age);

        // 부모 클래스내의 private 멤버변수는 자식 클래스에서 직접 접근 불가
//         pi.name = "백종원";
//         pi.age = 33; //이렇게 접근 불가

        // 부모 클래스내의 멤버변수가 private인 경우는 자식 클래스에서 메소드를 통해서 접근 가능
        // setXX() 메소드를 통해거 write
        pi.setName("백종원");
        pi.setTelNo("010-1111-2222");
        pi.setAge(45);

        // getXX() 메소드를 통해서 멤버변수에 저장된 값을 읽어옴(read)
        String name = pi.getName();
        telNo = pi.getTelNo();
        age = pi.getAge();
        System.out.println(name + " : " + telNo + " : " + age);
    }
}

-> 위의 클래스에 정의해둔 메소드를 사용하여 private 변수에 접근하여 값을 읽고 쓴다.

 

-> pi.name 처럼 직접 접근하는 경우 에러가 발생한다.

 

 

 

 

 

 

 

protected 접근 제한자 사용 예

public class PersonInfo_01 {
    protected String name;
    protected String telNo;
    protected int age;

    // 생성자
    public PersonInfo_01(String name, String telNo, int age) {
        this.name = name;
        this.telNo = telNo;
        this.age = age;
    }

    // Setters() 와 Getters() 작성
    public String getName(){
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTelNo() {
        return telNo;
    }

    public void setTelNo(String telNo) {
        this.telNo = telNo;
    }

    public int getAge() {
        return age;
    }

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

-> 멤버변수를 protected로 작성하고 getter,setter 를 만들어 메소드를 통해서 값에 접근 가능하도록 한 모습

 

public class PersonInfoTest_02 {
    public static void main(String[] args) {
        // 생성자를 통해서 초기값을 전달
        PersonInfo_01 pi = new PersonInfo_01("소유진","010-3333-4444",25);

        String telNo = pi.getTelNo();
        int age = pi.getAge();
        System.out.println(pi.getName() + " : " + telNo + " : " + age);

        // 부모 클래스 내의 멤버변수가 protected 인 경우는 직접 접근하여 값을 저장 가능
        pi.name = "안성재";
        pi.telNo = "010-1234-5678";
        pi.age = 33;
        // 멤버변수에 저장된 값을 직접 접근하여 출력
        System.out.println(pi.name + " : " + pi.telNo + " : " + pi.age);

        // 부모 클래스 내의 멤버변수가 protected 이므로 메소드를 통해서도 접근하여 값을 저장 가능
        pi.setName("조은주");
        pi.setTelNo("010-1212-3434");
        pi.setAge(44);
        System.out.println(pi.getName() + " : " + pi.getTelNo() + " : " + pi.getAge());
    }
}

-> protected 는 같은 패키지 내에서 접근 가능하기 때문에 바로 pi.name 처럼 접근이 가능하며 메소드로도 접근이 가능하다.

 

 

 

 

'JAVA > 기초공부' 카테고리의 다른 글

[JAVA] 추상 클래스  (5) 2024.10.09
[JAVA] 형 변환, static, final  (2) 2024.10.09
[JAVA] 메소드 오버라이딩  (0) 2024.10.01
[JAVA] 패키지  (3) 2024.09.29
[JAVA] String 클래스  (1) 2024.09.29