접근 제어 지시자 ( access modifier )란?
클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
접근 제어 지시자의 종류
- public : 어디서든 접근이 가능
- default : 같은 패키지 내에서 접근 가능
- protected : 상송 배운 이후 다시 설명 해주신다고 함
- private : 해당 .java 안에서만 접근이 가능
💡접근 제어자 - 정보 은닉, 캡슐화
객체의 각각의 상태값은 직접 변수를 통해서 변경하는 것이 아닌 기능(행위, 메서드)를 통해서 변경하게 설계해야 하기 때문에 접근 제어 지시자를 사용한다.
연습
package ch10;
public class Bank {
String name;
int balance;
// 메서드
// 1. 입금하다
public void deposit(int money) {
balance = balance - money;
}
// 2. 출금하다
public int withdraw(int money) {
balance = balance - money;
return money;
}
// 3. 현재 은행의 총 잔액을 출력하다
public void showInfo() {
System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
}
}// end of class
먼저 클래스와 메서드를 설계한다
은행이라고 생각하면 할 수 있는 행동은
1. 출금
2. 입금
3. 현재 잔액이다
package ch10;
public class Bank {
String name;
int balance;
// 메서드
// 1. 입금하다
public void deposit(int money) {
balance = balance - money;
}
// 2. 출금하다
public int withdraw(int money) {
if(balance < money) {
System.out.println("잘못된 요청입니다.");
return 0;
}
balance = balance - money;
return money;
}
// 3. 현재 은행의 총 잔액을 출력하다
public void showInfo() {
System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
}
}// end of class
2. 출금하다 에서 입금되어 있는 돈보다 출금하는 돈이 많을 수도 있으니 System.out.println(); 으로
잘못된 요청이라고 출력하고 return 0; 을 주는데 출금하다의 반환이 int니까 return에 인트값 0을 선언한다
package ch10;
public class BankTest {
// 코드의 시작점
public static void main(String[] args) {
//인스턴스 화
Bank bank1 = new Bank();
bank1.deposit(10_000);
}// end of main
}// end of class
BankTest에 클래스 Bank를 인스턴스 화 시켜주고 이 bank1에 10,000원을 입금
-> 얼마 입금 되었는지 출력하고 싶다면 Bank deposit에 System.out.println(); 으로 잔액을 출력하는 메서드 showInfo();를 추가해준다.
package ch10;
public class Bank {
String name;
int balance;
// 메서드
// 1. 입금하다
public void deposit(int money) {
balance = balance + money;
showInfo();
}
// 2. 출금하다
public int withdraw(int money) {
if(balance < money) {
System.out.println("잘못된 요청입니다.");
return 0;
}
balance = balance - money;
return money;
}
// 3. 현재 은행의 총 잔액을 출력하다
public void showInfo() {
System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
}
}// end of class
출금도 해보자
package ch10;
public class BankTest {
// 코드의 시작점
public static void main(String[] args) {
//인스턴스 화
Bank bank1 = new Bank();
bank1.deposit(10_000);
int getMoney = bank1.withdraw(10_000);
System.out.println(">>>> 출금 >>>>");
System.out.println("금액 : " + getMoney);
}// end of main
}// end of class
package ch10;
public class Bank {
String name;
int balance;
// 메서드
// 1. 입금하다
public void deposit(int money) {
balance = balance + money;
showInfo();
}
// 2. 출금하다
public int withdraw(int money) {
if(balance < money) {
System.out.println("잘못된 요청입니다.");
return 0;
}
balance = balance - money;
showInfo();
return money;
}
// 3. 현재 은행의 총 잔액을 출력하다
public void showInfo() {
System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
}
}// end of class
실행의 흐름을 보면
Bank bank1 = new Bank();
bank1.deposit(10_000);
int getMoney = bank1.withdraw(10_000);
System.out.println(">>>> 출금 >>>>");
System.out.println("금액 : " + getMoney);
먼저 입금된 금액
출금되고 난 후의 금액
그리고 >>>> 출금 >>>> 출력(sysout)
금액
getter, setter를 이용해서 상단 코드 변경
package basic.ch10;
import java.util.Scanner;
//은행이라고 바라보자.
public class Bank {
// 아무것도 지정하지 않으면 default 제어 지시자이다.
// public String name;
// private 은 클래스 안에서만 사용이 가능하다.
// private int balance;
private String name;
private int balance;
// 메서드
// 1. 입금하다
public void deposit(int money) {
balance = balance + money;
showInfo();
}
// 2. 출금하다
public int withdraw(int money) {
// 방어적 코드를 작성
if(balance < money) {
System.out.println("잘못된 요청입니다.");
return 0; // int 값을 리턴해야 되니까 0;
}
balance = balance - money;
showInfo();
return money; // 반환해줘야 하니까 return
}
// 3. 현재 은행의 총 잔액을 출력하다
public void showInfo() {
System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
}
// 정보 은닉()후에 getter, setter 메서드를 설계해 둘 수 있다.
// get 메서드란 단순히 객체의 상태 변수를 리턴하는 메서드이다.
public int getBalance() {
return this.balance;
}
public String getName() {
return this.name;
}
Scanner sc = new Scanner(System.in);
String name2 = sc.next();
// setter 멤버 변수에 접근해서 객체의 상태 값을 변경하게 하는 메서드(리턴 타입 없음)
public void setName(String inputName) {
if(name2.length() < 4) {
System.out.println("3글자 이상 입력하세요.");
}
this.name = inputName;
}
public void setBalance(int money) {
// 방어적 코드 작성하기
if(money < 0) {
System.out.println("잘못된 입력입니다.");
}else {
this.balance = money;
}
}
}// end of class
setter setName 멤버 변수에 접근해서 방어적 코드 - 이름을 3글자 이상 입력하도록 만들었는데
이름은 String 참조 타입이고 name2 < 4는 안되서 문자열의 길이를 나타내는 .length()를 활용해서 if문을 완성하였다.
💡getter, setter는 "only read" 즉 오직 읽기만 가능하기 때문에
private 값을 바꾸려면 setter 멤버 변수에 접근해서 객체의 상태를 변경 할 수 있다.
getter, setter 연습
private String name;
private int hp;
private int power;
private double defense;
private boolean isDie;
를 이용해서
getter, setter 메서드를 만들어 주세요.
package basic.ch10;
public class Hero {
private String name;
private int hp;
private int power;
private double defense;
private boolean isDie;
// getter, setter 메서드를 만들어 주세요.
// !! getter, setter 는 'only read' 만 가능하다 //
// 그래서 private 값을 바꾸러면 setter 멤버변수에 접근해서 객체의 상태를 변경
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public double getDefense() {
return defense;
}
public void setDefense(double defense) {
this.defense = defense;
}
public boolean getIsDie() {
return isDie;
}
public void setIsDie(boolean isDie) {
this.isDie = isDie;
}
}// end of class
'Java' 카테고리의 다른 글
static 변수 (0) | 2024.04.19 |
---|---|
this (0) | 2024.04.19 |
객체 지향 패러다임 (0) | 2024.04.16 |
생성자 ( Constructor ) (0) | 2024.04.16 |
RunTime Data Area (0) | 2024.04.15 |