JAVA

캡슐화(Encapsulation)

NYoun 2021. 1. 27. 15:13

캡슐화(Encapsulation)란?

  캡슐화의 정의는 필요한 속성(Attribute)와 행위(Method)를 하나로 묶고 그 중 일부를 외부에서 사용하지

  못하도록 은닉하는것이다.

  중요목적은 중요한 데이터를 보존, 보호하기 위해 사용하는 것이다.

  즉, 캡슐화는 클래스에 담는 내용중 중요한 데이터나 기능을 외부에서 접근하지 못하게 하기 위해 사용한다.

 

  객체에 직접적인 접근을 막고 외부에서 내부의 정보에 직접적으로 접근하거나 변경할 수 없고, 객체가 제공하는

  필드와 메소드를 통해서만 접근이 가능하다.

 

  캡슐화는 객체의 세부내용이 외부에 은폐(정보은닉)되어, 변경이 발생할 때 오류 발생을 최소화 할 수 있다는

  장점이 있다.

  그리고 데이터가 변경되어도 다른 객체에 영향을 주지 않기 때문에 독립성이 좋고 처리된 결과사용으로

  이식성이 좋으며 객체를 모듈화 할 수 있어 새로운 시스템의 구성에 하나의 모듈처럼 사용이 가능하다.

 

접근제어자

  캡슐화를 하기 위해서는 접근제어자를 통해 설계가 잘 이루어져야 한다.

  자신 내부의 모듈은 감추고, 다른 모듈의 내부작업도 직접적으로 개입하지 못하도록 설계해야 한다.

 

접근제어자

제어자(modifier)   제어자(modifier)란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다. 자바에서 제어자는 접근제어자(access modifier)와 기타 제어자로 구분

myyoun.tistory.com

 

캡슐화 예제

 

public class Member {
  
  private String memberId;
  private String memberName;
  private String memberAddr;
  
  public String getMemberId() {
    return memberId;
  }
  
  public void setMemberId(String memberid) {
    this.memberId = memberId;
  }
  
  public String getMemberName() {
    return memberName;
  }
  
  public void setMemberName(String memberName) {
    this.memberName = memberName;
  }
  
  public String getMemberAddr() {
    return memberAddr;
  }
  
  public void setMemberAddr(String memberAddr) {
    this.memberAddr = memberAddr;
  }
}

  Member클래스는 Id, Name, Addr을 모두 private으로 선언했으므로 Member클래스 내부에서만 접근이 가능하다.

  그래서 외부클래스에서의 접근을 위해 setter와 getter를 만들어 접근할 수 있도록 해주었다.

  

public class MemberTest {
  public static void main(String[] args) {
    Member mem = new Member();
    
    String id = mem.getMemberId();
    String name = mem.getMemberName();
    String addr = mem.getMemberAddr();
    
    System.out.println("id : " + id + ", name : " + name + ", addr : " + addr);
    
    mem.setMemberId("hong");
    mem.setMemberName("홍길동");
    mem.setMemberAddr("서울");
    
    String id1 = mem.getMemberId();
    String name1 = mem.getMemberName();
    String addr1 = mem.getMemberAddr();
    
    System.out.println("id : " + id1 + ", name : " + name1 + ", addr : " + addr1);
    
  }
}

  이 클래스를 실행하면

  id : null, name : null, addr : null

  id : hong, name : 홍길동, addr : 서울

  이렇게 출력된다.

  Member클래스에서 외부의 접근을 위해 getter와 setter를 만들어 주었다고 했는데 외부클래스인 MemberTest에서

  get, set을 이용해 값을 불러오고 넣어준것이다.

  애초에 Member클래스를 보면 모든 변수가 기본값이 없기 때문에 null이 출력되지만

  set을 이용해 값을 넣어주고 다시 불러와 출력하게 되면 넣어준 값들을 볼 수 있다.

  

  만약 Member클래스에서 get만 만들어놓고 set은 만들지 않았다면 수정이 불가능한 읽기만 가능한 read-only상태가

  된다. 그럼 당연히 Test클래스에서는 위 예제처럼 set으로 수정할 수 없다.

  변경은 해줘야 하는 데이터인지 아니면 절대 변경되어서는 안되는 데이터인지에 따라 설계해야 한다.