디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

getter setter 쓰는 이유: 눕이 눕에게.

ㅊㄹ(1.252) 2016.05.01 14:39:10
조회 2126 추천 10 댓글 13
														
객체지향 패러다임의 언어와 OOP를 처음 접하면 가장 이해할 수 없는 것 중 하나가
"왜 번거롭게 getter/setter를 쓰는지?"인 사람이 많을 겁니다.

왜 쓰는 걸까요? 걍 멤버변수에 접근하면 되잖음? C에서도 그랬고... 

몇몇 다른 이유들도 있겠지만(콜스택 추적...)
가장 큰 이유는 

"getter/setter가 인터페이스와 구현을 분리시킨다"

인거 같습니다.

무슨 소리일까요?
예를 들어봅시다.

저는 최근에 SDL을 이용해서 GUI프로그램을 만들고 있습니다
(SDL은 Simple Media Layer라고 C로 되있는 게임 제작용 라이브러리 입니다. 추천함.)

여기서 화면에 어떤 png파일을 그리려면(렌더링), 
렌더링을 담당하는 렌더러와
Png파일의 크기와 그 좌표를 저장할 사각형이 필요합니다.
사각형은 x,y좌표와 w,h가로세로 길이가 있으면 되겠죠.

렌더러가 렌더링을 하게 하려면 Png파일과
x,y,w,h 정보가 렌더러에게 전달되어야합니다.

그러면 Png를 요렇게 만드는 겁니다.
class Png 
{
public:
    int x,y,w,h;
    PngFile png;
    
    Png(int ax, int ay, int aw, int ah)
    {
        x = ax;
        y = ay;
        w = aw;
        h = ah
    }
    ...
};
(실제 SDL API는 이렇지 않습니다 개구라입니다 걍 의미만 전달되면 됩니다.)
(C++스럽지 않은 초기화는 C++을 접하지 않은 사람들을 위해서입니다)

그리고 렌더러에게 저 변수들을 전달해 봅시다.

int main(){
    ...
    Png pic(10,10, 200,200);
    renderer.render(pic.png, pic.x, pic.y, pic.w, pic.h);
    ...
}

잘 돌아갑니다. 아무 문제없잖아!
getX() getY()같이 줄줄줄 써대지 않고 단 한글자로 표현하여 
아주 깔끔하며 정갈하다는 생각에 가슴 한편이 훈훈해집니다. 
후로그래머는 이후로도 이런 방식으로 5000줄 정도의 코드를 작성하게 됩니다.


그런데 어느날 SDL API참조문서를 읽던 프로그래머는 엄청난 사실을 깨닫습니다.

viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38477a16fb3dab004c86b6fd0548bb7fdb5d15d4d496390cca9d3ae6986739a2ce1bba035a2f2b58c06ce52a16117d542180a5cd026ce


SDL_Rect라는 구조체를 SDL에서 제공하는겁니다.

이 구조체는 x,y,w,h를 가집니다.
그리고 렌더러의 또다른 렌더링 함수가 있었습니다.
renderRect(Png picture, SDL_Rect);
그 함수는 SDL_Rect를 넣어야 작동하는 함수이고
종전의 렌더링함수보다 성능이 좋으면 다양한 효과를 png비트맵에 적용할 수 있는 
그냥 짱좋은 놈이었습니다. 이전의 render함수보다 모든 면에서 나았지요.
어떠한 이유때문에 프로그래머는 새로 알아낸 렌더링함수 renderRect를 써야했습니다.
아니면 최소한 이제부터는 renderRect를 써야했습니다.

후로그래머는 고민에 빠집니다. 쉬바 어떡하지
이미 써놓은 코드가 너무 많습니다! 이걸 다 고칠수는 없습니다.

그래서 요렇게 멤버를 하나 더 추가합니다.
class Png {
public:
    int x,y,w,h;
    PngFile png;
    SDL_Rect rect;
    ....
};

int main(){
    ...
    Png pic(10,10, 200,200);

    ...

    renderer.renderRect(pic.png, pic.rect);
    ...
}

