캡슐화(Encapsulation)
데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것
즉, 속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것
private 접근 제어자 활용
객체 = 속성(데이터) + 기능(메서드)
- 데이터를 숨겨라
객체의 속성(데이터)값은 외부에서 직접 접근할 수 없게 막아야 한다.
객체의 데이터는 메서드를 통해서만 접근할 수 있다. - 기능을 숨겨라
객체의 기능 중에서 외부에서 사용하지 않고 내부에서만 사용하는 기능들은 숨겨야 한다.
사용자 입장에서 꼭 필요한 기능만 외부에 노출하고, 나머지 기능은 모두 내부로 숨기자.
좋은 캡슐화: 데이터는 모두 숨기고, 기능은 꼭 필요한 기능만 노출하는 것
Setter메서드와 Getter메서드를 구성해서 private 변수에 접근할 수 있도록 한다.
Setter 메서드
public void setXXX(매개변수) {
멤버변수=매개변수;
}
데이터(속성)가 private 접근 제어자로 인해 값을 직접 변경할 수 없는 경우, setter 메서드를 통해 데이터를 변경할 수 있다.
package day06;
public class RamenMachine {
double soup;
int noodle;
float water;
//setter
public void setSoup(double soup){
this.soup = soup;
}
public void setNoodle(int noodle){
this.noodle = noodle;
}
public void setWater(float water){
this.water = water;
}
}
Getter 메서드
public 반환타입 getXXX(){
return 멤버변수;
}
외부에서 객체의 데이터를 읽을 때도 메서드를 사용하는 것이 좋다. Getter 메서드는 내부의 멤버변수에 저장된 값을 외부로 리턴한다.
package day06;
public class RamenMachine {
double soup;
int noodle;
float water;
//getter
public double getSoup(){
return soup;
}
public int getNoodle(){
return noodle;
}
public float getWater(){
return water;
}
}
[전체 코드]
Class: RamenMachine
package day06;
public class RamenMachine {
double soup;
int noodle;
float water;
//setter
public void setSoup(double soup){
this.soup = soup;
}
public void setNoodle(int noodle){
this.noodle = noodle;
}
public void setWater(float water){
this.water = water;
}
//getter
public double getSoup(){
return soup;
}
public int getNoodle(){
return noodle;
}
public float getWater(){
return water;
}
}
Main: RamenStore
package day06;
public class RamenStore {
public static void main(String[] args) {
RamenMachine ramen1 = new RamenMachine();
//setter메서드 이용해서 soup, noodle, water 값을 각각 설정
ramen1.setSoup(1.2);
ramen1.setNoodle(300);
ramen1.setWater(450.5f);
//getter메서드 이용해서 soup, noodle, water 값을 각각 출력
System.out.println("soup양: " + ramen1.getSoup() + "g");
System.out.println("noodle양: " + ramen1.getNoodle() + "g");
System.out.println("water양: " + ramen1.getWater() + "mL");
}
}