일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- error
- VCS
- Checkout
- constructor
- install
- gradle
- Android
- Class
- terms
- git
- syntax
- Android Studio
- 자바
- IntelliJ
- intellij 연동
- 상속
- cherrypick
- 캡슐화
- commit
- java
- 생성자
- IntelliJ IDEA Community
- TortoiseSVN
- 특징
- SSL
- svn
- Subversion
- 문법
- sourcetree
- Branch
Archives
- Today
- Total
Jay's Developer Note
[JAVA] 캡슐화 & 은닉화 본문
728x90
캡슐화 & 은닉화
캡슐화와 은닉화는 단어처럼 캡슐 알약에 비교하면 이해하기 쉽다.
감기약의 성분을 환자(사용자)는 알 필요가 없다. 단지 알약을 물과 함께 삼키면 속에서 약효가 발휘된다.
이처럼 외부에서 내부의 내용을 알 수 없게 감싼 구조를 캡슐화했다라고 할 수 있다. 그렇다면 자연스레 은닉화도 같이 된 것이다.
예시 코드들을 보면서 한 번 더 이해 해보도록하자.
예시 1
class Car {
// Bad
public String model;
public int maxSpeed;
}
외부에서 '직접' 멤버 변수에 접근할 수 있기 때문에 캡슐화에 위배되는 코드다.
그렇다면 캡슐화를 적용하려면 어떻게 해야 할까?
멤버 변수들을 숨기고(은닉화) 접근할 수 있는 창구를 만들어주면 된다.
class Car {
// 외부에서 접근 금지(은닉화)
private String model;
private int maxSpeed;
// 접근할 수 있는 메소드(창구) 생성
public String getModel() {
return this.model;
}
public void setModel(String model) {
this.model = model;
}
public int getMaxSpeed() {
return this.maxSpeed
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
위처럼 model, maxSpeed 를 설정할 수 있는 메소드들을 만들어서 외부와 통신하게 되는데 이를 getter/setter 라고 칭한다. Intellij 계열 IDE 에서는 'Alt + Insert' 를 누르면 손쉽게 getter and setter 를 만들어준다.
예시 2
이번에는 접근 제어자를 통해 외부의 창고와 내부 로직을 구분지어서 돌아가는 소스 코드를 대략 적어보겠다.
class Car {
public boolean startEngine() {
return startMotor();
}
// 자동차 시동모터 시작
private boolean startMotor() {
if (electricSensorOn()) {
// 전원인가가 성공하면 RPM 올리기
return rpmUp();
} else {
// 전원인가 안되면 시동 안 걸림
return false;
}
}
// 자동차 전기 센서 전원 공급
private boolean electricSensorOn() {
boolean isSuccess = false;
// 전기 센서들에 전원인가 성공하면 isSuccess = true
return isSuccess;
}
// 시동모터가 최소 RPM 까지 기계적인 힘으로 올려줌
private boolean rpmUp() {
boolean isSuccess = false;
// 시동모터가 최소 RPM 으로 올려주면 isSuccess = true
return isSuccess;
}
}
public 으로 선언된 startEngine 메소드만 외부(사용자)에서 접근이 가능하고, private 으로 선언된 메소드들은 내부에서 로직으로 활용된다.
외부에서는 아래처럼 사용하면 시동 여부만 가져와서 분기 처리를 할 수 있다.
class Hyundai {
public static void main(String[] args) {
Car mCar = new Car();
if (mCar.startEngine()) {
System.out.println("시동 걸림!");
} else {
System.out.println("시동 안 걸림..!");
}
// mCar.rpmUp(); // private 이기 때문에 에러발생
}
}
728x90
'JAVA' 카테고리의 다른 글
[JAVA] 임시 비밀번호 생성(feat. RandomStringUtils) (0) | 2022.05.25 |
---|---|
[JAVA] Class - 5(상속) (0) | 2022.04.02 |
[JAVA] Class - 4(메소드) (0) | 2022.03.13 |
[JAVA] Class - 3(멤버 변수) (0) | 2022.03.11 |
[JAVA] Class - 2(생성자) (0) | 2022.02.25 |