객체지향언어에서 어떤 Data를 다른 Data로 변환할때.

Fe.head의 이미지

객체지향언어에서 어떤 Data를 다른 Data로 변환할때
변환 함수는 어떻게 구현하는것이 좋나요?

그러니깐 변환함수를 어디다가 구현하는것이 좋는가 하는겁니다.

예를 들면

class Man
{
private:
    int     _age;
};

class Data
{
private:
    char    _age[20];
};

int main()
{
    Data    data("28");
    Man     man;

    ....
    return 0;   
}

이런 코드가 있다고 가정한다고 하면

convert함수는 어디에 있어야 적당한가요?

man.convert(data);

or
data.convert(&man);

or 새로운 class Convert를 작성하여
class Convert{...};
Convert con;
con.convert(man, data):

여기서는 man에 convert함수를 만드는것이 적당한것 같습니다만.
그러면 Man class 는 Data class 를 알고 있어야 되는것 같은데.

어떤것이 좋을까요?

doldori의 이미지

Man과 Data가 서로 어떤 관계인지 모르는 상태에서는 대답하기 어렵습니다.

M.W.Park의 이미지

copy constructor 또는 helper class로 구현하는게 일반적인 것같은데요.
구현하는 사람의 취향에 따라 달라지는 것같습니다. 8)

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

kane의 이미지

C++이라면, Man 클래스의 operator =을 사용해서
man = data;

happyjun의 이미지

불필요한 종속성은 줄일 수록 좋습니다.

Data와 Man이 항상 같이 사용될 때가 아니라면 외부로 분리해 주는 것이 종속성을 줄여줍니다.

재사용성 측면에서 보면 Data만이 필요한 경우라도 Man을 가져가야 합니다.

Unit Test를 할 때도 Data를 테스트 할 때 Man을 넣어 주어야 합니다.

----------------------------------------
http://moim.at
http://mkhq.co.kr

htna의 이미지

class FROM 의 내용을 class TO 에서 받는다고 할때

"operator =" 을 사용하는것도 좋은 방법입니다만.
"TO = FROM"
아무래도 "operator =" 은 같은 클래스의 내용복사를 기본가정으로 인식하고 있어서 실제로 코드 읽을때 혼동이 오지 않을까 생각이 드네요.

이보다는 import 라는 이름으로 받는것도 좋을듯 합니다
"TO.import(FROM)"
다른 타입을 자신의 타입에 맞게 가져온다는 의미가 강하게 들릴 수 있기 때문입니다... 만...

하지만, 경우에따라 class FROM과 class TO의 proteced/private 부분을 참조해야 변환을 하는경우도 있을테니...
차라리 convert class를 만드는게 낫지 않을까요 ???

import 아니면 convert class 추천입니다.
^^

WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra

atie의 이미지

convert 클래스를 만들면, Data와 Man 클래스 모두를 알아야 하지 않나요? 제 생각에는 클래스 안의 데이타는 속성대로 외부에 알려주고, 가져오는 쪽에서 내 취향에 맞게 변환을 하는 것이 보통이라는 생각입니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

Fe.head의 이미지

답변 감사드립니다.
오늘에서야 답변을 보게 되었네요.

doldori wrote:
Man과 Data가 서로 어떤 관계인지 모르는 상태에서는 대답하기 어렵습니다.

man과 data의 관계는 거의 같은 사람의 속성을 표현것이라고 생각하시면 되는데 단지 자료전송등의 이유로 int를 char 배열로 바꾼거라 생각 하시면 되는데요

Quote:
불필요한 종속성은 줄일 수록 좋습니다.

Data와 Man이 항상 같이 사용될 때가 아니라면 외부로 분리해 주는 것이 종속성을 줄여줍니다.

재사용성 측면에서 보면 Data만이 필요한 경우라도 Man을 가져가야 합니다.

Unit Test를 할 때도 Data를 테스트 할 때 Man을 넣어 주어야 합니다.


위의 말씀은 convert class를 만들어서 그쪽에서 구현해야 맞다는 말씀 같은데요. 그럼 아래

atie wrote:

convert 클래스를 만들면, Data와 Man 클래스 모두를 알아야 하지 않나요? 제 생각에는 클래스 안의 데이타는 속성대로 외부에 알려주고, 가져오는 쪽에서 내 취향에 맞게 변환을 하는 것이 보통이라는 생각입니다.

atie님 글처름 convert class가 Data class와 Man class를 모두 알아야 하는 단점이 있지 않나요?

atie wrote:

제 생각에는 클래스 안의 데이타는 속성대로 외부에 알려주고, 가져오는 쪽에서 내 취향에 맞게 변환을 하는 것이 보통이라는 생각입니다.

이말씀은 Data class에 속성을 알려주는 get함수가 있어야 한다는 말씀이신가요?

Man class에서는 set 함수가 있어야 한다는 말씀이신거 맞는거지요?

그리고 마지막으로
만약 Data class와 Man class가
Data --> Man
Man --> Data
로 둘다 변환이 필요하다면 어떻게 하는것이 나을까요?
convert class, 혹은 Data.convert, Man.convert를 구현하는것이 나을까요?

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

kane의 이미지

fehead wrote:
atie wrote:
제 생각에는 클래스 안의 데이타는 속성대로 외부에 알려주고, 가져오는 쪽에서 내 취향에 맞게 변환을 하는 것이 보통이라는 생각입니다.

이말씀은 Data class에 속성을 알려주는 get함수가 있어야 한다는 말씀이신가요?

Man class에서는 set 함수가 있어야 한다는 말씀이신거 맞는거지요?


Data 클래스에 get 메쏘드가 있어야 하고,
Man 클래스에는 set 메쏘드가 필요없다는 말입니다.
가져오는 쪽(클래스)에 변환 함수가 선언되어 있으므로 가져오는 쪽에서는 set 메쏘드 없이 작업할 수 있습니다.

fehead wrote:
convert class, 혹은 Data.convert, Man.convert를 구현하는것이 나을까요??

1.
man.import(), data.import()를 구현할 경우에는 양쪽 클래스에 get 메쏘드가 있어야 합니다.
Convert 클래스를 구현할 경우에는 양쪽 클래스에 get/set 메쏘드 모두가 있어야 합니다.

2.
man.import(), data.import()를 구현할 경우에는 두 클래스를 항상 함께 사용하게 됩니다.
Convert 클래스를 구현할 경우에는 Man 클래스와 Data 클래스를 독립적으로 사용할 수 있게 됩니다.

이 정도 장단점이 있는 것 같습니다.

Fe.head의 이미지

답변 감사드립니다.^^

장단점이 존재 하는군요.

보통 한번만 필요하므로 Man.import 함수로 구현하는것이 저한테는 맞을것 같군요^6

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.