백엔드/JAVA_이론공부

JAVA_접근제어자 , getter, setter

반 불혹 2022. 9. 18. 21:02

접근 제어자 

접근 제어자는 캡슐화를 구현하기 위한 핵심적인 방법이다. 

접근제어자는 4개가 존재한다.

 

4개의 접근 제어자 (출처 : 코드스테이츠)

 

변수, 메서드에 접근제어자를 붙여 다른 생성자, 클래스 등에서 해당 변수, 메서드에 접근하는것을 제어 할 수 있다.
->불필요한 데이터 노출 방지, 데이터 임의변경 방지

위의 접근제어자의 사용 봄위는 아래와 같다.

 

접근제어자의 사용범위 (출처 : 코드스테이츠)

 

 

코드예시 

package package1; // 패키지명 package1 

//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
        System.out.println(p.b);
        System.out.println(p.c);
        System.out.println(p.d);
    }
}

public class Parent { // Parent 클래스의 접근 제어자는 public
    private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
    int b = 2;
    protected int c = 3;
    public int d = 4;

    public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

// 출력값
2
3
4

위의 Parent 클래스에서 각각  private, default, protected, public 접근제어자가 지정 되어 있다. (접근제어가자 안붙은 경우 그냥 default로 설정된다. )

동일 클래스에서는 해당 클래스 내의 제어자 모두 사용 가능하다. 

하지만 위에서 private에 대항되는 변수 a를 가져오려고 할 때 접근제어자의 존재로 동일 클래스가 아닌 p에서 해당 변수를 가져오지 못한다.

 

getter , setter 메서드 

아무리 접근제어자로 막아놔도 종종 그 변수를 사용해야 할 때가 있다 

그때 사용하는 것이 getter , setter 메서드 이다.

setter 메서드는 외부에서 접근하여 조건에 맞을 경우 데이터값을 변경 가능하게 하는 메서드 이다. 

작성예시 : set + 메서드명

getter 메서드는 설정된 변수 값을 읽어오는데 사용된다. 

작성예시 : get + 메서드명

코드 예시

public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("김코딩");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("근로자의 이름은 " + name);
        int age = w.getAge();
        System.out.println("근로자의 나이는 " + age);
        int id = w.getId();
        System.out.println("근로자의 ID는 " + id);
    }
}

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값 
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

// 출력값
근로자의 이름은 김코딩
근로자의 나이는 30
근로자의 ID는 5

위의 코드를 보면 Worker 클래스에서 선언된 변수들이 private로 접근제어자가 설정되어 있어 클래스 내부에서만 사용 가능한 상태이다. 

하지만 아래에 후속된 메서드들에 set, get의 키워드를 붙이는 것으로 해당 변수들을 사용 가능하다. 

set + 메서드명 으로 선언된 메서드는 이름, 나이, id 값을 설정하게 하고

get + 메서드명 은 설정된 값들을 출력하는 메서드 들이다.

가장 위를 보면 w로 생성된 객체는 Worker 외부에 있는 것이지만 getter , setter 메서드를 통해 Worker 의 변수들을 사용해서 w.getName(); , w.getAge();, w.getId(); 를 실행 가능하게 해주기 때문에 출력 또한 Worker 변수를 참조한 출력이 가능하다.

출처: https://half-forty.tistory.com/26 [팔랑귀 블로그:티스토리]