ProgramingTip

게터와 세터의 요점은 무엇입니까?

bestdevel 2020. 10. 24. 11:22
반응형

게터와 세터의 요점은 무엇입니까?


가능한 가능성 :
왜 게터와 세터를 사용합니까?

나는에 대한 책을 읽었다 . 그리고와 Java같은 변수에 대한 setter와 getter를 만드는 것이 좋다고 말했다 . 예를 들면 :xy

public int getX(){
    return x;
}

public void setX(int x){
    this.x = x;
}

그러나 그것과의 차이점은 무엇이며

...(shape.x)...   // basically getX()

shape.x = 90;    // basically setX()

세터와 게터가 더 낫다면 어떤 실제적인 문제가 발생하는지 설명해 주시겠습니까?


여러 가지 이유 :

  • 다음과 같은 필드 액세스를 허용하면

    shape.x = 90

나중에 나중에 데이터의 유효성을 검사하는 논리를 추가 할 수 없습니다.

x가 100보다 작을 수없는 것이 없습니다.

public void setShapeValue(int shapeValue){
  if(shapeValue < 100){
    //do something here like throw exception.
  }
}
  • 쓰기 논리 복사와 같은 것을 추가 할 수 없습니다 ( CopyOnWriteArrayList 참조 ).
  • 또 다른 이유는 클래스 외부의 필드에 액세스하는 경우 해당 필드를 public, protected 또는 default로 표시해야하는 제어권을 잃게됩니다. 데이터가 클래스 분리 캡슐화 및 일반적인 OOPS 방법론에 매우 내부적 일 때 .

같은 상수를 위해

public final String SOMETHING = "SOMETHING";

많은 수 있기 때문에 필드 액세스를 허용합니다. 예를 들어 변수는 getter, setter로 배치합니다.

  • 또 다른 시나리오는 클래스를 표현하면 값이 변경 될 수 있으므로 클래스를 불변성을 깨는 것입니다. 그러나 getter를 사용하고 setter가없는 클래스를 신중하게 디자인하면 불변성을 그대로 유지합니다.

getter 메소드에서주의하지만 (클래스에 객체가 인스턴스로있는 경우)를 제공해야합니다.

getter와 setter를 사용하여 모든 패키지에서 전용 변수를 사용할 수 있습니다.


getter setter 함수를 사용하면 제약과 조건과 캡슐화가 가능합니다. x가 반경이라고합시다. shape.x = -10은 의미가 없습니다. 또한 아무 것도 없거나 잘못된 것이 있습니다.

멤버 변수를 개인용으로 설정하여 프로그램을 사용하는 프로그램에서 직접 준비하는 것이 좋습니다.

돌연변이 함수
캡슐화


많은 사람들이 구현의 세부 사항을 캡슐화하는 것에 대해 언급했고, 저에게 클래스에서 getter와 setter를 사용하는 가장 큰 이유입니다. 이를 통해 클래스를 사용하는 모든 코드를 건드릴 필요없이 즉시 구현을 버리고 대체 할 수있는 기능을 포함하여 많은 이점을 얻을 수 있습니다. 작은 프로젝트에서는 큰 이점이있는 코드가 잘 사용되는 (내부 또는 공용) 라이브러리로 이점이 될 수 있습니다 .

한 가지 구체적인 예 : 수학의 복소수 . 일부 언어는 기능을 언어 또는 프레임에 사용할 수 있습니다. 여기서는 변경 가능한 클래스를 사용하지만 사용하는 경우에는 사용하지 않습니다.

복소수는 양식에 기록 할 수있다 a + bi, 현실과 상상의 부품에 잘 자체를 빌려 [gs]etRealPart[gs]etImaginaryPart.

그러나 어떤 경우에는 (r) 및 (θ)를 re^(iθ)제공 하여 극좌표 형식의 복소수를 추론하는 것이 더 부담 합니다.[gs]etRadius[gs]etAngle

당신은 또한 같은 방법 노출 수 [gs]etComplexNumber(realPart, imaginaryPart)[gs]etComplexNumber(radius, angle). 인수 유형에 따라 다른 이름이 필요할 수도 있고 필요하지 않을 수도 있습니다. 하나를 사용할 수 있습니다.

