Loading...

JAVA / / 2022. 1. 18. 09:46

자바 20강. 접근 지정자

반응형

Public

: 변수 앞, 클래스 앞, 메서드 앞에 붙을 수 있고, 모든 패키지에서 접근이 가능하다.(전역적)

필요하면 가져다 쓸 수 있어!

b패키지에서 a패키지에 있는 메서드를 쓰고 싶을 때는, a에 public이 붙어있어야 한다.

 

import를 사용하면 마치 b패키지 안에 있는 것처럼 사용이 가능하다.

import a.A (패키지명.클래스명)

a패키지에 있는 모든 클래스를 가져올 때는 아스트리크(*) 모양을 사용한다.

import a.*

 

이때 import 할 때 패키지명은 풀 경로로 적어주어야 한다.

import ex11.p1.AccessEx01

 

클래스에 public은 특별한 경우가 아닌 이상 거의 무조건 붙여야 한다.

 

 

참조하여 사용하려는 메서드에도 public이 붙어있어야 한다.

 

같은 패키지 안에 있으면 import를 사용 안 해도 된다.

 

default

: 접근 지정자를 아무것도 적지 않으면 default

-> 같은 패키지에서는 찾을 수 있다.

다른 패키지에서는 찾을 수 없다.

굳이 잘 쓰는 방법은 아니다.

 

private(중요!)

: 같은 클래스 내부에서만 찾을 수 있다. 외부에서는 아무도 접근이 안된다.

외부에서는 아무도 접근이 안되는데 딱 한 가지 방법은 있다.

 

private와 같은 클래스 내부에 통로 메서드를 생성하는 것이다.

package ex11.p2;

public class AccessEx03 {

    // 아무것도 적지 않으면 default => 같은 패키지에서는 찾을 수 있다.
    void m3() {
        System.out.println("AccessEx03의 m3 메서드입니다.");
    }

    // 같은 클래스 내부에서만 찾을 수 있다.
    private void m4() {
        System.out.println("AccessEx03의 m4 메서드입니다.");
    }

    // private는 통로를 통해서만 호출할 수 있다.
    public void 통로() {
        m4();
    }
}

그 통로에서 private 메서드를 호출하는 메서드를 만들고,

외부에서 통로를 호출하면 private도 외부에서 접근이 가능하다.

 

private는 통로를 통해서만 호출할 수 있다.

 

 

protected : 상속했을 때 자식만 사용 가능한 것이다.(나중에 배움)

 

 


 

접근 생성자를 사용하는 법을 알아보자.

package ex11;

// 하나의 자바 파일에는 클래스를 하나만 만드는것이 좋음
// 하나의 자바 파일에는 두개의 public이 있을 수 없음 -> import때문!
// 클래스 내부의 클래스는 가능

class 엘리스 {
    // 상태는 접근할 수 없게 무조건 private
    private int 목마름; // 0 ~ 100

    // 생성자
    // 생성자도 내부구조는 메서드와 같기 때문에 오버로딩이 가능함
    엘리스(int 목마름) {
        this.목마름 = 목마름;
    }

    // private에 접근할 수 있는 통로, 행위에는 public
    public void 물마시기() {
        목마름 = 목마름 - 20;
    }

    // private에 접근할 수 있는 통로, 행위에는 public
    public int 갈증확인하기() {
        return 목마름;
    }
}

public class AccessEx05 {
    public static void main(String[] args) {
        // 자바는 기본자료형과 문자열을 더하면 결합이 되고 문자열 타입으로 변환된다.
        엘리스 e1 = new 엘리스(100);
        System.out.println("엘리스의 갈증지수 : " + e1.갈증확인하기());	// 100
        e1.물마시기();
        System.out.println("엘리스의 갈증지수 : " + e1.갈증확인하기());	// 80
    }
}

신입에게 엘리스의 목마름 정도를 40으로 바꾸라는 일을 시켰다.

객체지향을 잘 모르는 신입이라면

main에서 바로

e1.목마름 = 40;

이라고 상태를 변경해버릴 수도 있을 것이다.

 

이것은 상태의 값을 변경이 가능하게 만든 팀장의 잘못이다!!

 

상태의 값에 마음대로 접근하지 못하게 하기 위해

클래스의 상태에는 무조건 private를 붙여준다.

 

그러면 main에서 상태의 값을 직접 변경하려고 할 때 오류가 발생할 것이다.

 

private에 접근하기 위해서는 한 가지 방법이 있었다.

통로를 만들어줘야 한다.

 

이때 목마름 상태의 값을 확인하는 통로 하나(물마시기( )),

목마름 상태의 값을 변경하는 통로 하나(갈증확인하기( ))가 필요하다.

 

어디에서든 통로에 접근이 가능하도록 메서드에는 public이 붙어야 한다.

 

그러면 2번의 물마시기( ) 메서드를 통해 갈증 지수를 40으로 만들 수 있다.

 

package ex11;

// 하나의 자바 파일에는 클래스를 하나만 만드는것이 좋음
// 하나의 자바 파일에는 두개의 public이 있을 수 없음 -> import때문!
// 클래스 내부의 클래스는 가능
class 엘리스 {
    // 상태는 접근할 수 없게 무조건 private
    private int 목마름; // 0 ~ 100

    // 생성자
    // 생성자도 내부구조는 메서드와 같기 때문에 오버로딩이 가능함
    엘리스(int 목마름) {
        this.목마름 = 목마름;
    }

    // private에 접근할 수 있는 통로, 행위에는 public
    public void 물마시기() {
        목마름 = 목마름 - 20;
    }

    // private에 접근할 수 있는 통로, 행위에는 public
    public int 갈증확인하기() {
        return 목마름;
    }
}

public class AccessEx05 {
    public static void main(String[] args) {
        // 자바는 기본자료형과 문자열을 더하면 결합이 되고 문자열 타입으로 변환된다.
        엘리스 e1 = new 엘리스(100);
        System.out.println("엘리스의 갈증지수 : " + e1.갈증확인하기());	// 100
        e1.물마시기();
        System.out.println("엘리스의 갈증지수 : " + e1.갈증확인하기());	// 80

        e1.물마시기();	// 60
        e1.물마시기();	// 40
        System.out.println("엘리스의 갈증지수 : " + e1.갈증확인하기());
    }
}

 


 

이제부터 클래스 만들 때

상태는 무조건 private 하고 상태를 확인하는 get 메서드(public),

상태를 변경하는 set 메서드(public)를 만들어야 한다.

 

이 과정을 매직키로 자동완성이 가능하다.

 

클래스를 만들고

상태 변수를 private로 선언한 다음,

클래스 명 위에서 Alt + Enter키를 눌러주면

여러 가지 메뉴가 뜰 것이다.

Generate Getters and Setters를 클릭해주면

get 메서드와 set 메서드가 자동 완성된다.

상태 변수 speed 값을 확인하는 getSpeed,

변경하는 setSpeed 메서드가

자동 생성된 것을 확인할 수 있다.

 

package ex11;

// 클래스 이름에 alt + enter
class 달리기선수 {
    private int speed = 0;

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

public class AccessEx06 {
    public static void main(String[] args) {
        
    }
}

 

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형