[Java] 정보 은닉(Informaiton Hiding)

김용준·2022년 9월 29일
0

Java Basic

목록 보기
18/22

정보 은닉(Informaiton Hiding)이란?

  • 외부로부터 객체의 멤버에 대한 접근을 제한하는 것.
  • 멤버에 대한 직접적인 접근을 허용하지 않음으로써 객체에 포함된 정보의 손상과 오용을 막기 위해 사용한다.

외부로부터 객체의 접근을 막는다면 어떻게 객체의 멤버변수나 메소드를 사용할 수 있을까? 해당 객체가 갖고 있는, 그리고 외부에서 사용할 수 있는 메소드를 통해 간접적인 접근이 가능하다. 그 메소드가 바로 getter, setter메소드다.

그 동안 생성한 객체의 멤버변수에 접근할 때 사용했던 방법은 다음과 같다.

Car car1 = new Car();

// car1객체의 price에 5000을 대입한다.
int x = 5000;
car1.price = x;

// car1객체의 price의 값을 y에 대입한다.
int y = car1.price + 2000;

그러나 정보 은닉을 구현하기 위해 객체 내에 간접적인 접근이 가능한 메소드를 정의한다.

get() 메소드

Car클래스의 멤버변수를 접근제한자private을 통해 외부에서 접근하지 못하도록 정의했다. 그러나 멤버변수의 값을 반환하는 get()메소드를 정의함으로써 간접적인 접근을 허용한다.

public class Car {

	private String name;
	private String maker;
	private int price;
	
	public String getName() {
		return name;
	}

	public String getMaker() {
		return maker;
	}

	public int getPrice() {
		return price;
	}

	public Car(String name, String maker, int price) {
		this.name = name;
		this.maker = maker;
		this.price = price;
	}
}

Car객체를 직접 정의한 생성자를 통해 초기화했다. Car객체의 멤버변수들은 private이기 때문에 car.멤버변수명과 같은 방법으로 접근할 수 없다. 그래서 get()메소드를 통해 간접적으로 접근한다.

public class CarApp {


	public static void main(String[] args) {
		
		Car car = new Car("3-series", "BMW", 5000);
		
        // 객체의 각 멤버변수들을 반환받고 main메소드에서 정의한 변수에 대입한다.
		String name = car.getName();
		String maker = car.getMaker();
		int price = car.getPrice();
	}
}

set() 메소드

앞의 예제에 더해 set()메소드도 정의했다. 멤버변수의 타입에 맞는 값을 인자로 전달받아 객체의 멤버변수에 대입하는 메소드다.

public class Car {

	private String name;
	private String maker;
	private int price;

	public String getName() {
		return name;
	}

	public String getMaker() {
		return maker;
	}

	public int getPrice() {
		return price;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setMaker(String maker) {
		this.maker = maker;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public Car(String name, String maker, int price) {
		this.name = name;
		this.maker = maker;
		this.price = price;
	}
}

객체 생성 시 초기화되었던 멤버변수들에 새로운 값을 대입했다. car.멤버변수명이 아니라, set()메소드를 통해 간접적으로 대입했다.

public class CarApp {


	public static void main(String[] args) {
		
		Car car = new Car("3-series", "BMW", 5000);
		
		System.out.println(car.getName());
		System.out.println(car.getMaker());
		System.out.println(car.getPrice());
		
		car.setName("E-class");
		car.setMaker("Benz");
		car.setPrice(8000);
		
		System.out.println();
		System.out.println(car.getName());
		System.out.println(car.getMaker());
		System.out.println(car.getPrice());
		
	}
}
출력

3-series
BMW
5000

E-class
Benz
8000
profile
차선이 모여 최선이 된다.

0개의 댓글