유난스런 개발 기록

[JAVA] Day-13 _ 캡슐화 (Encapsulation) 본문

개념정리/JAVA

[JAVA] Day-13 _ 캡슐화 (Encapsulation)

yourhwan 2023. 1. 29. 18:44

day-13

캡슐화 (Encapsulation)


캡슐화 (Encapsulation) 란? 

  • 객체지향의 가장 중요한 데이터 보호 기술이다.
  • 클래스(class)에 인스턴스를 생성하고, 멤버변수와 메소드를 외부에서 마음대로 접근하지 못하게 하는 기술이다.
  • 이것을 "은닉화" 라고 한다.

 

그냥 설명만 들었을 때는 이해하기 어려운 개념이라고 생각한다.

하지만 내가 공부하면서 느낀 바로는 대부분의 내용들은 코드의 흐름을 파악하고

"왜 이런 코드를 작성했을까?" 라는 의문을 가지며 보다보면 대부분 이해하기 수월했다.

 

캡슐화에서 빼놓을 수 없는 접근제한자에 대해서 먼저 확인을 해보자.

 

접근제한자종류와 접근 가능 범위

아마 자바를 공부한지 얼마 되지 않았다면 public을 제외한 나머지 접근제한자는 생소할 수 있을 것이다.

나도 수업을 통해 private와 protected의 존재를 처음 알았다.

 

위의 표는 접근제한자를 자유자재로 사용하기 위해 숙지해두어야할 기본 개념이다.

그렇다면 캡슐화가 어떻게 코드로 쓰여지는지 확인해보자.

// field(속성) 생성
	private String userid;    // 아이디
	private String passwd;    // 비밀번호
	private String name;      // 성명
	private String jubun;     // 주민번호 앞의 7자리 까지만
	                          // 예: "9512201" 남자  "0112203" 남자
                              // 예: "9512202" 여자  "0112204" 여자
	private String register_day;  // 가입일자
	
	static int count; // Gujikja 객체(인스턴스)의 개수를 알아오려는 용도 
	
	// 기본생성자
	public Gujikja() {
		Date now = new Date(); // 현재시각 
		SimpleDateFormat sdfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		register_day = sdfmt.format(now);
	}
	
	// method 생성 
	public void setUserid(String userid) {
		
		if(userid != null && !userid.trim().isEmpty()) {
			this.userid = userid;
		}
		else {
			System.out.println("[경고] 아이디는 공백인 아닌 글자로 입력하셔야 합니다.\n");
		}
		
	}// end of public void setUserid(String userid)------------------
	
	
	public String getUserid() {
		return userid;
	}// end of public String getUserid()------------------
	
	
	public void setPasswd(String passwd) {
		
		if( MyUtil.isCheckPasswd(passwd) ) {
			this.passwd = passwd;
		}
		else {
			System.out.println("[경고] 비밀번호는 8글자 이상 15글자 이하의 대,소문자,숫자,특수기호가 혼합되어야만 합니다.\n"); 
		}
		
	}// end of public void setPasswd(String passwd)-----------------
	
	
	public String getPasswd() {
		return passwd;
	}// end of public String getPasswd()-----------------
	

	public void setName(String name) {
		
		// name 에는 한글만 허용하겠다.
		
		if(name != null) {
			
		// 정규표현식(Regular Expression)이란?
		// ==> 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어 
			
		// == 1. 정규표현식(Regular Expression) 패턴을 작성한다. == //
		Pattern p = Pattern.compile("^[가-힣]{2,5}$");
		// ^ 은 시작을 의미한다.
		// $ 는 끝을 의미한다.
		// [] 는 글자 1개가 들어오는 것을 의미한다.
		// {2,5} 은 반복되어지는 회수를 말하는데 2번 또는 3번 또는 4번 또는 5번 까지를 허용한다는 말이다.
			
		// == 2. 검사할 문자열이 주어진 정규식 패턴과 일치하는지 아닌지를 판별하는 객체를 생성한다. == //
			Matcher m = p.matcher(name);
			
	// == 3. 검사할 문자열을 판별하도록 한다. == //
	// 입력받은 jubun 이 주어진 정규식 패턴과 일치하면 true, 일치하지 않으면 false 를 리턴시켜준다.  
			boolean bool = m.matches();
			
			if(bool) 
				this.name = name;	
			
			else 
				System.out.println(">> 성명은 공백없이 한글로만 2글자 부터 5글자 이내로만 가능합니다. <<\n"); 
			
		}
		else {
			System.out.println("[경고] 성명은 필수로 공백이 아닌 것으로 입력하셔야 합니다.");
		}
		
	}// end of public void setName(String name)------------------- 
	
	
	public String getName() {
		return name;
	} // end of public String getName()---------------
	

	public void setJubun(String jubun) {
		
		if( MyUtil.isCheckJubun(jubun) ) 
			this.jubun = jubun;
		
		else 
			System.out.println("[경고] 주민번호를 올바르게 입력하세요!!\n 예>9501182 \n");
		
	}// end of public void setJubun(String jubun)------------------
	
	
	public String getJubun() {
		return jubun;
	} // end of public String getJubun()-----------------

 

필드에(field)를 생성하고 접근제한자를 private 으로 지정해주었다.

그렇다면 해당 필드는 현재 클래스 내부에서만 사용이 가능하도록 캡슐화 된 것이다.

 

이 필드를 다른 클래스에서 사용하기 위해서는 메소드를 통해 호출해야하는데, 

getter/setter를 통해서 만든 메소드로 가능하다.

직접 코드를 입력해줄 수 있지만, 이클립스가 보다 편하게 생성할 수 있도록 도와준다.

방법과 순서는 다음과 같다.

Source -> Generate Getters and Setters -> getters/setters 를 생성하고자 하는 필드 선택 -> Generate

getter/setter 생성 방법

 

getter/setter 생성 방법

위와 같은 방법으로 getter/setter 메소드를 만들어줄 수 있다.

여기서 특이한 점은 생성된 메소드의 첫 글자는 대문자라는 것이다.

 

그렇다면 getter / setter 은 어떤 역할을 하는 것일까?

내가 이해한 것을 바탕으로 설명하자면, 

"필드에 특정한 조건을 설정하여 통제하고자 할 때,  그 기준에 맞도록 값을 통제하기 위해서" 이다.

위의 코드 블럭의 내용을 확인해보면 회원가입의 과정 중 사용자로 부터 name의 값을 받을 때,

입력 받은 문자열을 검사하는 메소드를 작성했다.

내가 코드로 설정한 기준에 부합하지 않는다면, 경고문구가 출력되도록 해두었다.

적절한 표현인지 모르겠지만 쉽게 표현하자면 하나의 "거름망" 역할을 한다고 이해했다.

(set 을 통해서 기준을 정하고, 이에 따라 get이 따라오는 패턴)

이 모든 것이 캡슐화의 과정인 것이다.

 

(정리한 내용 중 틀린 부분이 있다면 댓글로 부탁드립니다.)

 

 

이번 주는 객체지향에서 가장 중요한 부분인 상추캡다 (상속성, 추상화, 캡슐화, 다형성) 를 배웠다.

정말 중요한 부부인 만큼 복습도 꼼꼼히 하려고 노력했지만, 늘 그렇듯 수업 내용을 한번에 100% 흡수하기엔

어려움이 많다. 그래도 꾸준히 반복하고 궁금한 부분이 생길 때마다 찾아보는 습관을 기르자!