게터와 세터는 어떻게 작동합니까?


107

나는 PHP 세계에서 왔습니다. 게터와 세터가 무엇인지 설명하고 몇 가지 예를 들어 줄 수 있습니까?


@ yegor256 나는 당신의 개와 공의 비유를 이해하고 심지어 그것을 지원합니다. 그러나 "살아있는 유기체"개체가 가끔 원시 값 (예 : ID)을 저장하면 어떨까요? 단순한 할당을 넘어서고 싶지만 원시 값을 처리하기 위해 새 클래스를 작성하고 싶지 않다면 어떻게 될까요?
Jacksonkr

답변:


127

이를 위해 튜토리얼은 실제로 필요하지 않습니다. 캡슐화 에 대한 읽기

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
그래서 getter는 private 필드를 얻는 방법이며 setter는 새 필드를 설정합니다. 코드에 의해 잘 설명 주셔서 감사합니다
ajsie

1
getter에 매개 변수를 전달할 수 있습니까?
ajsie

2
noname : 아니, 아니. Getter는 값을 가져 오지만 필드에 포함 된 값을 노출하지 않는 방법입니다. 즉, 호출 someObj.getTime().setHour(5)하면 someObj의 내부 상태에 영향을주지 않습니다 . 또한 setter와 getter (접근 자 및 뮤 테이터) 는 매우 엄격한 메서드 시그니처를 가지며 이는 getter에 매개 변수가 없음을 의미합니다. 일반적으로 메서드는 어쨌든 한 가지만 수행해야합니다.
Esko

4
@noname : 단순한 물건에 복잡한 / 큰 / 추상적 인 이름이 주어지면 "디자인 패턴"이라는 것이 있습니다 .... 그리고 이것은 제가 방금 발명 한 재귀 개념 설명 패턴의 예입니다 ;-)
namespaceform

3
@qed : this더 구체적인 범위를 가진 항목과 충돌하지 않는 한 키워드는 선택 사항입니다. 제공 한 예제에서 생성 된 setter는 이름이 필드 이름과 일치하는 단일 매개 변수를 가지므로 this.fieldName = fieldName는 필드가 자신에게 할당되는 매개 변수가 아니라 필드가 할당되고 있음을 구별하는 데 사용됩니다 fieldName = fieldname. getter에는 그러한 충돌이 없습니다.
Paul Creasey 2013

39

Java에서 getter 및 setter는 완전히 일반적인 기능입니다. 그들을 getter 또는 setter로 만드는 유일한 것은 관습입니다. foo에 대한 getter는 getFoo라고하고 setter는 setFoo라고합니다. 부울의 경우 getter를 isFoo라고합니다. 또한 'name'에 대한 getter 및 setter의이 예제에 표시된대로 특정 선언이 있어야합니다.

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

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

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

멤버를 공개하는 대신 getter 및 setter를 사용하는 이유는 인터페이스를 변경하지 않고도 구현을 변경할 수 있기 때문입니다. 또한 리플렉션을 사용하여 개체를 검사하는 많은 도구 및 도구 키트는 getter 및 setter가있는 개체 만 허용합니다. 예를 들어 JavaBeans 에는 getter 및 setter 및 기타 요구 사항이 있어야합니다.


9
그 생성자에는 'void'가 없어야하지 않나요?
제이슨 하틀리

여기에는 실제로 Void가 필요합니다. 당신이 그것을 가지고 있지 않다면 당신은 얻는다 :error: invalid method declaration; return type required
Dan

3
공허 여기에 필요하지 않습니다
샤시 키란에게

2
@JasonHartley : 생성자에는 반환 유형이 없습니다.
wassimans

@Mark Byers 따라서 생성자는 인스턴스를 초기화하는 데 사용되고 setter는 주어진 속성을 변경하는 데 사용됩니다. 이 올바른지?
carloswm85

12
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

프로그램을 실행하면 프로그램이 전원에서 시작됩니다.

  1. 객체 c가 생성됩니다.
  2. 함수 setTime()는 객체 c에 의해 호출됩니다.
  3. 변수 time는 전달 된 값으로 설정됩니다.
  4. 함수 getTime()는 객체 c에 의해 호출됩니다.
  5. 시간이 돌아왔다
  6. 그것은에 패스포트됩니다 todtod인쇄 얻을

10

" Why getter and setter methods are evil " 을 읽을 수도 있습니다 .

getter / setter 메서드는 Java에서 일반적이지만 특히 객체 지향 (OO)은 아닙니다. 사실, 코드의 유지 보수성을 손상시킬 수 있습니다. 또한 수많은 getter 및 setter 메서드가 있다는 것은 프로그램이 OO 관점에서 잘 설계되지 않았 음을 나타내는 위험 신호입니다.

이 기사에서는 게터와 세터를 사용하지 말아야하는 이유 (그리고 사용할 수있는 경우)를 설명하고 게터 / 세터 정신에서 벗어나는 데 도움이되는 설계 방법론을 제안합니다.


3

1. 최고의 게터 / 세터는 똑똑합니다.

다음은 mozilla의 자바 스크립트 예제입니다.

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.a + 1; 
    } 
});

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

나는 그들이 굉장 하기 때문에 이것을 많이 사용했습니다 . 코딩 + 애니메이션을 멋지게 꾸밀 때 사용합니다. 예를 들어 Number웹 페이지에 해당 번호를 표시하는 을 처리하는 setter를 만듭니다 . setter를 사용하면 트위너를 사용하여 이전 번호를 새 번호로 애니메이션합니다 . 초기 숫자가 0이고 10으로 설정하면 숫자가 0에서 10으로 빠르게 뒤집히는 것을 볼 수 있습니다. 예를 들어 0.5 초 정도입니다. 사용자는이 물건을 좋아하고 만드는 것이 재미 있습니다.

2. PHP의 게터 / 세터

sof의 예

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

인용 :


2

다음은 Java에서 getter 및 setter를 사용하는 가장 간단한 방법을 설명하는 예입니다. 더 간단한 방법으로 이것을 할 수 있지만 getter와 setter는 상속에서 자식 클래스에서 부모 클래스의 private 멤버를 사용할 때 특별한 것이 있습니다. getter 및 setter를 사용하여 가능하게 할 수 있습니다.

package stackoverflow;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

나는 당신을 비하하지 않을 것입니다 (노력할 가치가 없습니다). (1) 프로그램 언어 Java 여야 하는 Java 질문에 답변 하셨습니다 . (2) 게시하려면 레이아웃이 올바르게 완료되었는지 확인하십시오. (3) 캡슐화 (게터 (또는 접근 자) 및 세터 (또는 뮤 테이터)) 사용이 올바르지 않습니다. 캡슐화의 의미를 찾아보세요 ... (투표 된 답변 확인)
KarelG

1
@KarelG 태그를 읽지 못해서 죄송합니다. 나는 그것을 자바로 업데이트했다. 깨달아 주셔서 감사합니다.
Bashir ahmad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.