개발/Java

JAVA의 객체지향프로그래밍(OOP)에 대해 알아보자 - 캡슐화 편

IT하는 문과생 2019. 11. 12. 08:00

JAVA를 사용하여 개발하다 보면 반드시 알아야 하는 일부 개념들이 있다. OOP라는 개념이 그것인데, OOP란 객체지향 프로그래밍의 약자다. 그리고 이 객체지향 프로그래밍은 캡슐화, 상속, 추상화, 다형성을 통해서 이루어진다. 앞으로 이어지는 포스팅을 통해 해당 내용에 대해서 알아보는 시간을 보내고자 한다.

오늘은 캡슐화에 대해서 알아볼 것인데 거창한 것은 아니고, 실제 현장에서 어떻게 캡슐화가 이용되는지 아래 글을 통해 조금이라도 알고 가기를 원하는 마음으로 작성해 보고자 한다. 해당 글이 부디 도움이 되었으면 좋겠다. 캡슐화는 다음과 같은 내용으로 정의가 되고 있다.

데이터들(변수 : variable)과 그 데이터를 처리하는 코드(메서드 : method)들을 하나의 단위(Single Unit)로 묶는(wrapping) 작동 원리 또는 구조 

우선 간단히 실무적으로 설명하자면 실무에서 DTO 클래스를 대상으로 사용되는 getter와 setter가 바로 캡슐화를 사용하고 있는 것이다. 캡슐화를 통해서 얻게 되는 이점으로는 각 클래스 내의 필드들에 대해서 접근할 수 있는 것에 대해 정의할 수 있으며, 해당 클래스 내에 private 접근자를 사용하여 외부에서 변수에 대해 직접 접근할 수 없도록 만든다. 외부에서 직접 변수에 대해서 접근할 수 없도록 만든 것은 특정 변수에 데이터가 이상하게 주입되어 프로그램에 문제를 일으키는 것을 막을 수 있다. 필자는 이 기능이 무엇보다도 중요하다고 생각한다. 아래 소스 코드를 통해 같이 보도록 하자.

public class Approval {
	private String step_no;
	private String step_name;
	private String step;

	public String getStep() {
		return step;
	}

	public void setStep(String step) {
			this.step = step;
	}

	public String getStep_no() {
		return step_no;
	}

	public void setStep_no(String step_no) {
		if(ComUtil.validateInt(step)){
			this.step_no = step_no;
		}else{
			this.step_no = String.valueOf(0);
		}
	}

	public String getStep_name() {
		return step_name;
	}

	public void setStep_name(String step_name) {
		this.step_name = step_name;
	}
}

위 코드에서 String step_no가 외부에서 private 접근자가 아니라고 생각을 해보자. public String Step_no로 어디서나 접근 가능한 public 접근제어자로 세팅이 되었다면, 외부에서 Approval app = new Approval()와 같이 클래스 선언 후 app.step_no="가나다";라는 값도 세팅을 할 수 있게 된다. 그러면 어떻게 될까? 숫자가 아닌 것이 들어온 이상 클라이언트에서 작동을 하다가 멈추는 불상사가 발생할 것이다.

하지만 위의 경우와 같이 private 접근제어자로 변수에 대한 직접 접근 차단 후 외부 접근 가능한 setter에서 보이는 것과 같이(setStep_no 메서드를 보자), 외부에서 들어오는 변수 값에 대한 통제가 가능해진다. 해당 클래스를 사용하는 사용자는 클라이언트에서 별도로 세팅할 것이 없다. 변수에 대해서 고민할 것도 없다. 그냥 있는 그대로 setStep_no라는 메서드를 설정하여 변수 값만 넣어주면 자체로 처리를 해주는 것이다. 외부에 자신의 함수를 노출하지 않고선. 이것이 캡슐화의 기본인 은닉성이다.

물론 실제 현장에서 개발을 하다 보면 setSetp_no와 같은 메서드보다 setStep_name과 같이 의미 없이 그대로 변수를 주입하는 setter를 많이 볼 수 있다. 물론 시간이나 기타 여건 상 getter/setter만 generation 해서 사용하는 것이겠지만, 조금씩이라도 해당 변수가 어떻게 사용되어야 하는 것인지 정의를 한 후 세팅을 한다면 보다 다음 사람이 이어서 개발할 때에도 보다 편리하게 개발을 할 수 있지 않을까 생각해 본다.