캡슐화(Encapsulation)
- 객체지향 프로그램 4대 특징 중 하나
- 데이터를 외부에서 함부로 변경하지 못하도록 외부의 접근을 제한하는 것을 말함
- 정보 은닉 : 클래스 멤버 접근 제어 기법
* private : 외부에서 직접 접근 차단
* Public : 모든클래스에서 접근 가능
- 직접적으로 접근하는 건 안되고, 반드시 setter() / getter() 메소드로 접근 가능
==> setter() : 지정자 메소드
==> getter() : 획득자 메소드
* 자동으로 getter와 setter 추가하는 방법
상단 메뉴바(or 소스파일에 오른쪽 클릭)
Source-Generate Getters and Setters...
* this : 객체(클래스) 자기 자신을 의미
- 주로 멤버변수와 메서드 또는 생성자의 매개변수 이름이 동일할 때 객체의 멤버임을 명확하게 하기 위하여 사용되는 키워드.
- 매개변수(지역변수)의 이름과 멤버변수(전역변수)의 이름이 동일할 때 멤버변수(전역변수) 앞에 this 라는 키워드를 붙여서 구분할 때 사용함.
https://jinnnkcoding.tistory.com/48
더 세부적으로 포스팅!
* 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 |
댓글