본문 바로가기
Back-End/Java

[Java] 캡슐화(Encapsulation)_getter와 setter

by 찐코딩 2021. 8. 26.

 

캡슐화(Encapsulation)

  - 객체지향 프로그램 4대 특징 중 하나
  -  데이터를 외부에서 함부로 변경하지 못하도록 외부의 접근을 제한하는 것을 말함
  - 정보 은닉 : 클래스 멤버 접근 제어 기법

   * private : 외부에서 직접 접근 차단
   * Public : 모든클래스에서 접근 가능

   - 직접적으로 접근하는 건 안되고, 반드시 setter() / getter() 메소드로 접근 가능
     ==> setter() : 지정자 메소드
     ==> getter() : 획득자 메소드

 

 
* 자동으로 getter와 setter 추가하는 방법

상단 메뉴바(or 소스파일에 오른쪽 클릭)
 Source-Generate Getters and Setters...


* this : 객체(클래스) 자기 자신을 의미

 - 주로 멤버변수와 메서드 또는 생성자의 매개변수 이름이 동일할 때 객체의 멤버임을 명확하게 하기 위하여 사용되는 키워드.
 - 매개변수(지역변수)의 이름과 멤버변수(전역변수)의 이름이 동일할 때  멤버변수(전역변수) 앞에 this 라는 키워드를 붙여서 구분할 때 사용함.

https://jinnnkcoding.tistory.com/48

 

[Java] 스코프와 this

https://jinnnkcoding.tistory.com/32 [Java] 접근지정자(접근제어자) 권한 접근지정자(접근제어자)권한 - 접근지정자는 클래스, 멤버변수, 멤버메서드 앞에 사용됨. - 외부로부터 접근을 제어한다는 의미를

jinnnkcoding.tistory.com

더 세부적으로 포스팅!


* setter() 메서드로 초기값을 설정
 - private 멤버 변수에 값을 지정(초기값 설정)하는 역할
 형식)

 public void set 멤버변수명(자료형 매개변수) {
	 멤버변수 = 매개변수;
 }

* getter() 메서드로 멤버변수에 할당된 값을 가져오기
 - private 메버변수에 할당된 값을 가져오는 역할
 형식) 

public 반환형 get멤버변수명() {
	 return 멤버변수명;
 }

 

예문 01) 돼지저금통에서 입금, 출금을 해보자

package Class;

class PigSave {
	
	// 멤버 변수
	private int balance;  //돼지 저금통 잔액
	
	// 멤버메소드
	public PigSave(int b) {
		balance=b;
	}
	
	//입금을 하는 메소드
	public void deposit(int money) {
		System.out.println("돼지 저금통에 입금을 합니다.....");
		balance+=money;
		
		System.out.printf("현재 잔액 : %,d원\n", balance);
	}
	
	//출금을 하는 메소드
	public void withdraw(int money) {
		System.out.println("돼지 저금통에 출금을 합니다.....");
		if(balance>money) {
			balance-=money;
			System.out.printf("현재 잔액 : %,d원\n", balance);
		}else {
			System.out.println("잔액이 부족합니다.");
			return; //현재 실행되고 있는 메소드를 종료시키는 명령어
		}
		
	}
}


public class Ex11_pigsave {

	public static void main(String[] args) {
		
		// 돼지 저금통 객체 생성
		// PigSave save=new PigSave();
		PigSave save=new PigSave(0);

		save.deposit(3000); //입금메소드 호출
		save.deposit(5000); //입금메소드 호출
		save.withdraw(2000); //출금메소드 호출
		save.withdraw(10000);  // 출금 메서드 호출
		
		// save.balance=10000; //이렇게 접근을 하면 안 됨
		// 객체지향 4대 특징 중 하나인 캡슐화
		
	}

}

결과

돼지 저금통에 입금을 합니다.....
현재 잔액 : 3,000원
돼지 저금통에 입금을 합니다.....
현재 잔액 : 8,000원
돼지 저금통에 출금을 합니다.....
현재 잔액 : 6,000원
돼지 저금통에 출금을 합니다.....
잔액이 부족합니다.

 

만일 메인 메소드에서

public class Ex11_pigsave {

	public static void main(String[] args) {
		
		// 돼지 저금통 객체 생성
		// PigSave save=new PigSave();
		PigSave save=new PigSave(0);

		save.balance=10000; 
	}

}

이렇게 private 변수인 balance 변수에 직접적으로 접근하면 아래와 같은 오류가 발생한다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The field PigSave.balance is not visible

	at Class.Ex11_pigsave.main(Ex11_pigsave.java:49)

 

 

예문 02)  

package Class;

class Number {
	
	// private 필드
	private int num1; 
	private int num2;

	// 멤버 메소드 생성
	// private 변수이므로 getter와 setter 메소드를 생성해야 한다.
	
	// setter : private 필드를 우회적으로 변경함
	public void setNum1(int n1) {
		num1 = n1;
	}
	
	public void setNum2(int n2) {
		num2 = n2;
	}

	// getter 메소드 : 값을 우회하여 반환
	// public (자료형) (get+멤버변수명(앞문자 대문자))
	public int getNum1() {
		return num1;
	}
	
	public int getNum2() {
		return num2;
	}
}

public class Ex12_Number {

	public static void main(String[] args) {
		Number number = new Number();
		
		//number.num1; //private라서 외부에서 접근 불가
		
		number.setNum1(500);
		number.setNum2(300);
		
		System.out.println("num1 >>> " + number.getNum1());
		System.out.println("num2 >>> " + number.getNum2());
	}

}

결과

num1 >>> 500
num2 >>> 300

'Back-End > Java' 카테고리의 다른 글

[Java] Object 클래스  (0) 2021.09.16
[Java] 스코프와 this  (0) 2021.08.27
(스크랩) [Java] Public class 와 class의 차이  (0) 2021.08.25
[Java] 객체 배열  (0) 2021.08.23
[Java] 생성자(Constructor)  (0) 2021.08.23

댓글