[java] java의 접근 제한자(public/ default/ protected/ private)와 은닉화/캡슐화
<접근 제한자의 정의와 종류>
- 자바에서 사용되는 접근 제한자의 종류와 의미에 알아보자
- 은닉화/ 캡슐화에 대해서 알아보자
#접근제한자란?
- 클래스 내에 있는 멤버 (필드/ 생성자/ 메소드)의 접근 가능 범위를 정하는 문구입니다.
- 데이터의 접근을 제한하여 데이터 혹은 메소드를 간접적으로 다루게 합니다.
- 접근/사용 방식을 한 차례 제한하여 가장 기초적인 보안을 유지할 수 있습니다.
- 각 변수(필드)와 기능(메소드)가 모듈화 되어, 유지/보수에 도움을 줍니다.
- 내부 동작 체계를 몰라도 활용할 수 있어 기능 활용이 간편해집니다.
# 접근제한자의 종류
> public - 프로젝트(project) 내에서만 접근 허용 (가장 넓음)
> default - 패키지 안에서만 접근 허용
> protected - 패키지 안에서만 접근 허용 + 상속 관계의 클래스 접근 허용
> private - 클래스 안에서만 접근 허용 (가장 협소)
# 멤버에 따른 접근제한자
> 클 래 스 : public, default
> 생 성 자 : public, default, protected, private
> 매 소 드 : public, default, protected, private
> 필드/변수 : public, default, protected, private
* 단, 블록 안에 있는 지역 변수는 접근제한자를 사용할 수 없음
# (필드의) 은닉화/ (메소드의) 캡슐화
> (필드의) 은닉화
- 접근 제한자 'private'를 사용하여 필드(변수=데이터)에 접근을 제한하는 것을 "은닉한다"라고 표현하며, 이를 은닉화라고 한다.
- 은닉한 변수는 get/set 메소드를 통해서 접근한다.
package test.com.model;
import java.util.Date;
public class BoardVO {
//은닉화
private int num;
private String title;
private String content;
private String writer;
private Date wdate;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public Date getWdate() {
return wdate;
}
public void setWdate(Date wdate) {
this.wdate = wdate;
}
활용 예시> 객체를 선언한 뒤, 'set'+파라미터를 통해 은닉화된 변수에 접근하여 수정을 진행하는 것을 볼 수 있다.
> (메소드의) 캡슐화
> 일련의 처리과정을 별도로 모듈화(캡슐화)하여, 메소드의 내부 처리 과정을 노출시키지 않고 활용할 수 있도록 할 수 있다.
package test.com;
// BoardVO를 다루는 객체
public class BoardDAO {
//insert/update/delete가 별도의 클래스에 캡슐화 되어있다.
int insert(BoardVO vo) {
System.out.println("insert()..." + vo);// 주소 및 객체가 잘 확인 되는지
return 1;
}
int update(BoardVO vo) {
System.out.println("update()..." + vo);// 주소 및 객체가 잘 확인 되는지
return 2;
}
int delete(BoardVO vo) {
System.out.println("delete()..." + vo);
return 3;
}
}//end class
활용 예시> 객체를 선언한 뒤, 클래스 안에 있는 메소드를 호출하여 반환 값을 확인하는 것을 볼 수 있다.
- 각 메소드(insert/update/delete)에서 어떠한 내부 처리 과정이 있는지 바로 확인할 수 없다.