캡슐화 (Encapsulation), 은닉화 (Hiding)

문상우·2023년 8월 3일

Java 핵심 개념

목록 보기
3/5
post-thumbnail

은닉화(Hiding)

자바에서 JSON 문법을 사용하기 위해서는 특정 JSONObjcet 같은 클래스를 사용해야 한다. 하지만, 자바에서는 Class 로 해당 객체 속성을 정의해놓고, 이를 인스턴스화 시켜 요청 응답하는 방법을 주로 사용한다. (Dto의 개념이다.)

아래처럼 User 클래스가 있다고 가정했을 때,

public class User {
		public String userId;
		public String userName;
		public Integer age;
		public String address;
}

유저라면 가지고 있어야 할 필수 속성 4개를 지정한다.


우리는 이를 사용할 때, 아래처럼 사용한다.

public class Main {
    public static void main(String[] args) {
				User user = new User();

        user.userId = "sangwoo";
        user.userName = "상우";
        user.age = 25;
        user.address = "서울시 노원구";

        System.out.println(user.userId);
		// sangwoo
        System.out.println(user.userName);
		// 상우
        System.out.println(user.age);
		// 25
        System.out.println(user.address);
		// 서울시 노원구
    }
}

하지만, 이 방법은 너무 위험하다. 필드의 접근제어자가 public으로 되어 있어 어떤 위치든 필드에 접근할 수 있게 된다. 철저히 계산되어 필드를 사용한다면 상관없지만, 실수로 필드 자체에 접근하게 되면 수 많은 오류를 발생시킬 수 있다.
따라서 은닉화를 사용해 메서드를 통해 필드를 제공한다.


public class User {
    private String userId;
    private String userName;
    private Integer age;
    private String address;

    public String getUserId() {
        return this.userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    ...
}

필드의 접근제어자는 private으로 설정해 외부 파일에서 직접적으로 접근하는 것을 막고, 해당 필드에 접근할 수 있는 메서드를 public 접근제어자로 만들어 개발자가 의도한대로 필드에 접근할 수 있게 한다.

public class Main {
    public static void main(String[] args) {
        User user = new User();

        user.setUserId("sangwoo");
        user.setUserName("상우");
        user.setAge(25);
        user.setAddress("서울시 노원구");

        System.out.println(user.getUserId());
		// sangwoo
        System.out.println(user.getUserName());
		// 상우
        System.out.println(user.getAge());
		// 25
        System.out.println(user.getAddress());
		// 서울시 노원구
    }
}

필드에 대한 직접 접근을 막고 개발자가 제공하고 싶은 기능만 메서드로 정의해, 필드를 메서드로 제공하는 것을 은닉화라고 한다.


캡슐화(Encapsulation)란?

public class Capsulation {
    public Integer add(Integer a, Integer b) {
        if (a >= 10) {
            a %= 10;
        }
        if (b >= 10) {
            b %= 10;
        }

        return a + b;
    }
}

Capsulation 클래스에서 add 메서드를 정의한다. 해당 메서드는 어떤 정수가 오더라도 일의 자리 숫자를 더해서 반환하는 기능을 해준다.

우리가 만약 두 정수에 대해서 일의 자리 숫자만 더하고 싶은 상황이 생겼다고 가정해보자

public class Main {
    public static void main(String[] args) {
		Capsulation capsulation = new Capsulation();
        System.out.println(capsulation.add(234, 567));
    }
}

우리는 Capsulation 클래스 내부에 있는 add 메서드가 내부적으로 어떻게 동작하고 있는지 모른다. 하지만, 정수 2개를 주면 일의자리 숫자를 더한 값을 반환해준다는 것을 안다. 이때 add 메서드를 호출해서 인자로 정수 두개만 주면 우리가 원하던 일의 자리 숫자를 원하는 값을 얻을 수 있다.

이게 바로 캡슐화의 개념이다. 메서드 또는 클래스에 대해서 내부적으로 코드가 어떻게 동작하는지는 모르지만, 어떤 Input에 대해 Output을 도출할 수 있다는 것을 알면 메서드를 사용할 수 있게 되는 것을 말한다.

이로써, add 메서드를 제공하는 사람은 내부 로직을 숨기고 코드를 작성하여 안정적이고 일관성 있는 기능을 제공할 수 있고, 사용자는 내부 로직을 알 필요 없이 해당 기능을 이용할 수 있게 된다. 기존에는 사용자가 내부 로직을 힘들게 작성해야 했지만, 캡슐화를 통해 내부 로직을 이해하지 않고도 그 기능을 사용할 수 있다는게 캡슐화의 장점이다.

[참고]

Java 중요 개념 5가지
https://bytheprogramer-fortheprogramer.tistory.com/6

0118 추상화.캡슐화.은닉화.상속성.다형성-객체지향 개발
https://beerntv.wordpress.com/2017/01/18/0118-추상화-캡슐화-은닉/

profile
성실하게 도전하고 기록하며 성장하자

0개의 댓글