본문 바로가기

IT

13-1. 자바 - 은닉

* 은닉(Encapsulation)

  • 은닉은 사용자에게 상세한 내부 구현을 숨기고 필요한 부분만 보이게 하는 것이다.
  • 은닉을 사용하기 위해서는 클래스의 멤버변수의 접근제한자를 private으로 설정한다.
  • 은닉된 멤버변수에 접근하기 위해서는 공개된(public) 메서드를 통해서 접근할 수 있는데,  변수의 값을 변경시키는 데, 변수의 값을 변경시키는데 사용되는 메서드는 setter메서드라고 부르며, 변수의 값을 얻어오는 데 사용하는 메서드를 getter메서드라고 부른다.
  • 이처럼 공개 메서드를 이용하여 데이터를 변경시킬 경우 메서드 내에 데이터 유효성을 검증할 수 있는 루틴을 넣을 수 있다.
  • 뿐만 아니라 경우에 따라 접근 권란을 체크할 수 있는 로직을 포함시키면 인가되지 않은 사용자에게 중요한 데이터나 로직을 숨길 수도 있고, 이를 제어할 수도 있다.
  • 멤버변수만 private 제한자를 가지는 것은 아니다. 외부에 공개하고 싶은 않은 메서드들도 private으로 선언할 수 있다.

우선 은닉을 사용하지 않으면 생기는 문제점을 확인해보자. 

package: encap.badcase

Name : MyBirth

package encap.badcase;

public class MyBirth {
	
	int year;
	int month;
	int day;
	
	void dateInfo() {
		System.out.printf("내 생일은 %d년 %d월 %d일이다.",
				year, month, day);
	}
}

package: encap.badcase

Name : MainClass

package encap.badcase;

public class MainClass {

	public static void main(String[] args) {
		MyBirth b = new MyBirth();
		
		b.year = 2018;
		b.month = 10;
		b.day = 41;
		
		b.dateInfo();
/*
 * 여기서의 문제점.
 * day는 30일, 31일등 까지 밖에 없는데 41을 넣으면 문제가 생긴다.
 * 이렇게 바로 b.으로 넣지 못하도록 하는게 은닉이다.
 */
	}
}

실습. 은닉 

package : encap.goodcase

Name: MyBirth

package encap.goodcase;

public class MyBirth {
	
	/*
	 *은닉(캡슐화)을 사용하려면  데이터 참조를 제한할 멤버변수의 앞에 
	 *private제한자를 붇입니다. 
	 */
	private int year;
	private int month;
	private int day;
	
	/*
	 *  - 은닉된 멤버변수에 접근하기 위해서는
	 *  클래스 설계자가 미리 만들어 놓은 setter/getter메서드를 
	 *  사용하여 데이터에 접근해야 한다.
	 *  
	 *  - setter메서드 선언
	 *  1. setter메서드는 은닉변수에 값을 저장시키기 위한 메서드이다.
	 *  2. 메서드의 접근제한자를 public으로 설정하여 이름은 일반적으로 
	 *  set + 멤버변수이름으로 지정한다.
	 *
	 */
	public void setDay(int day) {
		if(day < 1 || day > 31) {
			System.out.println("자못된 일수 입력입니다.");
		}else {
			this.day = day;
		}
	}

	/* 
	 * - getter메서드 선언.
	 * 1.getter메서드는 은닉변수의 값을 얻어낼 때 사용하는 메서드다.
	 * 2.setter와 마찬가지로 public제한으로 외부에 메서드를 공개하고 이름은
	 * 일반적으로 get + 멤버변수 이름으로 지정한다.
	 */
	public int getDay() {
		return this.day;
	}
	// 이클립스 꿀팁! 마우스 우클릭 > Source > Generate Getters and Setters.. 
	// 을 눌러보면 자동으로 메서드를 선언해준다. 여기서 이제 if문을 추가로 적어주면 된다.

package: encap.goodcase

Name: MainClass

package encap.goodcase;

public class MainClass {
	public static void main(String[] args) {
		
		MyBirth b = new MyBirth();
		
		/* 은닉을 할경우 이렇게 하면안됨. (블록처리 : ctrl + shift + 원하는 부분드래그)
		 * b.year = 2018; b.month = 15; b.day = -31; System.out.println(b.year);
		 */
		
		//값을 유효성을 검사하고 값을 출력하는 은닉.
		b.setDay(28);
		System.out.println(b.getDay());
	}
}

'IT' 카테고리의 다른 글

15-1. 자바 - 사용제한자 final  (1) 2022.09.26
15. 자바 - 사용제한자 static  (1) 2022.09.26
13. 자바 - 접근제한자  (0) 2022.09.25
10-1. SQL - DDL/DML/DCL  (1) 2022.09.22
10. 데이터베이스란? / MYSQL 설치 및 설정  (0) 2022.09.22