본문 바로가기

Java/본격 Java 클래스

[Java] 정보 은닉(private)

정보은닉
 - 클래스가 갖고 있는 정보(멤버 변수)를 외부에서 직접 접근 못하도록 숨기는 행위
 - 숨기는 방법은 멤버변수를 private으로 선언하면 됩니다.
  private으로 선언하면 같은 클래스 내부에서만 접근이 가능합니다.
 - 외부에서 인스턴스 등을 통해 멤버변수에 접근하려면 특정 메소드를 통한 간접 접근 방식을 사용해야합니다.
 - 멤버변수 값 변경은 setter 메소드를 통하고, 값의 참조는 getter를 통해 작업합니다.

.

.

해당 예제는 멤버변수에 임의로 접근해서 수정하는 경우이다.

/*
과일 판매자 : fruitSeller
 - 멤버변수 : 사과개수(numOfApple), 매출액(myMoney), 가격(APPLE_PRICE)
 - 메소드 : 판매(saleApple()), 현황보기(showSaleResult())

과일 구매자 : fruitBuyer
 - 멤버 변수 : 사과개수(numOfApple), 사과 살 돈(myMoney)
 - 메소드 : 구매(buyApple()), 현황보기(showBuyResult())

제어 : FruitSalesMain1
 - fruitSeller와 fruitBuyer 클래스의 인스턴스를 생성하여 사과구매를 실행시킴
 - 구매 후 판매자와 구매자의 현황을 확인
*/
class FruitSeller
{
	int numOfApple; 
	int myMoney; 
	final int APPLE_PRICE;
	
	public FruitSeller(int apple, int money, int price){
		// 생성자로 인스턴스 생성시 한 번만 실행되므로 상수에 대한 초기화를 진행할 수 있음
		numOfApple = apple;
		myMoney = money;
		APPLE_PRICE = price;
		// 상수에 값을 넣는 것은 일반 메소드에서는 불가능하며, 오직 생성자에서만 가능
	}

	public int saleApple(int money){
		int num = money / APPLE_PRICE;
		numOfApple -= num; 
		myMoney += money; 
		return num; 
	}

	public void showSaleResult(){
		System.out.println("남은 사과 : " + numOfApple);
		System.out.println("판매 수익 : " + myMoney);
	}
}

class FruitBuyer
{
	int numOfApple; 
	int myMoney;
	
	public FruitBuyer(int apple, int money){
		numOfApple = apple;
		myMoney= money;
	}

	public void buyApple(FruitSeller seller, int money){
		numOfApple += seller.saleApple(money);
		myMoney -= money;
	}

	public void showBuyResult(){
		System.out.println("사과 개수 : " + numOfApple);
		System.out.println("현재 잔액 : " + myMoney);
	}
}

class FruitSalesMain4
{
	public static void main(String[] args) 
	{
		FruitSeller seller = new FruitSeller(30, 0, 1500);
		FruitBuyer buyer = new FruitBuyer(0, 10000);

		seller.myMoney += 500;
		buyer.myMoney += 500;

		seller.numOfApple -= 20;
		buyer.numOfApple += 20;

		System.out.println("과일 판매자1 현황");
		seller.showSaleResult();

		System.out.println("과일 구매자 현황");
		buyer.showBuyResult();
	}
}

.

위와 같은 경우에는 외부에서 정보를 수정할 수 있다.

경우에 따라 허용해도 되지만, 평소에는 접근하지 못하게 정보은닉(private)를 해야한다.

.

.

정보은닉 예제

/*
과일 판매자 : fruitSeller
 - 멤버변수 : 사과개수(numOfApple), 매출액(myMoney), 가격(APPLE_PRICE)
 - 메소드 : 판매(saleApple()), 현황보기(showSaleResult())

과일 구매자 : fruitBuyer
 - 멤버 변수 : 사과개수(numOfApple), 사과 살 돈(myMoney)
 - 메소드 : 구매(buyApple()), 현황보기(showBuyResult())

제어 : FruitSalesMain1
 - fruitSeller와 fruitBuyer 클래스의 인스턴스를 생성하여 사과구매를 실행시킴
 - 구매 후 판매자와 구매자의 현황을 확인
*/
class FruitSeller
{
	private int numOfApple; 
	private int myMoney; 
	private final int APPLE_PRICE;
	
	public FruitSeller(int apple, int money, int price){
		// 생성자로 인스턴스 생성시 한 번만 실행되므로 상수에 대한 초기화를 진행할 수 있음
		numOfApple = apple;
		myMoney = money;
		APPLE_PRICE = price;
		// 상수에 값을 넣는 것은 일반 메소드에서는 불가능하며, 오직 생성자에서만 가능
	}

	public int saleApple(int money){
		int num = money / APPLE_PRICE;
		numOfApple -= num; 
		myMoney += money; 
		return num; 
	}

	public void showSaleResult(){
		System.out.println("남은 사과 : " + numOfApple);
		System.out.println("판매 수익 : " + myMoney);
	}
}

class FruitBuyer
{
	private int numOfApple; 
	private int myMoney;
	
	public FruitBuyer(int apple, int money){
		numOfApple = apple;
		myMoney= money;
	}

	public void buyApple(FruitSeller seller, int money){
		numOfApple += seller.saleApple(money);
		myMoney -= money;
	}

	public void showBuyResult(){
		System.out.println("사과 개수 : " + numOfApple);
		System.out.println("현재 잔액 : " + myMoney);
	}
}

class FruitSalesMain5
{
	public static void main(String[] args) 
	{
		FruitSeller seller = new FruitSeller(30, 0, 1500);
		FruitBuyer buyer = new FruitBuyer(0, 10000);

		buyer.BuyApple(seller, 4500);

		System.out.println("과일 판매자1 현황");
		seller.showSaleResult();

		System.out.println("과일 구매자 현황");
		buyer.showBuyResult();
	}
}
728x90
반응형

'Java > 본격 Java 클래스' 카테고리의 다른 글

[Java] 클래스 메소드  (0) 2020.06.25
[Java] 클래스 변수  (0) 2020.06.25
[Java] 실습 - 삼각형 넓이 구하기  (0) 2020.06.25
[Java] 실습 - 사과판매3(생성자 이용)  (0) 2020.06.25
[Java] 생성자(Constructor)  (0) 2020.06.25