본문 바로가기
Language/Java

[Java] 자바기초 - 객체지향(OOP) - 캡슐화(Encapsulation)

by J4J 2020. 12. 22.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 객체지향 프로그래밍의 특징 중 하나인 캡슐화에 대해 적어보는 시간을 가져보려고 합니다.

 

 

캡슐화란?

 

캡슐화라고 하는 것은 알약을 구매할 때 약들이 캡슐에 감싸져 있어 어떤 약인지 알 수 없는 것처럼 클래스 내부의 변수 및 메서드들이 외부에 노출되지 않기 위해 감싸져 있는 것을 말합니다.

 

클래스가 사용되는 목적에 따라 외부에 노출시킬 메서드와 변수가 정해질 것이고 외부 사용자들은 노출된 변수와 메서드만 사용될 수 있게 됩니다. 

 

캡슐화의 사용 목적은 캡슐화가 무엇인지에 대해서만 들어봐도 어느 정도 예측을 할 수가 있는데 한 마디로 표현을 하면 정보은닉을 위해서입니다.

 

정보은닉에 담겨져 있는 의미처럼 외부에 의한 중요정보 탈취 및 객체 손상 등을 방지하기 위해 사용됩니다.

 

 

사용 방법

 

캡슐화를 사용하는 방법은 정보은닉이라는 목적을 달성하기 위해 접근 제한자를 이용하게 됩니다.

 ※ 접근제한자에 대해 모르신다면? [Java] 자바기초 - 접근 제한자

 

접근 제한자 중 private을 이용하여 변수 및 메서드들에 접근하지 못하도록 제한하고 외부에서 접근 가능한 특정 메서드들을 통해 간접적으로 접근할 수 있도록 합니다.

 

대표적으로 getter와 setter를 통해 데이터를 저장하거나 사용하는 것이 있는데 코드로 보여드리겠습니다.

 

package oop;

public class Encapsulation {
	private int intVal;
	private double doubleVal;
	private boolean booleanVal;
	
	public int getIntVal() {
		return intVal;
	}
	public void setIntVal(int intVal) {
		this.intVal = intVal;
	}
	public double getDoubleVal() {
		return doubleVal;
	}
	public void setDoubleVal(double doubleVal) {
		this.doubleVal = doubleVal;
	}
	public boolean isBooleanVal() {
		return booleanVal;
	}
	public void setBooleanVal(boolean booleanVal) {
		this.booleanVal = booleanVal;
	}
}

 

 

728x90

 

 

package oop;

public class CapMain {
	public static void main(String[] args) {
		Encapsulation encapsulation = new Encapsulation();
		
		encapsulation.setIntVal(30);
		System.out.println(encapsulation.getIntVal()); // 30
		
		encapsulation.setDoubleVal(30.3);
		System.out.println(encapsulation.getDoubleVal()); // 30.3
		
		encapsulation.setBooleanVal(true);
		System.out.println(encapsulation.isBooleanVal()); // true
	}
}

 

 

위의 코드들을 보시면 캡슐화가 된 객체를 생성하여 변수들에 접근할 때 getXX, setXX라는 메서드들을 통하여 접근을 해야만 하는데 이런 방식을 사용하여 변수에 접근하는 메서드들을 getter, setter라고 부릅니다. 

 

참고적으로 getter와 setter는 본인이 작성해서 만들어도 되지만 보통 자동완성을 통해 만듭니다.

 

추후에 자동완성에 대해서도 포스팅을 할 건데 우선 getter, setter를 만드는 자동완성에 대해서만 먼저 말을 하자면 이클립스 기준으로 getter, setter를 만들 클래스 파일 화면에서 Alt+Shift+S를 누르고 R을 누른 뒤 변수들을 선택하여 확인을 누르면 만들어집니다.

 

말을 이어 만약 getter, setter를 이용하지 않고 encapsulation.intVal과 같이 접근을 하게 되면 어떻게 될까요?

 

캡슐화 예시

 

 

이처럼 private로 선언된 변수들은 클래스 내부에서만 사용될 수 있기 때문에 에러가 나는 것을 확인하실 수 있습니다.

 

지금 같은 경우는 선언된 변수에 메서드들을 통해 모두 접근할 수 있지만 필요에 따라 접근을 막아버리게 할 수도 있는 것입니다.

 

이처럼 외부에 노출시킬 메서드로만 클래스 내부 데이터에 접근 가능하도록 하고 그 외의 방법으로는 접근하지 못하도록 함으로 써 캡슐화를 구현해낼 수 있습니다.

 

 

설계 방법

 

캡슐화를 사용하기 위해 설계할 때는 응집도(Cohesion), 결합도(Coupling)에 대해 생각을 해야 됩니다.

 

응집도라는 것은 모듈에 변경이 일어날 때 모듈 내부 요소들 간의 변경 정도를 의미하는데 자바에서 응집도는 클래스 내부의 변수와 메서드 간에 의존되어 있는 정도를 말합니다.

 

다른 말로는 외부에 노출시킬 메서드들을 정의할 때 클래스 내부에 선언되어 있는 변수들이 서로 관련되어 있어 많이 사용될수록 응집도가 높아진다고 생각하면 됩니다.

 

결합도라는 것은 모듈들 간의 의존되어 있는 정도를 의미하는데 자바에서 결합도는 클래스들 간의 의존되어 있는 정도를 말합니다.

 

다른 말로는 한 클래스의 노출된 메서드가 사용될 때 다른 클래스에도 영향을 미치는 정도라고 생각하면 됩니다.

 

가장 좋은 설계 방법은 응집도를 높게, 결합도를 낮게 설계하는 것이라고 합니다.

 

왜냐하면 이렇게 설계된 코드들은 유지보수할 때 이점을 가져오기 때문입니다.

 

 

정리

 

캡슐화는 정보은닉을 위한 목적으로 사용됨
private을 이용하여 정보를 숨기고 외부에 노출시킬 메서드를 통해 간접적으로 사용
응집도를 높게, 결합도를 낮게 하여 설계

 

 

 

이상으로 객체지향 프로그래밍의 특징 중 하나인 캡슐화에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글