JAVA

접근 제한자와 게터(Getter) 세터(Setter)

🤖 Play with Android 🤖 2021. 7. 19. 18:29
728x90


접근 제한자란?

접근 제한자란, 접근 권한을 제한하는 키워드다.

 

왜 사용하는가?

멤버들은 객체 자신들만의 속성이자 특징이므로 대외적으로 공개되는 것이 결코 좋은 것은 아니다.

그런 이유로 개발자가 객체의 멤버들에게 접근 제한을 걸 수가 있는데 자바에서는 이를 접근 제한자라 칭한다.

 

접근 제한자의 종류

접근 제한자의 종류는 총 4가지로, 외부 접근을 거부하는 private(비공개)에서부터 모든 접근을 허용하는 public(완전 공개)까지 존재한다.

 

 



public 과 private

  • public 키워드는 완전한 공개를 의미한다. 모두가 사용할 수 있는 공공의 산물이 되는 것이다.
  • 이와 반면 private은 비공개를 의미한다. 오직 해당 클래스 내부에서만 사용할 수 있게 된다.

 

 

 

적용 및 장점

접근 제한자는 필드와 메소드에 적용될 수 있다. public 선언되면 외부의 접근이 가능하나, private의 경우 외부 접근이 불가능하다.

 

이를 통해 외부의 악의적 접근을 예방할 수 있다.

또한 객체 외부에서 직접적으로 접근하는 것을 방지함으로써 객체의 무결성을 지켜준다

 

 

 


 

 

게터와 세터

private 선언된 필드는 외부 접근이 불가능하다. 객체의 무결성을 지켜주기 위해 자바에서는 메소드를 통해 데이터를 반환 혹은 변경하는 방법을 선호한다. 심지어 정상적인 사용자도 직접 접근할 수 없다.

이를 해결하기 위해 게터와 세터가 필요하다. 데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다.

 

getter와 setter를 통해 우회해서 private에 접근 가능

 

게터와 세터를 사용하면, private 필드를 우회하여 가져오거나 변경할 수 있다.

 

 

 

 

세터를 이용한 접근 예시

public class PersonTest {
    public static void main(String[] args) {
        // 객체 생성
        Person park = new Person("홍길동", "010-1234-5678");

        /* 1. 게터를 호출하여 필드값을 얻음. */
        System.out.printf("이 름: %s\n", park.getName());
        System.out.printf("연락처: %s\n", park.getPhoneNumber());
    }
}

class Person {
    // 필드
    private String name;
    private String phoneNumber;

    // 생성자
    public Person(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }
	
    // 게터로 우회해서 접근
    public String getName() {
        return name;
    }
	
    // 게터로 우회해서 접근
    public String getPhoneNumber() {
        return phoneNumber;
    }
}

 

위 코드를 보면 private으로 외부 클래스에서 접근이 제한된 name과 phoneNumber이라는 필드에 접근하기 위해 세터를 통해 우회해서

접근하는 것을 볼 수 있다.

 

 


 

 

게터를 통한 필드값 수정 예시

public class LockTest {
    public static void main(String[] args) {
        // 객체 생성
        Lock lock = new Lock("123!@#");

        /* 1. 세터를 호출하여, 비밀번호를 변경. */
        lock.setPassword("654#@!");

        // 객체 정보 출력
        System.out.println(lock.toString());
    }
}

class Lock {
    // 필드
    private String password;

    // 생성자
    public Lock(String password) {
        this.password = password;
    }

    // 메소드
    public String toString() {
        return String.format("Lock { password: %s }", password);
    }

    /* 2. 비밀번호 변경을 위한, 세터 메소드를 추가. */

    public void setPassword(String password) {
        this.password = password;
    }
}

 

위 코드를 보면 password는 외부 클래스에서 접근이 불가한 private한 필드인데 이를 메인메소드가 있는 클래스에서 변경하기 위해

세터를 사용한 것을 알 수 있다.