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


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. 그것은에 패스포트됩니다 tod및 tod인쇄 얻을

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.