Post

[Java] 08. 접근 제한자 (public, default, protected, private)

[Java] 08. 접근 제한자 (public, default, protected, private)

클래스를 만들 때에는 public <클래스명>으로 시작합니다
그리고 새로운 클래스를 만들어서 변수를 사용할 때에는 private <변수명>을 권장합니다

  • public, default, protected, private
    자바에 있는 접근 제한자 4가지에 대해 알아보도록 합시다

  • 빠른 요약

    접근자클래스 내부패키지상속받은 클래스그 외
    privateOOOO
    protectedOOOX
    defaultOOXX
    privateOXXX

이 글에서는 패키지를 ‘디렉토리(경로)’로 설명했지만 다음부터는 그대로 패키지라 부르도록 하겠습니다



1. 접근 제한자 / public, default, protected, private

1-1. public

앞서 언급한 접근 제한자는 4가지 접근 권한에 따라 나뉘어집니다

  1. 클래스 내부
  2. 패키지
  3. 상속받은 클래스
  4. 그 외

‘public’은 어디에서든 사용할 수 있습니다

마치 이전 예제처럼 Person p = new Person();라는 인스턴스를 만들고 p.age = 20;을 주는 것 처럼요
또는 외부 패키지 (여기서 패키지는 다른 디렉토리에 있는 클래스로 이해하시면 됩니다)로 불러와도 사용할 수 있구요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// OtherPackage 디렉토리에 만든 Person 클래스
package OtherPackage;

public class Person {
    public String name;
    public int age;

    public void print() {
        System.out.println("name : " + name + ", age : " + age);
    }
}

// MainPackage 디렉토리에 만든 Person 클래스
package MainPackage;

import OtherPackage.Person;

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "홍길동";
        p.age = 87;

        p.print();  // 출력 : [ name : 홍길동, age : 87 ]
    }
}


1-2. default

보통 default를 작성하지는 않고 생략하며 작성합니다
클래스 내에서 default int a;라고 쓸 필요 없이 그냥 int a;를 쓰면 default가 되는 것이죠

만약 int a라고 작성할 경우, 다른 패키지에 있는 클래스에서는 접근할 수 없습니다
따라서 위의 public 예시를 default로 바꾸면 정상적으로 작동하지 않습니다


1-3. protected

여기서 ‘자식 클래스’는 ‘상속’과 관련된 내용입니다
조만간 포스트로 작성할 예정이니 그 때 확인하고 다시 돌아보면 될 것 같습니다

default와 마찬가지로 다른 패키지에 있는 클래스에서는 접근할 수 없습니다..만 자식 클래스에는 접근할 수 있습니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// OtherPackage 디렉토리에 만든 Parent 클래스
package OtherPackage;

import NewOtherPackage.Child;

public class Parent {
    protected String name = "홍길동";
    protected int age = 63;

    public void setChildAge(Child c,int age) {
        c.age = age; // Child는 Parent로 상속받기 때문에 접근 가능
    }

    public void print() {
        System.out.println("name : " + name + ", age : " + age);
    }
}

// NewOtherPackage 디렉토리에 만든 Child 클래스, Parent 클래스를 상속
package NewOtherPackage;

import OtherPackage.Parent;

public class Child extends Parent {
}

// MainPackage 디렉토리에 만든 Main 클래스
package MainPackage;

import NewOtherPackage.Child;
import OtherPackage.Parent;

public class Main {
    public static void main(String[] args) {
        Parent p = new Parent();
        Child c = new Child();

        // c.age = 20; <-- 컴파일 에러 발생
        p.setChildAge(c, 24);

        p.print();  // 출력 : [ name : 홍길동, age : 24 ]
    }
}


1-4. private

자기 자신의 클래스를 제외하고는 접근할 수 없습니다
private로 구성된 변수를 포함하는 객체로 새로운 인스턴스를 만들면 그 변수에는 접근할 수가 없습니다

  • Q. 그러면 어떻게 값을 바꾸고 읽어오는건지?
    • A. 메소드는 public으로 지을 수 있습니다, 그리고 해당 메소드를 호출하면 그 메소드에서는 값을 바꿀 수 있겠죠

즉, 값을 바꾸거나 불러오는 과정을 ‘메서드’로 진행하게 되는 것입니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// OtherPackage 경로에 만든 Person 클래스
package OtherPackage;

public class Person {
    private int age;
    private String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

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

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

    /* Getter */
    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public void print() {
        System.out.println("name : " + name + ", age : " + age);
    }
}

// MainPackage에 만든 Main 클래스
package MainPackage;

import OtherPackage.Person;

public class Main {
    public static void main(String[] args) {
        Person p = new Person(34, "홍길동");    // 생성자는 아직 배우지 않았습니다
                                                // 이것도 마찬가지로 자기 자신의 메소드를 불러와 값을 지정해줍니다

        // Getter로 값을 불러와서 출력
        System.out.println("이 사람의 이름과 나이 : " + p.getName() + ", " + p.getAge());
        // 출력 : [ 이 사람의 이름과 나이 : 홍길동, 34 ]

        // Setter로 값을 변경한 뒤 출력
        p.setAge(50);
        p.print();
        // 출력 : [ name : 홍길동, age : 50 ]
    }
}



2. 자바에서 접근 제한자를 사용하는 목적

간단하게 말하자면 데이터를 보호할 수 있습니다

조금 어렵게 설명하자면 데이터의 무결성안정성을 보호할 수 있다고 볼 수 있습니다
외부에서 함부로 데이터에 접근하여 수정하는 것을 방지할 수 있고 메서드로만 데이터에 접근할 수 있도록 하는 것이죠

This post is licensed under CC BY 4.0 by the author.