Programming Language/Java

[Java] 캡슐화(Encapsulation)란?

장쫄깃 2022. 4. 19. 15:54
728x90


캡슐화(Encapsulation)란?


객체의 속성(data fields)과 행위(methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.

 

캡슐화는 객체 내부의 속성이나 행위를 외부에서 직접 접근할 수 없게 하는 것이다. 흔히 은닉과 혼동하는 경우가 많은데, 은닉화란 캡슐화를 통해 얻어지는 '실제 구현 내용 일부를 외부에 감추는 효과'이다.

 

객체의 속성과 행위를 묶으면 응집도가 올라가므로 자율적인 객체가 된다는 장점이 있다. 자율적인 객체가 되면 다른 객체의 영향을 덜 받기 때문에 자신의 상태를 스스로 잘 처리할 수 있게 된다.

 

그런데 이 상황에서 캡슐화가 이루어지지 않으면 외부에서 내부 속성에 접근하여 사용할 수 있기 때문에 결합도가 높아지고 응집도가 낮아지게 된다. 이렇게 되면 객체는 수동적인 객체가 되고 다른 객체의 영향을 크게 받기 때문에 자신의 상태를 스스로 처리하기 힘들어져 유지보수를 어렵게 한다.

 

또한, 결제 로직과 같이 민감한 부분을 외부로 공개하게 되면, 악용될 수 있는 위험이 있다.

 

즉, 변경에 유연한 프로그램을 만드는 동시에 보안적인 프로그램을 만들기 위해서 캡슐화를 지켜야 한다.

 

 

접근 제어자


캡슐화는 접근 제어자를 통해 이루어진다.

  • public : 접근 제한 없음
  • protected : 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능
  • default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근 가능
  • private : 자기 자신의 클래스 내에서만 접근 가능

 

 

캡슐화 예제


public class SomeClass {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

private 선언을 통해 내부 필드에 직접 접근할 수 없게 했다. 그리고 public getter/setter 메소드를 통해 내부 필드에 접근할 수 있게 했다.

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

		some.setId(123);
		some.setName("some");

		System.out.println(cap.getId());
		System.out.println(cap.getName());
    }
}

메인 클래스에서 사용할 때 getter/setter 메소드를 통해 내부 필드에 접근한다. 이렇게 내부 필드 혹은 메소드에 직접 접근할 수 없게 하고 정보를 은닉하면 클래스 내부에 구현된 코드에 따라 목적에 맞게 동작할 가능성이 올라간다.

 

이렇게 캡슐화한 경우 장점의 예로 사용자가 내부 필드에 접근하는 방법을 public 메소드로 한정하고, 접근 시 유효성 체크를 public 메소드에서 처리할 경우 내부 필드 데이터 적합성을 향상시킨다.

public class SomeClass {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	// setter 메소드에서 데이터 유효성 체크
	public void setName(String name) {
		// null check
		if(name == null) this.name = "test";
		// length check
		else if(name.length() > 5) this.name = name.substring(5);
		// else
		else this.name = name;
	}
}

 

 

정리하며


캡슐화를 지켜야 변화에 유연한 소프트웨어를 만들 수 있다.

 

위에 설명한 내용에 더해서, 더 진정한 캡슐화에 대한 설명은 해당 링크를 참고하면 좋을 것 같다.

https://galid1.tistory.com/683

 

OOAD - 진정한 캡슐화 (잘못된 캡슐화 예제)

진정한 캡슐화 진정한 캡슐화 에 대해 알아보도록 하겠습니다. 진정한 캡슐화 제목이 조금 이상한듯 싶지만, 우리가 알고 있는 이전의 캡슐화는 진짜 캡슐화가 아닐 확률이 높습니다. 때문에 진

galid1.tistory.com


참고

https://steady-coding.tistory.com/449

728x90