Java

2024.04.17 접근 제어 지시자

정훈5 2024. 4. 17. 08:49
학습 목표 

1. 접근 제어 지시자란? 
2. 접근 제어 지시자에 종류를 알아 보자.

 

접근 제어자 - 정보 은닉, 캡슐화

객체의 각각의 상태값은 직접 변수를 통해서 변경하는 것이 아닌 기능(행위, 메서드)을 통해서 변경하게 설계 해야 한다.

 

접근 제어 지시자란?

클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드

 

접근 제어 지시자에 종류를 알아 보자.

public —> 어디에서든 접근 가능 함.

default —> 같은 패키지 내에서 접근 가능

protected ← 상속 배운 이후

private —> 해당 .java 안에서만 접근이 가능하다.

 

시나리오 코드 1

package basic.ch10;

// 은행
public class Bank {
	
	// 속성
	// 아무것도 지정하지 않으면 default "제어 지시자"이다.
	String name; // 기본값 : null
	int balance;
	
	// 입금하다.
	public void deposit(int money) {
		balance = balance + money;
		showInfo();
	} // end of deposit()
	
	// 출금하다.
	public int withdraw(int money) {
		// 방어적 코드를 작성한다.
		if(balance < money) {
			System.out.println("잘못된 요청입니다.");
			return 0; 
		}
		balance = balance - money;
		showInfo();
		return money;
	} // end of withdraw()
	
	// 현재 은행 잔액을 출력 하다.
	public void showInfo() {
		System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
	} // end of showInfo()

} // end of class

 

package basic.ch10;

public class BankTest {
	// 코드의 시작점
	public static void main(String[] args) {
		
		Bank bank1 = new Bank(); // 인스턴스 생성
		
		bank1.name = "우리은행";
		bank1.deposit(10_000);
		int getMoney = bank1.withdraw(10_000); // return 타입 값이 money 이다.
		System.out.println(">>>>>> 출금 >>>>>>>>"+getMoney);
		System.out.println("금액 : " +getMoney);
		
	} // end of main

} // end of class

 

private 사용, Getter 사용 , Setter 사용

package basic.ch10;

// 은행
public class Bank {
	
	// 속성
	// 아무것도 지정하지 않으면 default "제어 지시자"이다.
	private String name; // 기본값 : null
	// 정보 은닉 : 외부에서는 확인 안되어야 하는 중요한 변수를 감춘다.
	private int balance; // 정보 은닉(private)
	
	// 입금하다.
	public void deposit(int money) {
		balance = balance + money;
		showInfo();
	} // end of deposit()
	
	// 출금하다.
	public int withdraw(int money) {
		// 방어적 코드를 작성한다.
		if(balance < money) {
			System.out.println("잘못된 요청입니다.");
			return 0; 
		}
		balance = balance - money;
		showInfo();
		return money;
	} // end of withdraw()
	
	// 현재 은행 잔액을 출력 하다.
	public void showInfo() {
		System.out.println("현재 잔액은 : " + this.balance + " 입니다.");
	} // end of showInfo()
	
	
	// 정보 은닉(private) 후에 getter, setter 메서드를 설계해 둘 수 있다.
	// get 메서드란 단순히 객체의 상태 변수를 리턴(return)하는 메서드 이다.
	
	// get 메서드를 사용 하려면 함수 이름에는 get+변수이름() 으로 시작한다.
	// get 메서드에서는 private로 정보은닉 되어있는 값을 사용할 수 있다.
	public int getBalance() {
		return this.balance;
	} // end of getBalance()
	
	public String getName() {
		return this.name;
	} // end of  getName()
	
	
	// 멤버 변수에 접근해서 객체의 상태 값을 변경하게 하는 메서드 입니다.
	// 상태 값만 변경하면 되기 때문에 (리턴 타입 없음)
	public void setName(String inputName) {
		this.name = inputName;
	}
	
	public void setBalance(int money) {
		// 방어적 코드 작성하기
		if(money < 0) {
			System.out.println("잘못된 입력입니다.");
			
		} else {
		this.balance = money;
		}
	}

} // end of class

 

package basic.ch10;

public class BankTest {
	// 코드의 시작점
	public static void main(String[] args) {
		
		Bank bank1 = new Bank(); // 인스턴스 생성
		
//		bank1.name = "우리은행";
		bank1.deposit(10_000);
		int getMoney = bank1.withdraw(5_000); // return 타입 값이 money 이다.
		System.out.println(">>>>>> 출금 >>>>>>>>"+getMoney);
		System.out.println("금액 : " +getMoney);
		
		// 신입 개발자가 실수로 멤버 변수에 접근해서 수정...
		// Bank에 돈을 넣어야 --> deposit() 기능으로 만들어져 있다.
//		bank1.balance = 100_000; <-- private 변경 후에 정보 은닉 되었다.
		// 10만 5천원이 있어야 정상
		// 의도 하지 않는 실수를 발생 시킬 수 있다.
		bank1.deposit(100_000);
		//bank1.showInfo();
		
		
		// 실행의 흐름을 만들 예정
		// 현재 은행에 전체 잔고가 200_000 이하라면 본점에 금액을 요청사항...
		System.out.println(bank1.getBalance());
		int money = bank1.getBalance();
		if(money <= 200_000) {
			System.out.println("본점에 금액을 요청해~");
		}
		
		// 은행 이름 바꾸기
		bank1.setName("그린은행");
		System.out.println(bank1.getName());
		// 은행 
		bank1.setBalance(-1000000);
		System.out.println(bank1.getBalance());
		
	} // end of main

} // end of class

 

Getter Setter 를 사용하는 이유?

 

Setter 메서드

외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경할 수 있도록 한다. 

멤버 변수에 접근해서 객체의 상태 값을 변경하게 하는 메서드 이다.

상태 값만 변경하면 되기 때문에 (리턴 타입 없음) --> void 사용

 

 

 

Getter 메서드

 설정한 변수 값을 읽어오는 데 사용한다.

get 메서드란 단순히 객체의 상태 변수를 리턴(return) 하는 메서드 이다.

get 메서드에서는 private로 정보은닉 되어있는 값을 사용한다.