getter setter


(codesafer) #1
c = ( a + b ) / 2;

이렇게 한 문장( statement = 문법적으로 완성되어 컴파일러가 코더의 주문을 처리할 수 있는 단위 ) 의 코드 가 있다.

이 코드를 쉬프트 커서키 등으로 블럭으로 싸든 마우스로 드래그해서 선택해서,
이동시키든지, 잘라내거나 붙이든지 하게 되면 code block의 존재를 몸으로 느끼게 되는것.

{
    c = ( a + b ) / 2;
}

자주 사용되거나 의미를 명확히 해주고 싶을때 이 블럭에 이름을 붙여주면 그게 함수( function )인거고,
파라메터가 없을경우 pascal 언어에서는 특별히 프로시져( precedure ) 라고 부르는것.

int average( int a, int b )
{
    return ( a + b ) / 2;
}

...

c = average( a, b ); 

함수는 외부에서 이름을 불러 실행할 수 있고,
parameter 를 통해 매개변수를 정의할 수 있으며,
함수 호출에서 그렇게 가져온 인자를 argument 라고 부르는 것인데,

여러 프로그래밍 언어에서 함수 안에서 선언한 지역변수들을 굳이 외부에 노출시키지 않아
자연스레 ‘아들’ 같은 표현을 써도 ‘우리 아들’ 인 걸로 약속을 해둬서 사용이 편리해지는 것이고,
외부의 또 다른 아들 같은걸 호출하기 위해 scope 연산자 ( 지시어 :: )를 지원하곤 하는 것이다.

함수라는 구조가 참 간단하면서도 논리적으로 필요한 요소들을 대부분 갖추고 있기 때문에,
쓰레드의 본체도 함수로 구현하고, 이벤트 핸들러의 구조도 함수로 구현하고 하는 것.

그렇다면 내가 왜 쓸데없이 이런 초급 글을 쓰느냐…

getter setter 가 객체지향을 엿먹이니 하는 표현들은 내가볼때 오버임.
코드가 길어지는건 기분나쁘고 피곤한일이긴하지만 goto 쓰면 망함 하는 수준으로 볼 문제도 아니고,
goto 도 적절히 쓰면 성능을 쥐어짤 때나 코드량을 줄이는데 꽤 보탬이 되기도 하는데다,
property 를 지원하는 언어에서 이를 페어링해주면 물론 더 깔끔할 수 있지.

함수라는 재사용가능한 proxy wrapper 를 두었기 때문에,
이 과정을 거치는 코드들을 중앙 집중식으로 관리할 수 있어서,

  1. 접근을 추적하기 좋음
  2. L-R value 적 접근에 대해 관용적인 표현으로 주된 접근 대상을 분명히함
  3. 연관되어 처리되는 흐름을 한 스탭에 포함시킬 수 있음
  4. 부가기능을 넣을 수 있음

등의 역할을 하게 되는 것.

물론 모든 객체는 복잡성이 0일 수록 좋지.
전원 버튼도 없고 콘센트도 없고 그냥 알아서 전원공급 받으며 자기 할일 알아서 하는 인터페이스가 짱 좋음.
아무런 핸들이 필요치 않은게 제일 좋다는것.

그런데 개발과정의 측면에서 보면 필요한 핸들이 없으면 그 자체로 재사용성이 사라짐.
객체의 은닉화에 대해 너무 집착한 나머지 맨날 다시짜는 수고가 없기를 바라는 마음에서 초보적인 이야기를 떠들어봄.

요약.
getter setter 남발하면 물론 안되겠지만,
getter setter의 장점이란게 사실 네이밍이 관용화된 '함수’의 장점이기 때문에,
부정해봐야 객체 자신을 부정하는 소리밖에 안된다고 생각.


(f3wdekj5gb) #2

함수로 나눠짜면 간결한것이 좋습니다
너무 많아지면 또 곤란하긴한데


(P.노우렛지Δ) #3
public class PPAP
{
    public int SomeProperty
    {
        get { /* 뭔가 처리하고 get 하기 */ }
        set { /* 뭔가 처리하고 set 하기 */ }
    }
}

프로퍼티를 지원한다면 get_ 이나 set_ 시리즈 함수보다는 프로퍼티를 쓰는 편이 객체를 좀 더 잘 표현할 수 있지 않을까 싶읍니다.


(codesafer) #4

property 문법 지원하면 접근법이 엄청 쾌적하죠.
객체의 대입연산자를 오버라이딩하는것도 한계가 있고 말이죠 : )
c++ 도 우선적으로 도입해야하는 문법에 속한다고 봅니다~


(P.노우렛지Δ) #5

https://docs.microsoft.com/en-us/previous-versions/2f1ec0b1(v=vs.140)

사실 C++/CLI 에서는 이미 가능했습니다. 닷넷을 먹었더니 생겨난 효과였을까요?

하지만 C++/CLI는 고인이 되다 시피한…


(바보털) #6

Ruby에서는 attr_accessor로 변수 생성과 getter와 setter를 동시에 만들어 줍니다(getter만 원하면 attr_reader).

거기다가 =달린 메서드들을 만들 수 있어서…

class MyTime
  attr_accessor :second
  def minute
    @second / 60
  end
  def minute=(minmin)
    @second = minmin * 60
  end
end

t1 = MyTime.new
t1.second = 120
puts "#{t1.second} #{t1.minute}"
t1.minute = 5
puts "#{t1.second} #{t1.minute}"
120 2
300 5

쪼끔 부럽습니다


(codesafer) #7

닷넷 개발총괄이 borland에서 넘어간 애고 VCL 에서 이미 property 가 있었으니…


(codesafer) #8

음… 하지만 아름답지 않으니 덜 부러움.


(바보털) #9

C# 프로퍼티 찾아보다가 ‘value는 어디에 선언한거야???’ 하고 찾아봤는데 알고보니 키워드였네요ㅠㅠㅠㅠㅠㅠ


(P.노우렛지Δ) #10
public object SomeProp 
{
    get { return _someProp; }
    set { 
        var some = value;
        /* 대입전 처리 */
        _someProp = some;
    }
}

C#의 프로퍼티를 처음 만지는 사람들이 value 보고 띠용하는 경우가 많읍니다. 낄낄.


(11copy) #11

마구마구 쓰고 쓰고 어…:thinking:
아니다 빼자 빼자… 어…:thinking:
아몰랑! :drooling_face: