- 클래스 외부에서 클래스의 멤버 변수, 메서드 생성자응 사용할 수 있는지 여부를 지정하는 키워드이다,
- 객체 상태값 변경은 행위로서 처리해야한다.
package com.access;
// Bank 클래스를 설계하는 측 코드(우리가 설계)
// 계좌
public class Bank {
// ** 접근 제어 지시자 (public default private) **
// public
// name 변수는 누구나 어디에서든 접근해서 사용 가능
public String name;
// default
// 같은 패키지 내에서만 접근할 수 있다
int balance;
// private
// 같은 클래스 안에서만 접근할 수 있다(Bank 에서만 접근 가능)
private String number;
public void showInfo() {
System.out.println("현재 계좌 번호는 : " + number + " 입니다");
}
}
package com.access;
public class Account {
private String name;
//int balance; 1단계
private int balance; // 2단계
// getter, setter 메서드 만들기
// 외부에서 balance 값을 리턴 받을 수 있는 메서드를 만들어 보자.
// 변수 앞에 get 단어를 붙인다.( 매개변수를 선언할 필요가 없다)
public int getBalance() {
return balance;
}
public String getName() {
return name;
}
// setter 메서드 만들기
public void setBalance(int b) {
// 식, 방어적 코드 작성
if (b < 0) {
System.out.println("0 이하 값을 넣을 수 없습니다.");
} else {
balance = b;
}
}
public void setName(String n) {
name = n;
}
// 입금하다
public void deposit(int money) {
balance += money;
}
// 출금하다
public void withdraw(int money) {
// TODO 방어적 코드를 작성해야한다
balance -= money;
}
// 현재 잔액 출력 메소드
public void showInfo() {
System.out.println("현재 계좌 잔액은 :" + balance + " 입니다");
}
}
package com.access;
public class AccountTest {
public static void main(String[] args) {
Account account = new Account();
account.deposit(10_000);
account.withdraw(6_000);
account.showInfo();
// 접근 제어지시자 문법, 왜 사용하는가?
// 신입 개발자가 실수로 메서드를 통해서 코드를 작성한게 아니라
// 바로 멤버 변수에 접근해서 수정하는 코드를 작성해버렸다
// account.balance = 10_000; // 입금 명령어 작성했다 본인 생각!
account.showInfo();
// 실수할 수 있는 가능성이 있다 !!
// balance 변수를 외부에서 안보이게 접근 차단해보자
// private 를 선언해서 외부에서 접근 차단
// 외부에서는 오직 출금 가능, 입금 가능 메서드로만 사용이 가능해진다
// >>>> 현재 잔액 <<< <--- 출력하고 싶어.
//int n1 = account.balance;
int outerBalancer = account.getBalance();
System.out.println(">>>현재 잔액 : " + outerBalancer + " <<<<");
// 자바에서 멤버 변수 값을 초기화 하지 않으면 string null 로 초기화 된다
System.out.println(account.getName());
// setter 메서드
account.setBalance(0);
account.showInfo();
}
}
package com.dot;
public class A {
B b;
// 생성자(인스턴스화 될 때 제일 먼저 수행하는 코드이다)
public A() {
System.out.println("A 생성자 호출");
b = new B();
}
}
package com.dot;
public class B {
C c;
// 생성자
public B() {
// 무언가 코드 작성
System.out.println("B 생성자 호출");
c = new C();
}
}
package com.dot;
public class C {
// 기본 생성자 호출 됨 --> heap 메모리에 C 객체가 올라 갔다.
public void callFinal(){
System.out.println("callFinal() 메소드가 호출 되었다.");
}
}
package com.dot;
public class MainTest {
public static void main(String[] args) {
System.out.println(" . 연산자의 여행~!! ");
A a1 = new A();
// a1.b.c // C 객체가 생성 안된 상태라서 null 에러 일어남
a1.b.c.callFinal();
}
}