JAVA 객체 지향 핵심

(JAVA) 접근 제어 지시자(access modifier) -

mynote6676 2025. 4. 16. 14:00

 

 

public: 어디서나 접근 가능.

 

• default: 같은 패키지 내에서만 접근 가능.

 

• private: 해당 클래스 내부에서만 접근 가능.

 

• protected ← 상속을 배운 후 이해 하기

 

 

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;
    }

}

 

package com.dot;

public class A {

    B b;
    // 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();
        //A a1 = new A();

        // a1.b.c // C 객체가 생성안됨
       a1.b.c.callFinal();
       //a1.b.c.callFinal();




    }
}