- private - : 동일 객체 안 (객체 자신만)
- (package) ~ : 동일 패키지 사용 (특별히 패키지를 주지 않을 경우 default 패키지라 해서, 같은 경로에 있으면 ok) = 패키지 접근제한자
- protected # :
- public + : 제한x 아무나 다 쓸 수 있음
/*
접근제한자 선택
멤버변수 : private
메서드 : public
생성자 : public
*/
class Some {
private int num1 = 2;
int num2 = 3;
public int num3 = 4;
}
class UseSome {
public static void main(String[] args) {
Some s = new Some();
s.num3 = 100;
s.num2 = 50;
s.num1 = 8;
}
}
// 클래스 = 어차피 코드 파일당 클래스 하나. 원칙적으론 충돌할 일이 x고 밖에서 변경도 불가 => public
/*
멤버변수 = 내가 모델링하려는 대상이 원래 가지고 있는 값 (상태)
"이 객체가 무엇인가"를 설명하는 변수 - 함부로 바뀌면 객체가 의도치않은 무언가가 될 수 있음
소유자가 바꾸려고 하는 게 아닌 한, 바깥에서 바꿀 수는 없다! => private
메서드, 생성자 = 처음 클래스를 만든 사람이 정의한 대로 동작할 뿐, 바뀌지 않음! => public
즉 변경가능한 멤버변수는 지켜주고, 변경불가능한 메서드, 생성자는 공공재로 사용
*/
/*
이제부터 멤버변수를 설정, 변경하는 법
1. 생성자 사용 (처음에만)
2. getter, setter 사용 (=접근자, 설정자)
*/
class Human {
private String name;
private int age;
public Human(String name, int age){
this.name = name;
this.age = age;
}
// !!!헤더는 바꿀 수 없다!!! 그 외 내용은 변경 가능
// getter : 멤버변수를 가져오는 역할
// 메서드명은 get변수이름, return은 변수값
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter : 멤버변수의 값을 변경하는 역할
// 메서드명은 set변수이름, this.변수 = 변수
public void setName(String name) {
this.name = name;
}
public void setAge(int Age) {
this.age = age;
}
public String toString(){
return name + " : " + age;
}
}
class UseHuman {
public static void main(String[] args) {
Human h = new Human("아이유", 29);
System.out.println(h);
}
}
사용 예시
class MyObj {
private int num;
private String str;
private boolean ok;
private char type;
private double rate;
// getters
public int getNum() {
return num;
}
public String getStr() {
return str;
}
public boolean isOk() {
// boolean은 get이 아니라 'is변수명'으로 지정
return ok;
}
public char getType() {
return type;
}
public double getRate() {
return rate;
}
public void setNum(int num) {
this.num = num;
}
public void setStr(String str) {
this.str = str;
}
public void setOk(boolean ok) {
this.ok = ok;
}
public void setType(char type) {
this.type = type;
}
public void setRate(double rate) {
this.rate = rate;
}
}
class UseMyObj {
public static void main(String[] args) {
// 1. MyObj 객체 o를 만든다.
MyObj o = new MyObj();
// 2. 각 멤버변수에 100, "abc", false, 'o', 3.14 를 대입한다.
o.setNum(100);
o.setStr("abc");
o.setOk(false);
o.setType('o');
o.setRate(3.14);
// 3. 2에서 작업한 결과를 getter를 이용하여 출력한다.
System.out.println(o.getNum());
System.out.println(o.getStr());
System.out.println(o.isOk());
System.out.println(o.getType());
System.out.println(o.getRate());
}
}
- getter, setter 메서드의 의미 : '소유자의 의도를 따르겠다'는 것
멤버변수를 직접 꺼내는 게 아니라, 소유자가 허락해줄 때 허락하는 방식
제한적 접근! 소유자는 조건을 달 수 있음
❗❗❗ 소유자의 의도가 묻어있는 getter setter 사용하자 ❗❗❗
행위는 객체 외부가 아니라 내부에서 이루어진다
- private의 의미 : 밖에서 함부로 볼 수 없게 함 (가시성)
하나를 바꾸면 다른 것도 한 번에 바뀌도록 코드를 작성함
(= 중복 소거)
ex)
age값을 변경할 때 모두 setAge로 처리한다면 응집성이 높아진다