글 작성자: 취업중인 피터팬
728x90
기본 환경
JDK : 1.8.0_261 버전
JRE : 1.8.0_261 버전
JAVA VERSION : 8 업데이트 261
Eclipse IDE VERSION : 2020-06버전

 

목표

접근제어을 상속에서 어떻게 사용하는지 이해한다.


 

 

코드
package ex12inheritance;

class Account{
	/*
	 맴버변수가 상관관계에 있다 하더라고 private으로 선언되면
	 클래스 내부에서만 접근이 가능하다. 즉 상속받은 하위클래스에서는 
	 직접 접근이 불간능하다.
	 */
	private int money;
	public Account(int init) {
		money = init;
	}
	
	/*
	 입금처리 : protected로 선언되었으므로 상속관계에서 접근 가능
	 */
	protected void depositMoney(int _money) {
		if(_money < 0) {
			System.out.println("마이너스 금액은 입금처리 불가합니다.");
			return;
		}
		money += _money;
	}
	/*
	 private 맴버를 외부 클래스로 반환할 떄 사용한다.
	 */
	protected int getAccMoney() {
		return money;
	}
	
}

class SavingAccount extends Account{
	/*
	 인자생성자에서 부모의 생성자 메소드를 호출하기 위해 super()를
	 사용한다. 이때 인자가 하나인 생성자를 호출하게 된다.
	 */
	public SavingAccount(int initVal) {
		super(initVal);
	}
	public void saveMoney(int money) {
		depositMoney(money);
	}
	/*
	 부모클래스에 protected로 선언된 맴버메소드를 각각 호출한다.
	 private맴버변수인money 는 직접 겁든할 수 없으므로 접근 가능한
	 메소드를 통해 간접적으로 접근한다.
	 */
	public void showAccountMoney() {
		System.out.println("지금까지의 누적금액 : " + getAccMoney() );
		//System.out.println("지금까지 누적금액 :" + money);
		
	}
	
}

public class E02PrivateInheritanceMain {

	public static void main(String[] args) {
		/*
		 private 맴버이므로 상속받은 하위클래스이 참조변수를 통해서는
		 접근이 불가능하다. 부모의 맴버메소드를 통해 간접적으로 접근한다.
		 */
			SavingAccount sa =  new SavingAccount(10000);
			
			//sa.money = 100000; [접근불가]
			
			sa.saveMoney(5000);
			sa.showAccountMoney();
			
			sa.saveMoney(-1000);//입금불가 처리
			sa.showAccountMoney();
			
			/*
			부모객체의 참조변수를 통해서도 private맴버는 접근이 불가능하다.
			현재 접근하고 있는 위치가 다른 클래스이기 떄문이다.
			 */
			Account account = new Account(1000);
			//account.Money = 1000; [접근불가]
	}
}

 

private으로 선언하면 상속받은 클래스라도 접근하지 못합니다. default는 가능하며 다른 클래스에서 자식의 객체를 선언하여도 그 객체를 통해 부모의 private을 접근할 수 없습니다.

 

 

결과 값