수색…


소개

이 기사에서는 getter와 setter에 대해 설명합니다. Java 클래스에서 데이터에 대한 액세스를 제공하는 표준 방법.

게터와 세터 추가하기

캡슐화는 OOP의 기본 개념입니다. 그것은 데이터와 코드를 하나의 단위로 묶는 것에 관한 것입니다. 이 경우 변수를 private 로 선언 한 다음 GettersSetters 를 통해 변수에 액세스하여 변수를 보거나 수정하는 것이 좋습니다.

public class Sample {
  private String  name;
  private int age;

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

이 개인 변수는 클래스 외부에서 직접 액세스 할 수 없습니다. 따라서 무단 액세스로부터 보호됩니다. 그러나 이들을 보거나 수정하려면 Getters 및 Setters를 사용할 수 있습니다.

getXxx() 메소드는 변수의 현재 값을 반환합니다 xxx 당신이 변수의 값을 설정할 수있는 반면, xxx 사용 setXxx() .

방법의 명명 규칙 (예 변수라고되어 variableName )

  • 모든 boolean 변수

     getVariableName()   //Getter, The variable name should start with uppercase
     setVariableName(..) //Setter, The variable name should start with uppercase
    
  • boolean 변수들

      isVariableName()     //Getter, The variable name should start with uppercase
      setVariableName(...) //Setter, The variable name should start with uppercase
    

Public Getters와 Setters는 Java Bean의 속성 정의의 일부입니다.

setter 또는 getter를 사용하여 제약 조건 구현

Setters와 Getters는 객체가 제한을 가지고 액세스되고 변경 될 수있는 private 변수를 포함 할 수 있도록합니다. 예를 들어,

public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name!=null && name.length()>2)
           this.name = name;
    }
}

Person 클래스에는 name 단일 변수가 있습니다. 이 변수는 getName() 메서드를 사용하여 액세스 할 수 있으며 setName(String) 메서드를 사용하여 변경되지만 이름을 설정하려면 새 이름의 길이가 2자를 초과하고 null이 아니어야합니다. 변수 name public으로 설정하는 대신 setter 메서드를 사용하면 다른 사람들이 특정 제한 사항을 사용하여 name 값을 설정할 수 있습니다. getter 메소드에도 동일하게 적용 할 수 있습니다.

public String getName(){
   if(name.length()>16)
      return "Name is too large!";
   else
      return name;
}

상기의 수정 된 getName() 메소드에서는, 그 길이가 16 이하의 경우에만 name 이 돌려 주어집니다. 그 이외의 경우는, "Name is too large" 가 돌려 주어집니다. 이를 통해 프로그래머는 도달 할 수 있고 수정할 수있는 변수를 만들 수 있지만 클라이언트 클래스가 변수를 원하지 않게 편집하는 것을 방지 할 수 있습니다.

게터와 세터를 사용해야하는 이유는 무엇입니까?

Java에서 getter 및 setter가있는 객체를 포함하는 기본 클래스를 생각해보십시오.

public class CountHolder {
  private int count = 0;

  public int getCount() { return count; }
  public void setCount(int c) { count = c; }
}

개인 변수이기 때문에 count 변수에 액세스 할 수 없습니다. getCount()setCount(int) 메서드는 공개되어 있으므로 액세스 할 수 있습니다. 어떤 사람들에게는 이것은 질문을 제기 할 수 있습니다. 왜 중개인을 소개할까요? 왜 단순히 사람들을 공개하지 않는 것이 좋을까요?

public class CountHolder {
  public int count = 0;
}

모든 의도와 목적을 위해이 두 기능은 기능면에서 동일합니다. 이들의 차이점은 확장 성입니다. 각 반원이 말하는 것을 생각해 보라.

  • 첫째 , "나는 당신에게 int 값을 줄 수있는 메소드와, 그 값을 다른 int 설정하는 메소드"를 가지고있다.
  • 둘째 : "나는 네가 원하는대로 int 할 수있는 int 가있다."

이것들은 비슷하게 들릴지도 모르지만, 첫 번째 것은 실제로 자연에서 훨씬 더 잘 지켜진다. 그것은 당신 지시하는대로 그것 의 내부 성질과 만 상호 작용할 수 있습니다. 공을 코트에 남겨 둡니다. 내부 상호 작용이 발생하는 방식을 선택하게됩니다. 두 번째는 외부 적으로 내부 구현이 노출되어 외부 사용자가 쉽게 액세스 할 수있을뿐 아니라 API의 경우 해당 구현을 유지 관리하기 위해 최선다하고 있습니다 (또는 역방향 호환되지 않는 API를 릴리스하는 경우).

카운트 수정 및 액세스에 대한 액세스를 동기화하려는 경우 고려할 수 있습니다. 첫 번째 방법은 간단합니다.

public class CountHolder {
  private int count = 0;

  public synchronized int getCount() { return count; }
  public synchronized void setCount(int c) { count = c; }
}

하지만 두 번째 예제에서는 count 변수가 참조되는 각 위치를 살펴보고 수정하지 않으면 거의 불가능합니다. 더 나쁜 점은, 다른 사람이 사용하기 위해 도서관에서 제공하는 항목 인 경우 해당 수정 작업을 수행 할 방법이 없기 때문에 위에서 언급 한 어려운 선택을해야한다는 것입니다.

그래서 그것은 질문을 구걸합니다. 공공의 변수는 언제나 좋은 것입니까 (아니면, 적어도 악하지는 않습니까?)

나는 확신 할 수 없다. 한편으로는 시간의 테스트를 거친 공개 변수의 예를 볼 수 있습니다 (IE : System.out 에서 참조 된 out 변수). 반면에 공용 변수를 제공하면 최소한의 오버 헤드와 잠재적 인 어휘 감소를 피할 수 있습니다. 내 가이드 라인은 변수를 공개 할 계획이라면 극단적 인 편견으로 이러한 기준에 따라 판단해야한다는 것입니다.

  1. 변수는 지금까지 구현으로 변경하는 생각할 이유가 없습니다. 이것은 매우 쉽게 망쳐 버릴 수있는 것이고 (그리고 올바르게 만들었더라도 요구 사항이 바뀔 수 있습니다), getters / setter가 일반적인 접근 방법입니다. 공개 변수를 갖기 위해서는 특히 라이브러리 / 프레임 워크 / API에서 공개 된 경우이를 고려해야합니다.
  2. 변수는 빈번히 참조 되어야만하므로 자세한 정보를 줄임으로써 얻는 이득이이를 보장합니다. 필자는 메서드 참조를 사용하는 오버 헤드와 직접 참조를 고려해야한다고 생각하지 않습니다. 보수적으로 99.9 %로 추정되는 것에 대해서는 너무 무시할 수 있습니다.

아마도 내 머리 꼭대기에서 생각하지 않은 것 이상의 것이있을 것입니다. 확실하지 않다면 항상 getters / setter를 사용하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow