본문 바로가기

Java

접근 제어 지시자 ( Access Modifier )

접근 제어 지시자 ( 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
728x90

'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