Hello

Java 캡슐화(Encapsulation), 캡슐화와 접근 제어자

by 볼빵빵오춘기

캡슐화(Encapsulation)

  • 자바의 중요 특징 중 하나이다.!
  • 관련 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 접근하지 못하도록 하여 데이터를 보호하는 이다.

 

캡슐화와 접근 제어자

  • 접근 제어자를 사용하여 외부로부터 데이터를 보호한다.
  • 직접접근은 막고 메서드를 통해 간접접근하도록한다.

⇒ 접근제어자의 범위는 좁을 수록 좋다. 필요할때 넓히도록한다.

 

예제

접근제어자가 없을 경우에서 접근제어자를 이용하는 경우까지 수정하는 과정의 예이다.

더보기

1. 접근제어자가 없을 경우

class Time{
	int hour;
	int minute;
	int second;
}

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.hour = 25;
		System.out.println(t.hour);

	}

}

⇒ class Time에 멤버들의 접근제어자 default로 했을 경우 class TimeTest에서 사용할때는 에러없이 잘 사용이 된다.

 

2. class Time의 멤버들의 접근제어자를 private로 변경해보자!

class Time{
	private int hour;
	private int minute;
	private int second;
}

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.hour = 25;
		System.out.println(t.hour);

	}

}

class TimeTest에서 바로 접근하여 사용을 못해 에러가 나는것을 확인이 가능하다.

그러면 어떻게 사용해야하나 메서드를 만들어 접근하면된다.

 

3. 메서드를 만들어 접근해보자!

class Time{
	private int hour;
	private int minute;
	private int second;
	
	public void setHour(int hour) {
		if(hour < 0 || hour > 23) return;
		this.hour = hour;
	}
	
	public int getHour() { return hour; }
	
	
}

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.setHour(21); 
		System.out.println(t.getHour()); // 21

	}

}
21

⇒ t.setHour(21)로 해서 값을 넣어주고 t.getHour()로 값을 빼와 출력하면 21이 출력된다.   

 

4. setHour(int hour) 안에 if문 조건이 false인 경우인 숫자를 넣어보면 어떨까?

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.setHour(21);
		System.out.println(t.getHour()); // 21
		t.setHour(100); 
		System.out.println(t.getHour()); // 21
	}

}
21
21

⇒ t.setHour(21)은 21 출력되고 serHour(100)을 했는데도 21이 출력된다.

응? 왜그럴까? 생각해보면 setHour 메서드에서 false일 경우에는 hour가 갱신되지 않는다.

 

5. serHour()안에 if문도 메서드로 만들어 써볼까?

class Time{
	private int hour;
	private int minute;
	private int second;
	
	public void setHour(int hour) {
		if(isValidHour(hour)) return;
		this.hour = hour;
	}
	
	// 매개변수로 넘겨진 hour가 유효한지 확인해주는 메서드 
	private boolean isValidHour(int hour) {
		return hour < 0 || hour > 23;
	}
	
	public int getHour() { return hour; }
	
	
}

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.setHour(21);
		System.out.println(t.getHour());
		t.setHour(100);
		System.out.println(t.getHour());

	}

}

⇒ // 매개변수로 넘겨진 hour가 유효한지 확인해주는 메서드 를 private로 한 이유는 isValidHour() 메서드는 여기 자바파일에서만 쓰기 때문이다. 그럼 public으로 해도 상관 없는거 아님? 이렇게 생각할 수도있는데 추후 수정 후 테스트를 할 경우 public이면 전체 코드를 확인해야하지만 privte이기때문에 현 자바파일만 테스트 확인하면된다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기