두 형식은 서로 바꿔 사용할 수 있습니다. 하나에서 다른 쉽게 변환 할 수 있으므로 클래스가 내부 저장소에 사용하는 형식은 해당 클래스의 소비자와 관련이 없습니다. 그러나 소비자는 두 가지 형식을 모두 사용할 수 있습니다. 내부 표현을 위해 a + bi 형식을 선택하고 getter 및 setter 대신 필드를 사용하여 이를 노출 하면 클래스 소비자가 해당 형식을 사용하도록 할뿐 아니라 나중에 쉽게 마음을 바꾸고 내부 표현을 다음으로 대체 할 수 있습니다. re ^ (iθ)는 특정 시나리오에서 구현하기가 더 쉬운 것이 판명입니다. 특정 필드 이름을 사용하여 실제 및 가상 부분을 노출하도록 요구하는 정의한 공개 API를 사용하고 있습니다.


사용자 getter 및 setter에 대한 또 다른 좋은 이유는 다음 예제에서 사용합니다.

public class TestGetterSetter{
    private String name ;


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


    public String getName(String name){
        return this.name ;
    }
}

게터와 세터의 요점은 그들이 가져 오거나 설정하는 개인 변수에 액세스하는 데 사용하는 것입니다. 이런 식으로 캡슐화를 제공하고 나중에 코드를 리팩토링하거나 수정하는 것이 부담 스럽습니다.

getter 대신에 사용하는 상상해. 그런 다음 설치와 같은 추가 비용 (예 : 이전에 설정되지 않은 경우 기본 이름이 'Guest'라고 말함) getter 및 sayName 함수를 수정해야합니다.

public class TestGetterSetter{
    private String name ;


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


    public String getName(String name){
        if (this.name == null ){
            setName("Guest");
        }
        return this.name ;
    }
}

get 및 set로 시작하는 getter 및 setter에 대한 요구 사항은 없습니다. 이것은 일반 멤버 함수 일뿐입니다. 그러나 그렇게하는 것은 관습입니다. (Java Bean을 사용하는 경우)


게터와 세터에 대해 생각할 수있는 가장 좋은 이유 중 하나는 클래스 API의 영구성입니다. 파이썬과 같은 언어에서는 이름으로 멤버에 액세스하고 나중에 메서드로 전환 할 수 있습니다. 속성에 액세스하면 함수가 Java의 멤버와 다르게 동작하기 때문입니다. 나중에 범위를 제한하면 클라이언트가 중단됩니다.

게터와 세터를 제공함으로써 프로그래머는 공개 API에서 설명하는 계약을 준수하는 한 자유롭게 구성원과 동작을 수정할 수있는 유연성을 갖게됩니다.


가정적으로 자신의 수업 (YourClass)에서 수행 한 작업을 더 잘 수행하는 라이브러리를 찾았다 고 가정 해 보겠습니다. 이 시점에서 자연스럽게 할 일은 YourClass를 해당 라이브러리에 대한 래퍼 인터페이스로 만드는 것입니다. 클라이언트 코드가 가져 오거나 설정해야하는 "X"개념이 여전히 있습니다. 당연히이 시점에서 접근 자 함수를 작성해야합니다.

접근 자 함수를 사용하지 않고 클라이언트 코드가 YourClass.x에 직접 액세스하도록 허용했다면 이제 YourClass.x를 건드린 모든 클라이언트 코드를 다시 작성해야합니다. 그러나 처음부터 YourClass.getX () 및 YourClass.setX ()를 사용했다면 YourClass 만 다시 작성하면됩니다.

프로그래밍, 특히 객체 지향 프로그래밍의 핵심 개념 중 하나는 구현 세부 사항을 숨기고 다른 클래스 나 모듈의 코드에서 직접 사용하지 않도록하는 것입니다. 이렇게하면 위의 예에서와 같이 구현 세부 정보를 변경 한 경우 클라이언트 코드가 차이를 인식하지 못하며 수정할 필요가 없습니다. 모든 클라이언트 코드가 알고있는 경우 "x"는 변수이거나 즉석에서 계산되는 값일 수 있습니다.

이것은 지나치게 단순화 된 것이며 구현을 숨기는 것이 유익한 모든 시나리오를 다루지는 않지만 가장 명백한 예입니다. 구현 세부 사항을 숨기는 개념은 현재 OOP와 매우 밀접한 관련이 있지만 OOP가 꿈꾸기 수십 년 전으로 거슬러 올라가는 토론을 찾을 수 있습니다. 그것은 소프트웨어 개발의 핵심 개념 중 하나로 돌아가서 큰 모호한 문제를 쉽게 해결할 수있는 작고 잘 정의 된 문제로 나누는 것입니다. 접근 자 함수는 작은 하위 작업을 분리하고 잘 정의하는 데 도움이됩니다. 클래스가 서로의 내부에 대해 덜 알수록 좋습니다.


원래 getter / setter 패턴은 encapsulatinga의 내부 class에서 외부에서 좋은 객체 지향 디자인을 촉진하기 위해 만들어졌습니다 interface.

  • 속성의 내부 표현 숨기기

