JAVA(STS)

[java] java의 접근 제한자(public/ default/ protected/ private)와 은닉화/캡슐화

걍작 2022. 2. 7. 20:54

<접근 제한자의 정의와 종류>

- 자바에서 사용되는 접근 제한자의 종류와 의미에 알아보자

- 은닉화/ 캡슐화에 대해서 알아보자

 

 

#접근제한자란?

 - 클래스 내에 있는 멤버 (필드/ 생성자/ 메소드)의 접근 가능 범위를 정하는 문구입니다.

 - 데이터의 접근을 제한하여 데이터 혹은 메소드를 간접적으로 다루게 합니다.

 - 접근/사용 방식을 한 차례 제한하여 가장 기초적인 보안을 유지할 수 있습니다.

 - 각 변수(필드)와 기능(메소드)가 모듈화 되어, 유지/보수에 도움을 줍니다.

 - 내부 동작 체계를 몰라도 활용할 수 있어 기능 활용이 간편해집니다. 

 

 

# 접근제한자의 종류

> 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)에서 어떠한 내부 처리 과정이 있는지 바로 확인할 수 없다.