보통 우리가 접근 제어자를 쓰기전 사용하는 코드는
public class Person{
int age;
}
여기서 age 변수에 접근하려면 그냥 클래스를 불러와서 값을 입력해주는
다음과 같은 방식이다
public class Driver {
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 28;
p1.age = -10;
System.out.println(p1.age);
}
}
이 코드는 굉장히 불편한 코드다.
사실 나이에 음수가 입력되면 안되지만 위 코드는 음수도 입력이 되고
중요한것은 객체에 대한 권한이 public 이기때문에 어느 클래스에서든 접근이 가능하다.
Java에서는 이러한 상황을 막기위한 접근제어자 라는것이 있다.
위 코드의 age변수에 private 라는 제어자를 붙여주면 된다.
public class Person{
private int age;
}
접근제어자 private는 다른 클래스에서 접근할 수 없고 오직 해당 클래스에서만
값을 변경 또는 읽는 것이 가능해진다.
그러면 age값을 다른 클래스에서 변경하고싶다면 어떻게 할까?
해결방법으로 메소드를 이용하는 방법이 있다.
public class Person {
private int age;
public void setAge(int newAge) {
if (newAge > 0) {
age = newAge;
}
}
public int getAge() {
return age;
}
}
위 코드에서 setAge 와 getAge 같은 메소드를 흔히 setter, getter 메소드로 부르는데
다른 클래스에서 접근하려고 할 때 setter, getter 를 통해 변수에 접근하여
값을 변경 또는 읽을 수 있다.
그냥 접근해서 값을 바꿔줄 수 있게 private를 사용하지 않으면 되지
왜 굳이 private 를 사용해서 접근을 제어하게 만들까?
접근제어자를 공부하던 중 위 질문에 대한 답이 너무 궁금했다.
어찌되었든 접근을 하여 값을 변경 또는 읽을 것이라면
왜 private를 사용해서 필요없는 메소드를 두개나 더 만들까?..
위 링크에 나온 oyeon님의 블로그에서 많은 해답을 얻었습니다.
관건은 캡슐화
객체지향 프로그래밍의 캡슐화를 달성하기 위해 접근제어자를 사용한다고 볼 수 있는데
그러면 캡슐화의 장점은 무엇일까?
1. 다른 객체에게 자신의 정보를 숨기고 오직 연산만을 통해서
접근이 가능하도록 할 수 있다.
메소드를 통한 값 변경, 읽기 가 그 예이다.
2. 변수를 private로 설정하고 setter 메소드를 구현하지 않고
getter 메소드만 구현 함으로써 값을 변경할 수 없고 오직 읽기만 가능하도록 만들어 줄 수 있다는 것이 장점이다.
3. setter 메소드를 이용하여 외부에서 할당하는 값에 조건을 달아줄 수 있다.
위에 언급한 나이에 대한 양수 조건이 그 예이다.
public class Calculator {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
Calculator c = new Calculator();
System.out.println(c.add(2, 4)); // test 1
System.out.println(c.add(2, 4, 8)); // test 2
System.out.println(c.add(3.14, 2.54)); // test 3
}
}
6
14
5.68
이처럼 add라는 이름의 메소드가 3개나 있는데 안에 있는 파라미터 들이 다르기 때문에
Java에서는 다른 메소드로 인식을 할 수 있다.