이것이 귀하의 질문에 대한 가장 좋은 대답입니다. 왜 게터와 세터를 사용합니까?


많은 이유가 있습니다. 다음은 몇 가지입니다.

  1. 접근 자, 특히 게터는 종종 인터페이스에 나타납니다. 인터페이스에서 멤버 변수를 규정 할 수 없습니다.
  2. 이 멤버 변수를 노출하면 구현 방법에 대한 마음을 바꿀 수 없습니다. 예를 들어, 나중에 집계와 같은 패턴으로 전환해야하는 경우 "x"속성이 실제로 일부 중첩 된 개체에서 가져 오도록하려면 결국 해당 값을 복사하고 동기화 상태를 유지해야합니다. 안좋다.
  3. 대부분의 경우 세터를 노출 하지 않는 것이 훨씬 좋습니다 . x와 같은 공개 필드에서는이를 수행 할 수 없습니다.

대답을하기 전에 먼저 알아야 할 것이 있습니다 ...! " JavaBeans ".
JavaBeans는 속성이있는 Java 클래스입니다 . 우리의 목적을 위해 속성을 개인 인스턴스 변수로 생각하십시오. 비공개이기 때문에 클래스 외부에서 액세스 할 수있는 유일한 방법은 클래스의 '메서드'를 통해서입니다.
속성 값을 변경하는 메서드를 setter 메서드 라고 하고 속성 값을 검색하는 메서드를 getter 메서드 라고 합니다 .


게터 / 세터 나 공개 멤버 모두 좋은 객체 지향 디자인이 아니라고 말하고 싶습니다. 둘 다 처음에 객체의 속성에 액세스해서는 안되는 객체 데이터를 세계에 노출시켜 OOP 캡슐화를 중단합니다.


이것은 OOP 캡슐화 원칙을 적용하여 수행됩니다 .

개체의 일부 구성 요소에 대한 액세스를 제한하는 언어 메커니즘입니다.

즉, 클래스의 속성 및 메서드에 대한 가시성을 정의해야합니다. 다음과 같은 3 가지 일반적인 가시성이 있습니다.

  • 비공개 : 클래스 만 속성 / 메소드를보고 사용할 수 있습니다.
  • 보호됨 : 클래스와 그 하위 만 속성 / 메소드를보고 사용할 수 있습니다.
  • 공개 : 모든 클래스는 속성 / 메소드를보고 사용할 수 있습니다.

private / protected 속성을 선언 할 때 값을 가져오고 (get) 값을 변경 (set)하는 메서드를 만드는 것이 좋습니다. 가시성에 대한 한 가지 예는 [ArrayList][2]클래스 size입니다. 내부 배열의 실제 크기를 알 수 있는 속성이 있습니다. 클래스 만 값을 변경 해야 하므로 코드는 다음과 같습니다.

public class ArrayList<E> {
    private int size;
    private Object[] array;
    public getSize() {
        return this.size;
    }
    public void add(E element) {
        //logic to add the element in the array...
        this.size++;
    }
}

이 예제에서 크기 값은 클래스 메서드 내에서만 변경 될 수 있으며 코드에서 호출하여 실제 크기를 가져올 수 있습니다 (변경하지 않음).

public void someMethod() {
    List<String> ls = new ArrayList<String>();
    //adding values
    ls.add("Hello");
    ls.add("World");
    for(int i = 0; i < ls.size(); i++) {
        System.out.println(ls.get(i));
    }
}

Getter 및 Setter는 공용 메서드를 통해서만 액세스 할 수 있도록하고 값 자체를 비공개로 유지하여 클래스의 필드를 캡슐화합니다. 그것은 좋은 OO 원칙으로 간주됩니다.

물론 값을 설정하거나 반환하는 것 이상을 수행하지 않는 경우에는 코드처럼 보이는 경우가 있습니다. 그러나 setter를 사용하면 입력 유효성 검사 또는 정리를 수행 할 수도 있습니다. 이를 한 곳에두면 개체의 데이터 무결성이 향상되고


우리는 프로그래밍 언어를 사용하고 있기 때문에 지향합니다. 여기에서는 숨김 및 캡슐화를 사용합니다. 변수는 외부 세계에서 직접 액세스 할 수 없어야 (데이터에서 만들 것입니다) 개인용으로 만들 것입니다.

shape.x

발음하지 않습니다. 캡슐화를 수행하는 방법 인 x의 값을 가져오고 설정하는 데 Getter 및 setter 메서드가 사용됩니다.

참고 URL : https://stackoverflow.com/questions/10407877/what-is-the-point-of-getters-and-setters

반응형