Java

Java(접근 제어 지시자/ getter와 setter)

yoooon1212 2024. 4. 17. 11:09

<접근 제어 지시자>

 

클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를

사용할 수 있는지 여부를 지정하는 키워드

 

접근 제어 지시자의 종류

  • public: 어디에서든 접근 가능(다른 패키지에서 접근 가능)
  • default: 같은 패키지 내에서 접근 가능(기본값)
  • protected: 같은 패키지, 상속(자식 객체)만 사용 가능 
  • private: 해당 .java 안에서만 접근 가능(객체 내부)

 

 

생성자의 접근 제한

생성자는 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;
}