그러나 테스트 결과 맛이 가버렸습니다. 
이전에 작성한 코드의 어떤부분에서 w가로 크기를 반으로 줄였는데
pic.x = pic.x / 2;
렌더링이 된 결과는 w크기 그대로 나와버린 것입니다.
그도 그렇듯이 rect와 x,y,w,h는 아무런 관계도 없기 때문이죠.

그러면 어떻게 해야되나... 그렇다면 아예 멤버변수 rect를 없애는건 어떨까요?
렌더링하기 전에 일회용 rect를 만들어서 주는거지요
class Png 
{
public:
    int x,y,w,h;
    PngFile png;
    
    Png(int ax, int ay, int aw, int ah)
    {
        x = ax;
        y = ay;
        w = aw;
        h = ah
    }
    ...
};

int main(){
    ...
    Png pic(10,10, 200,200);
    ...

    SDL_Rect rect(pic.x, pic.y, pic.w, pic.h);
    renderer.renderRect(pic.png, pic.rect);
    ...
}
하지만 이건 좀 멍청한 거 같습니다. 매번 SDL_Rect를 생성해야되고
각각의 Png마다 렌더링용 Rect를 하나씩 가지고 있어야되는데
아무리 생각해도 SDL_Rect는 Png의 멤버변수가 되어야할 것입니다. 

그래서 결국 후로그래머는 멤버rect에 대한 접근함수를 만듭니다(엥? 그거완전...)
그리고 멤버 rect는 private으로 걸어줍니다.
class Png {
public:
int x,y,w,h;
PngFile png;

Png(int ax, int ay, int aw, int ah)
{
x = ax;
y = ay;
w = aw;
h = ah
}
SDL_Rect getRect()
{
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
return rect;
}
...

private:
SDL_Rect rect;
};

int main(){
...
Png pic
renderer.renderRect(Png.png, pic.getRect());
...
}
어딘가 어설프긴 하지만 해결은 된 거 같군요!
하지만 여전히 문제는 있습니다. 쓸데없이 데이터를 겹쳐서 저장하는군요..
하지만 저는 이제 뭘 어떻게 해야할지 모르겠읍니다.


그런데 말입니다... 처음부터 getter/setter를 썼으면 어땠을까요?
처음에는 후로그래머는 SDL_Rect의 존재를 몰랐으니 다음처럼 작성했을겁니다.
class Png {
private:
int x,y,w,h;
PngFile png;

public:
Png(int ax, int ay, int aw, int ah)
{
x = ax;
y = ay;
w = aw;
h = ah
}

//getter
int getX(){ return x; }
int getY(){ return y; }
int getW(){ return w; }
int getH(){ return h; }
PngFile getPng(){ return png; }

//setter
void setX(int ax){ x = ax; }
void setY(int ay){ y = ay; }
void setW(int aw){ w = aw; }
void setH(int ah){ h = ah; }
...
};

int main(){
    ...
    Png pic(10,10, 200,200);
    renderer.render(pic.getPng(), pic.getX(), pic.getY(), pic.getW(), pic.getH());
    ...
}

앗! 그런데 SDL_Rect를 알게 되었다면?
이렇게 하면 되겠죠!

class Png {
private:
SDL_Rect rect;
PngFile png;
public:
Png(int ax, int ay, int aw, int ah)
{
rect.x = ax;
rect.y = ay;
rect.w = aw;
rect.h = ah
}

//getter
int getX(){ return rect.x; }
int getY(){ return rect.y; }
int getW(){ return rect.w; }
int getH(){ return rect.h; }
PngFile getPng(){ return png; }
SDL_Rect getRect(){ return rect; }
//setter
void setX(int ax){ rect.x = ax; }
void setY(int ay){ rect.y = ay; }
void setW(int aw){ rect.w = aw; }
void setH(int ah){ rect.h = ah; }
...
};

int main(){
    ...
    Png pic(10,10, 200,200);
    renderer.render(pic.getPng(), pic.getX(), pic.getY(), pic.getW(), pic.getH()); //전에 적은걸 걍 냅둬도 됩니다! kia!
    ...

    ...
    renderer.renderRect(Png.png, pic.getRect); //물론 새로운 함수를 도입해도 되지요!
}

