Java(접근 제어 지시자/ getter와 setter)
<접근 제어 지시자>
클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를
사용할 수 있는지 여부를 지정하는 키워드
접근 제어 지시자의 종류
|
생성자의 접근 제한
생성자는 public, default, private 접근 제한으 가질 수 있다.
public - 모든 패키지에서 객체 생성 및 생성자 호출 가능
default - 같은 패키지에서만 객체 생성 및 생성자 호출 가능
private - 클래스 내부에서만 객체 생성 및 생성자 호출 가능
public class A{
//필드 선언
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열")
//생성자 선언
public A(boolean b){}
A(int b){}
private A(String s){}
}
필드와 메서드의 접근 제한
필드와 메서드 는 public, default, private 접근 제한으 가질 수 있다.
public - 모든 패키지에서 필드를 읽고 변경 및 메서드 호출 가능
default - 같은 패키지에서만 필드를 읽고 변경 및 메서드 호출 가능
private - 클래스 내부에서만 필드를 읽고 변경 및 메서드 호출 가능
// 필드 선언
public int field1;
int field2;
private int field3;
// 메서드 선언
public void method1(){}
void method2(){}
private void method3(){}
<은행의 입, 출금 흐름 생성>
public class Bank {
private String name; //-> private으로 정보 은닉
private int balance;// 전액
// 입금
public void deposit(int money) {
balance += money;
showInfo();
}
// 출금
public int withdraw(int money) {
// 방어적 코드 작성
if (balance < money) {
System.out.println("잘못된 요청입니다.");
return 0; // -> 0 원을 출금함.
}
balance -= money;
showInfo();
return money; // -> 출금하고자 하는 금액 money 만큼 출금함.
// return balance: -> 전액이 출금됨.
}
// 현재 총 잔액
public void showInfo() {
System.out.println("현재 잔액 :" + this.balance);
}
public int getBalance() {
return this.balance;
} // -> private으로 숨겨있던 balance를 불러냄.
public void setName(String inputName) {
this.name = inputName;
}
public void setBalance(int money) {
if (money < 0) {
System.out.println("잘못된 입력입니다.");
} else {
this.balance = money;
}
}
}
<BankTest class 생성>
public class BankTest {
public static void main(String[] args) {
Bank bank1 = new Bank();
// bank1.name = "우리은행";
bank1.deposit(10_000); // 2만원 입금
int getMoney = bank1.withdraw(5_000); // 만원 출금 //리턴타입 int 변수 입력
System.out.println("-----출금-----");
System.out.println("금액 : " + getMoney); // 출금 후의 금액 출력됨
// bank1.balance = 100_000;
bank1.deposit(100_000); // 10만원 입금
System.out.println(bank1.getBalance()); // getBalance(): 은닉되어 있던 balance 값을 getter를 통해 불러냄.
int money = bank1.getBalance(); // getter는 리턴타입이라 int 변수 작성
if (money <= 200_000) {
System.out.println("본점에 금액을 요청해");
}
System.out.println("------------");
bank1.setName("그린은행");// -> .SetName을 통해 Bank.java의 public void setName()를 호출함.
// setter라서 은행 이름을 그린은행으로 덮어씌움.
System.out.println(bank1.getName());
bank1.setBalance(1000_000);
System.out.println(bank1.getBalance());// balance 전액을 100만원으로 덮어씌움.
}
}
Protected 접근 제한자
같은 패키지에서는 default 처럼 접근이 가능하나, 다른 패키지 애서는 자식 클래스만 접근을 허용한다.
같은 패키지 일 때 B는 A의 protected 필드, 생성자, 메서드에 접근 가능하다.
public class A{
protected String field; //필드 선언
protected A(){} //생성자 선언
protected void method(){} //메서드 선언
}
public class B{
public void method(){
A a = new A(); // A 생성자 호출
a.field = "value"; // A의 field 값 초기화
a.method(); // A의 method() 메서드 호출
}
다른 패키지 일 때 C는 A의 protected 필드, 생성자, 메서드에 접근 불가능하다.
public class C{
public void method(){
A a = new A(); // X
a.field = "value"; // X
a.method(); // X
}
다른 패키지 이지만 A의 자식 클래스일 때 D는 A의 protected 필드, 생성자, 메서드에 접근 가능하다.
(단, new 연산자로는 생성자를 직접 호출할 수 없다. 자식 생성자에서 super()로 A 생성자를 호출할 수 있다.)
public class D extends A{
// 생성자 선언
public D(){
super(); // A() 생성자 호출
}
// 메서드 선언
public void method1(){
this.field = "value"; // A 필드값 변경
this.method(); //A 메서드 호출
//위는 상속을 통해서만 사용 가능하다.
public void method2(){
A a = new A(); // X
a.field = "value"; // X
a.method(); // X
} // 직접 객체를 생성해서 사용X
getter와 setter
- 접근제어 지시자가 private인 경우 외부에서 객체의 필드를 읽을 때 Getter인 get + 필드명(첫글자 대문자)() 메소드를 이용해야 한다.
- 접근제어 지시자가 private인 경우 외부에서 접근하지 못하므로 필드를 변경하기 위해서는 Setter인 set + 필드명(첫글자 대문자)() 메소드를 이용해야 한다.
즉, getter는 private으로 숨겨진 정보를 읽어내는 것,
setter는 private으로 숨겨진 정보를 매개변수를 입력해서 원래의 정보를 매개변수로 덮어씌우는 것(변경하는 것)
작성 방법)
public String getName() {
return this.name;
}
public void setName(String inputName) {
this.name = inputName;
}
public int getHp() {
return this.hp;
}
public void setHp(int inputHp) {
this.hp = inputHp;
}
public int getPower() {
return this.power;
}
public void setPower(int inputpower) {
this.power = inputpower;
}
필드 타입이 boolean 일 경우 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례이다.
private boolean stop;
//Getter
public boolean isStop(){
return stop;
}