객체 4대 특성 - 캡슐화(정보은닉)

turtle601·2021년 4월 5일
1

캡슐화(encapsulation)

캡슐화란 데이터(속성)과 데이터를 처리하는 함수를 하나로 묶는 것이다.

다시 말해 객체 외부에서는 객체 내부 정보를 직접 접근하거나 조작할 수 없고, 외부에서 접근할 수 있도록 정의된 오퍼레이션을 통해서만 관련 데이터에 접근할 수 있다. (getter,setter)

캡슐화의 장점은 객체의 세부내용이 외부에 은폐(정보 은닉)되어, 변경이 발생할 때 오류발생이 적으며 재사용이 용이하다.

정보은닉(Information Hiding)

정보 은닉이란 캡슐화에서 가장 중요한 장점이다.

다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통하여 접근을 허용하는 것이다. 이를 통해서 외부 객체가 특정 객체의 데이터화 함수를 직접 접근하여 사용하거나 변경하지 못하므로 유지 보수와 소프트 웨어 확장시 오류를 최소화할 수 있음.

접근 제어자(access modifier)

객체 지향에서 정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념입니다.

자바는 이러한 정보 은닉을 위해 접근 제어자(access modifier)라는 기능을 제공하고 있습니다.
접근제어자를 사용하면 클래스 외부에서 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있습니다.

1.private
2.public
3.default
4.protected

private 접근 제어자

private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없습니다.
즉, 자바 프로그램은 private 멤버에 직접 접근할 수 없으며, 해당 객체의 public메소드를 통해서만 접근할 수 있습니다.

따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는 데 사용됩니다.

public class SameClass{
	private String var = "같은 클래스만 허용";
    private String getVar(){
    	return this.var;
    }
}

public 접근 제어자

pubic 접근 제어자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램은 어디에서나 접근할 수 있습니다.
자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있습니다.
따라서 public 메소드는 private멤버와 프로그램 사이의 인터페이스(interface)역할을 수행한다고 할 수 있습니다.

public class Everywhere{
	public String var = "누구든지 허용";
    public String getVar(){
    	return this.var;
    }
}

default 접근 제어

자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default접근 제어를 별도로 명시하고 있습니다.(아무것도 안 적으면 default)
default 접근 제어를 가지는 멤버는 **같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있습니다. **

HouseKim.java

package jump2java.house;

public class HouseKim{
	String lastname = "kim";
}

HousePark.java

package jump2java.house;

public class HousePark{
	String lastname = "park"
    
    public static void main(String[] args){
    	HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);
    }
}

protected 접근 제어자

자바 클래스는 private 멤버로 정보를 은닉, public 멤버로 사용자나 프로그램과의 인터페이스를 구축합니다.
여기 부모 클래스와 관련된 접근 제어자가 하나 더 존재합니다.
protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됩니다.

클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같습니다.

  1. 이 멤버를 선언한 클래스의 멤버
  2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버
  3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

HousePark.java

package jump2java.house;

public class HousePark{
	protected String lastname = "park";
}

EungYongPark.java

package jump2java.house.person;

import house.HousePark;

public class EungYongPark extends HousePark{
	public static void main(String[] args){
    	EungYongPark eyp = new EungYongPark();
        System.out.println(eyp.lastname);
    }
}

-> HousePark클래스를 상속받은 EungYongPark이라는 클래스의 패키지는 jump2java.house.person으로 HousePark의 패키지인 jump2java.house와 다르지만 HousePark의 lastname 변수가 protected로 설정되었기 때문에 eyp.lastname과 같은 접근이 가능하다.

접근 제어자의 접근 범위

public > protected > default > private

profile
Programmer

0개의 댓글