JAVA

[JAVA]캡슐화

당고개 2023. 9. 12. 17:21

1. 접근 제어 지시자 

접근 제어 지시자를 이용하여 클래스, 변수, 메서드의 접근을 가능하게 하거나 하지 못하도록 할 수 있습니다.

  • 접근 - 클래스, 변수, 메서드의 접근을
  • 제어 - 제어 할 수 있는
  • 지시자 - 키워드

그렇다면 왜 클래스, 생성자, 변수 메서드를 접근 가능하게 하거나 하지 못하도록 해야 할까요? 이 부분은 깊고 깊은 소프트웨어 설계 관점에서 생겼습니다.

캡슐화를 하는 이유

캡슐 안에 들어간 내용물을 보호하고 숨기기 위해서(정보은닉) 내부에서 사용하는 클래스를 노출하지 않거나 클래스 내부에서만 사용하는 메서드가 외부에 노출되지 않도록 숨기고 변수에 저장된 값이 외부에서 변하지 않도록 보호하기 위함입니다.

private 지시자

private 지시자는 생성자, 변수, 메서드에 선언할 수 있고, 기능은 클래스 내부에서만 접근할 수 있도록 합니다.

class Person {
    private String name;

    Person(String name) {
        this.name = name;
    }

    private void think() {
        System.out.printf("%s는 생각한다\n", name);
    }

    void eat() {
        think();
        System.out.println("그리고 밥을 먹는다");
    }
}

private String name 변수는 클래스 내부에서만 접근할 수 있습니다.
private void think() 메서드는 클래스 내부에서만 접근할 수 있습니다.

Person person = new Person(“록카”);
person.name = “roka”; // name 변수에 접근할 수 없다.

person.think(); // 호출 할 수 없다.

default

default는 접근 제어 지시자를 선언하지 않은 순수한 클래스, 생성자, 변수, 메서드를 말하며, default는 클래스의 같은 패키지 내에서만 import가 가능하고 생성자도 같은 패키지 내에섬나 생성자를 통해 인스턴스를 생성 할 수 있습니다.

그리고 변수, 메서드도 같은 패키지 내에서만 접근이 가능합니다.

public 지시자

public 지시자는 클래스, 생성자,  변수, 메서드에 선언할 수 있고 모든 곳에서 접근 가능한 가장 열려있는 접근 제어 지시자 입니다.

public class Person {
    public String name;

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

    public void think() {
        System.out.printf("%s는 생각한다\n", name);
    }

    public void eat() {
        think();
        System.out.println("그리고 밥을 먹는다");
    }
}

public 지시자를 사용한다는 것은 누구나 사용해도 상관없을 만큼 안정화된 클래스, 생성자, 변수, 메서드에 선언합니다. 
public 지시자를 이용하는 것은 가급적 최소한으로 선언하는 것이 좋습니다.

이유는 현업에서는 여러 명이 하나의 프로젝트를 만들고 고쳐나가기 때문에 각각 번위를 정해서 코드를 작성하게 됩니다.

예시로, A라는 엔지니어가 Person 클래스를 만들고 B라는 엔지니어가 Job이라는 클래스를 만든다고 할 때 
Person클래스와 Job클래스는 의존관계가 될 수도 있습니다.

B라는 엔지니어가 사용하지 말아야 할 Person 클래스의 변수나 메서드를 임의로 사용하는 경우가 발생하여 의도하지 않은 방향으로 갈 수 있습니다.

사이드 이펙트도 발생할 수 있습니다.

2. 접근제어 지시자 정리

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/SEJ9GWYZRQC44GOV

'JAVA' 카테고리의 다른 글

[JAVA]String 메서드  (0) 2023.09.21
[JAVA]String 객체와 문자열 상수  (0) 2023.09.20
[JAVA]객체의 합성  (0) 2023.09.12
[JAVA]메서드 오버로딩  (0) 2023.09.08
[JAVA]메서드  (0) 2023.09.07