Private 와 Public 의 차이
Private 멤버는 class 외부에서 접근할 수 없는 변수를
Public 멤버는 class 외부에서 접근할 수 있는 변수를 의미합니다.
이 말이 어떤내용을 의미하는지는 아래에서 설명드리겠습니다.
Public 멤버일 때의 문제점
Car 클래스 fuel 은 Public 멤버로 선언이 되어 있습니다.
위에서도 설명드렸다시피, Public 멤버는 class 외부에서 값을 직접 바라볼 수 있다는 점입니다.
따라서 자동차의 연료는 음수가 될 수 없는데도, 음수를 직접 대입하여 설정할 수 있습니다.
클래스는 '사물' 과 '특성' 에 보다 근접한 코드를 만들기 위해 설계됩니다.
그러므로 예외에 대한 처리를 해야 할 필요가 있습니다.
왜냐하면 예외처리를 클래스 외부에서 하는 경우,
모든 클래스 외부에서 호출되는 소스에서 예외처리를 해야하기 때문이고 캡슐화에 대한 정책에도 위배됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class PublicMemberIssue {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car carObject = new Car();
carObject.fuel = 10;
carObject.show();
carObject.fuel = -10;
carObject.show();
}
}
class Car
{
int fuel;
void show() {
System.out.println ("연료의 양은 " + fuel + " 입니다.");
}
}
|
cs |
Private 멤버의 장점
자바에서는 이렇게 클래스 멤버변수에 직접 접근하는 코드를 막기 위해 Private 기능을 제공합니다.
Private 멤버는 외부에서 값을 직접적으로 대입시킬 수 없습니다.
Private 변수에 값을 대입하기 위해서는 public 으로 제공되는 SET 함수를 사용하는 방식으로 해야합니다.
SET 함수에서는 Private 멤버에 제약조건을 걸어서 예기치 않은 값에 대해 문제를 방지할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class PrivateMember {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car2 carObject = new Car2();
// 값을 직접 대입할 수 없다.
//carObject.fuel = 10;
carObject.setFuel(10);
System.out.println(carObject.getFuel());
carObject.setFuel(-10);
System.out.println(carObject.getFuel());
}
}
class Car2
{
private int fuel;
void setFuel ( int inputFuel ) {
if ( inputFuel > 0 && inputFuel <= 100) {
this.fuel = inputFuel;
}
else {
System.out.println("fuel 값이 올바르지 않습니다.");
}
}
int getFuel () {
return this.fuel;
}
}
|
cs |
캡슐화의 원리
위의 코드에서 Car 클래스에 Private 멤버로 선언하고 값이 올바른지 여부를 클래스내에서 스스로 확인하는 기능을 적용하였습니다.
이런 메커니즘을 도입함으로써, 잘못된 값이 실수로라도 들어오는 경우를 방지할 수 있습니다.
( 다른 사람이 개발할 때도 견고한 프로그램을 만들 수 있게 되는 일석이조도 있습니다. )
이처럼 클래스에 데이터(필드)와 기능(메소드)을 한 곳에 모아둔 다음
보호하고 싶은 멤버에 private 를 붙여 접근을 제한하는 기능을 일컬어 캡슐화라고 합니다.
참고로 보통의 경우 필드(변수)는 private 로 함수(메소드)는 public 로 지정하곤 합니다.
자바 Private 멤버
자바 Public 멤버
자바 캡슐화의 원리
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] 자바 생성자 사용방법과 생성자 오버로딩 방법 (0) | 2020.11.23 |
---|---|
[JAVA] 자바 오버로딩의 원리 알아보기 (0) | 2020.11.22 |
[JAVA] 자바 SET, GET 를 사용하는 이유와 예제 (0) | 2020.11.06 |
[JAVA] 자바 클래스 변수에 값 대입하기, 클래스 메소드와 인자 사용하기 (0) | 2020.11.05 |
[JAVA] 자바 클래스란, 클래스 객체 생성하는 방법 (0) | 2020.11.05 |