# 접근제한자와 게터 세터
## 들어가며
---
이전 시간 우리는 객체지향 프로그래밍에 대해 배웠습니다.

이번 시간에는 자바 API에 대한 내용을 배우기에 앞서, 접근 제한자에 대한 내용을 알아보도록 하겠습니다.
## 목차
---
1. 접근 제한자란
2. public과 private
3. 게터와 세터
## 1. 접근 제한자란
---
#### 무엇?
접근 제한자란, 말 그대로, 외부의 접근 권한을 제한하는 키워드입니다.
#### 왜씀?
만약 여러분의 지갑이 주변 사람들에게 공개되어있다면 어떨까요? 또는 여러분의 통장 비밀번호가 외부에 알려져있다면 어쩌죠? 이와 같이 객체의 정보 또한 외부로의 접근을 제한해야 할 필요가 있습니다. 이를 위한 키워드가 바로 접근 제한자인거죠.
#### 종류?
접근 제한자의 종류는 총 4가지로, 외부 접근을 거부하는 private(비공개)에서부터 모든 접근을 허용하는 public(완전 공개)까지 존재합니다.

이들 중 가장 핵심이 되는 private과 public에 대해 계속해서 알아보도록 할까요?
## 2. public과 private
---
#### 역할?
public 키워드는 완전한 공개를 의미합니다. 모두가 사용할 수 있는 공공의 산물이 되는 것이죠. 이와 반면 private은 완전한 차단을 의미합니다. 오직 해당 클래스 내부에서만 사용할 수 있게 되죠.

#### 코드 예
이러한 접근제한자는 클래스 및 필드와 메소드에 적용될 수 있는데요, 코드 예를 통해 이를 알아보도록 하죠. 아래는 신용카드 클래스의 예입니다.
```
public class CreditCard {
private String cardNumber; // 카드 번호를 외부로부터 보호
private double expenses; // 사용 금액을 외부로부터 보호
// 외부로부터 메소드 호출을 허용
public void charge(double amount) {
expenses = expenses + amount;
}
// 외부로부터 메소드 호출을 허용
public String getCardNumber(String password) {
if (password.equals("SECRET!@#$")) {
return cardNumber;
}
return "ERROR!"
}
}
```
#### 코드 설명
보시면 카드 번호와 사용 금액이 private 선언되어있죠? 왜일까요? 맞습니다. 이 두 정보는 외부에서 함부로 접근하거나 변경되면 안되기 때문인거죠. 보안이 필요하기 때문에 private 선언이 되었습니다.
반대로 카드 사용과 카드번호를 가져오는 메소드는 public을 사용해주었네요. 특별히 카드번호를 가져오는 것은 public을 통해 공개됐지만, 비밀번호를 통해 2차 보안이 되어있는 것은 조금 눈여겨볼 만합니다.
> 접근제한자의 사용은, 외부 공개 여부를 따라
> public 또는 private 을 적절히 선언해주세요.
## 3. 게터와 세터
---
#### 계좌 클래스 예
다른 예를 또 확인해볼까요? 아래는 은행 계좌를 코드화한 것입니다.
```
public class Account {
// 통장 잔액 필드를 private하게 하여 임의 접근을 막는다!
private int balance;
}
```
#### 게터(getter)
계좌의 잔액을 private 선언하여 보호하고 있는데요. 만약 잔액을 확인해야 하는 상황이 생긴다면 어떻게 해야 할까요? 이미 private으로 인해 외부에서의 접근은 막혀버린 상황인데 말이죠. 이럴 때는 **게터**(getter) 메소드를 만들어 주어야 합니다. 게터를 사용하면 private 필드를 우회하여 가져올 수 있게 되죠.
```
public class Account {
// 통장 잔액 필드를 private하게 하여 임의 접근을 막는다!
private int balance;
// 게터(getter) 메소드
public String getBalance() {
return balance;
}
}
```
#### 세터(setter)
잔액을 변경해야 할 때도 있겠죠? 이럴때는 **세터**(setter)를 만드셔야 합니다. 세터를 사용하면 private 필드 값을 변경할 수 있습니다.
```
public class Account {
// 통장 잔액 필드를 private하게 하여 임의 접근을 막는다!
private int balance;
// 게터(getter) 메소드
public String getBalance() {
return balance;
}
// 세터(setter) 메소드
public void setBalance(int i) {
balance = i;
}
}
```
실제로 private 선언된 필드가 어떻게 보호되는지, 또 게터와 세터는 어떻게 동작하는지에 대한 내용들은 실습을 통해 더 연습해보도록 하겠습니다.
## 요약
---
#### 접근 제한자
- 접근 제한자란, 외부로부터 접근을 제어하는 키워드이다.
- 접근 제한자의 종류는 4가지로, private/default/protected/public 이 있다.
- private은 비공개, public은 완전 공개를 의미한다.
#### 게터와 세터
- private 필드는 외부 접근이 불가능하다
- 게터를 사용하면 private 필드를 우회적으로 가져올 수 있다.
- 세터를 사용하면 private 필드를 우회적으로 변경할 수 있다.
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5cf501784151a70014a87dc6" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5cf501784151a70014a87dc6/q/1?method=iframe"></iframe></div></div>