캡슐화(Encapsulation)

Joy🌱·2022년 12월 29일
0

☕ Java

목록 보기
15/40
post-thumbnail

💁‍♀️ 캡슐화(Encapsulation)란,
결합도를 낮추기 위해 필드의 직접 접근을 제한하고 public 메소드를 이용해서 간접적으로 접근하여 사용할 수 있도록 만든 기술


🙋‍ 잠깐 ! 필드(Field)부터 짚고 갑시다 !
💁‍ 클래스에 포함된 변수를 의미하며 즉, 객체의 속성을 정의하는 공간
👉 '전역변수', '속성', '인스턴스 변수'라고도 부름

  • 필드(전역변수) 생성
: 접근제한자 자료형 필드명;
ex) private char gender;
	private int age;
  • 필드(전역변수) 접근법
: 레퍼런스변수명.필드명
ex) cheese.gender
	cheese.age
  • 필드에 직접 접근하여 변수처럼 사용
ex) cheese.gender = '남';
	cheese.age = 2;

🙅‍ BUT, 이렇게 필드에 직접적으로 접근할 시 문제점이 발생

  • 필드에 올바르지 않은 값이 들어가도 통제가 불가능
  • 클래스의 일부를 수정하면 사용하는 곳에서도 전부 함께 수정해야하는 부담
    (유지보수성 저하)

"따라서, 캡슐화의 정의에 따라 메소드를 이용하여 간접 접근하는 방식을 이용해야함"


👀 접근 제한자

💁‍ 클래스 혹은 클래스의 멤버(필드, 메소드)에 참조 연산자로 접근할 수 있는 범위를 제한하기 위한 키워드

public: 모든 패키지에 접근 허용
protected : 동일 패키지에 접근 허용. 단, 상속 관계에 있는 경우 다른 패키지에서도 접근 가능
default : 동일 패키지에서만 접근 허용 (작성하지않는 것이 default)
private : 해당 클래스 내부에서만 접근 허용

위의 4가지 접근 제한자는 클래스의 멤버(필드, 메소드)에 모두 사용 가능
단, 클래스 선언 시 사용하는 접근 제한자는 publicdefault만 가능


👀 캡슐화

◼ Monster Class

public class Monster {
	
	>>> 필드에 접근 제한자를 붙여 직접 접근을 막음
	private String name;
	private int hp;
	
	>>> 간접 접근할 수 있는 메소드를 작성
	public void setInfo(String info) { 
		this.name = info;
	}
	
	public void setHp(int hp) {
		if(hp > 0) {
			this.hp = hp;
		} else {
			this.hp = 0;
		}
	}
	
	public String getInfo() {
		return "몬스터의 이름은 " + this.name + "이고, 체력은 " + this.hp + "입니다.";
	}
}

◼ Application Class

public class Application {

	public static void main(String[] args) {
	
		Monster monster = new Monster();
        
        >>> 직접 접근이 막혔기 때문에 The field Monster.name is not visible 컴파일 에러
//		monster.name = "프랑켄슈타인"; 
//		monster.hp = -200;

        >>> 메소드로 간접 접근하기
		monster.setInfo("프랑켄슈타인"); 
		monster.setHp(-200);
		System.out.println(monster.getInfo());
	}
}

💻 Mini Console

몬스터의 이름은 프랑켄슈타인이고, 체력은 0입니다.

📌 Ref.

* 선언한 필드대로 공간은 생성되어 있지만 직접 접근할 수 없고 public으로 접근을 허용한 메소드만 이용할 수 있도록 함
  이를 캡슐화(encapsulation)라고 함
  - 유지보수성 증가를 위해
  - 클래스 작성 시 특별한 목적이 아니면 캡슐화가 기본 원칙
profile
Tiny little habits make me

0개의 댓글

관련 채용 정보