크으.... OOP뽕에 취한다...
겹치는 데이터도 없고
이전에 작성한 걸 고칠 필요도 없습니다.
아주 좋소!

이렇게 getter/setter를 쓰면 요구사항 변화에 쉽고 빠르게 대응할 수 있습니다.
구현을 private으로, 인터페이스를 getter/setter함수로 분리했기에 가능한 일이죠. 껄껄~



OOP를 배우기 어려운 이유는
자꾸 뭔가 변경이 많이 되는 걸 프로그래밍해봐야 그 강력함을 이해하는데
학부 수준에서는 그런 큰 걸 접하는 일이 드물고
유지보수 따위 필요없는 작은 과제 프로그램만 짜고 저멀리 치워버리기 때문일겁니다. 

그러니까 답은 프로젝트입니다.
너만의 프로젝트를 해 보아요!





방학 때 쓴 글임

이 글에선 프로그래머의 실수 떄문에 급작스런 요구사항 변화가 일어나지만...

SDL_Rect같은 게 없다가 생길지도 몰라...! 

그건 미리 알 수도 없으니 노답이지!

추천 비추천

10

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47918 65
2896221 개발자라면 금융권 가지마라 [3] chironpractor갤로그로 이동합니다. 14:43 12 0
2896220 '다케시마·일본해' 중립적 언어라 해명한 구글 발명도둑잡기(118.216) 14:19 12 0
2896219 여기 또 ㅈ창났노 ㅇㅇ(122.199) 14:17 19 0
2896218 불평등 해소를 위한 진보의 새로운 대안-모두를 위한 소유 ► 세션 2 모 [1] 발명도둑잡기(118.216) 14:01 18 0
2896217 케이스가 플라스틱이나 철 박스인 과자류 뭐있죠 발명도둑잡기(118.216) 13:57 12 0
2896216 예술작품으로 보는 내 위치 발명도둑잡기(39.7) 13:46 16 0
2896215 나님 아디 해킹하지마라 다 모니터링 하고 있다 [4] ♥덩냥이♥갤로그로 이동합니다. 13:33 46 0
2896214 구글코리아 부사장에 조선일보·화이자 출신 영입 [1] 발명도둑잡기(118.216) 13:26 25 0
2896213 반중을 혐한으로 대항하는 친중극좌 민주당 [1] ♥덩냥이♥갤로그로 이동합니다. 13:18 21 0
2896212 틀튜브 중국 망한다더니 [1] 발명도둑잡기(118.216) 13:13 26 0
2896211 이재명 불법대북송금? 비공개 예산 논란 ♥덩냥이♥갤로그로 이동합니다. 13:06 18 0
2896210 [대한민국] 카카오톡과 캄보디아 사건 프갤러(121.172) 13:04 14 0
2896209 김현지,이재명 범죄 대법원 판결문 공개 ♥덩냥이♥갤로그로 이동합니다. 13:03 21 0
2896208 확실히 환절기는 환절기임 ♥덩냥이♥갤로그로 이동합니다. 13:02 18 0
2896207 미술이나 작곡 기술 다 배워도 만들고 싶은게 없어서 프갤러(60.196) 12:58 21 0
2896206 증권사 개발자임 [6] ㅇㅇ(106.101) 12:57 66 0
2896204 이 대통령 "계엄 연루 군 승진대상자, 발각되면 취소하라" [3] 발명도둑잡기(118.216) 12:28 32 0
2896203 좇센이캄보디아평가할수준임??ㅋㅋㅋ 타이밍뒷.통수한방(1.213) 12:20 16 0
2896202 맘터는 ㄹㅇ 돈 받고 먹어줘도 먹을까말까임 ♥덩냥이♥갤로그로 이동합니다. 12:10 21 0
2896201 '캄보디아 사망' 서세원, 미완의 '카지노 대부' 발명도둑잡기(118.216) 12:08 18 0
2896200 누가 나님 냥덩이 만진거야? [2] ♥덩냥이♥갤로그로 이동합니다. 12:08 36 0
2896199 맘터는 ㄹㅇ 믿거 공짜로 줘도 안 머금 [2] ♥덩냥이♥갤로그로 이동합니다. 12:04 45 0
2896198 미국 여행 중 실종된 한국인 여성 3명…“생사불명, 흔적도 없어” 발명도둑잡기(118.216) 12:03 16 0
2896197 [단독] 캄보디아에 1천7백억 지원‥또 '김건희-통일교' 유착 의혹? 발명도둑잡기(118.216) 11:59 13 0
2896195 AGI << 이거 만들수 있는거 맞냐? [5] 루도그담당(58.239) 11:52 44 0
2896194 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 11:50 17 0
2896193 캄보디아 범죄단체에 극좌 정부기관 연관 가능성? ♥덩냥이♥갤로그로 이동합니다. 11:47 16 0
2896192 캄보디아 한국인피해 이재명 때문이었다 ♥덩냥이♥갤로그로 이동합니다. 11:41 29 0
2896191 "이명박 전 대통령, 캄보디아 총리 '경제 자문' 그만둬야" 발명도둑잡기(118.216) 11:40 20 0
2896190 [긴급] 김현지 종북간첩 경기동부연합과 연관 폭로 [2] ♥덩냥이♥갤로그로 이동합니다. 11:36 40 0
2896189 근데 솔직히 주식 프로그램<<이거 만든게 존나 운이 좋았음 [30] ㅆㅇㅆ(124.216) 11:33 128 0
2896188 국정농단 비선실세 의혹 김현지 대법원 판결문에 기록된 저급한 욕설 ♥덩냥이♥갤로그로 이동합니다. 11:33 30 0
2896187 AI 이후로 개발자 직업은 ㅇㅇ(218.234) 11:31 24 0
2896186 나 이런 글 존나 좋아함 진짜 [1] ㅇㅇ갤로그로 이동합니다. 11:30 43 0
2896185 제일 이해가 안가는게 그거임 나 경력 좆밥인데 [2] ㅆㅇㅆ(124.216) 11:28 52 0
2896184 펜타곤·美언론 전운…'허락받아 쓰라' 보도지침에 집단 거부 발명도둑잡기(118.216) 11:27 18 0
2896183 비선실세 김현지 국민의혹 해소해야 국감을 넘어 특검과 처벌 필요성 ♥덩냥이♥갤로그로 이동합니다. 11:24 19 0
2896182 근데 사고 자체가 기이하네 [2] 루도그담당(118.235) 11:24 57 0
2896181 프로그래머 괜히했나 [1] ㅇㅇ(223.39) 11:22 40 0
2896180 애미추가 이끌어낸 찢두순 유죄 가짜대통령 지위박탈 재판 재개만 남았다 ♥덩냥이♥갤로그로 이동합니다. 11:22 21 0
2896179 "K팝, 복사 붙여넣기 역겹다"…뮤직비디오 표절에 분노 발명도둑잡기(118.216) 11:19 23 0
2896178 42경산 3기 3차 라피신 교육생 모집 (~10/17) 프갤러(14.32) 11:19 24 0
2896177 극좌 찢두순 캄보디아 국민구출 보다 국민입틀막에 급급 ♥덩냥이♥갤로그로 이동합니다. 11:19 19 0
2896176 무능극좌 찢두순 레임덕 시작 ㅋㅅㅋ ♥덩냥이♥갤로그로 이동합니다. 11:18 20 0
2896175 대체 나님을 왜 나무위키에 박제한것임? ♥덩냥이♥갤로그로 이동합니다. 11:16 31 0
2896174 인정 받으려고 애쓰는 게 뭐 어쨌단 거임 [3] 에이도비갤로그로 이동합니다. 11:10 65 1
2896173 안녕하세요 신입 QA입니다 [1] cvs.갤로그로 이동합니다. 11:01 34 0
2896172 [SeSAC] 생성형 AI 활용한 클라우드 & 보안 전문가 양성 캠프 ( 프갤러(14.32) 10:55 20 0
2896171 냥덩이도 납치되서 캄보디아로 끌려가는거 아닐까? 발명도둑잡기(118.216) 10:46 17 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2