도대체 [구조체]가 [클래스]보다 좋은점이 뭔가요?

이소희의 이미지

클래스를 만들어도 되는 것들을 궂이 구조체로 만들어 사용하는 이유가 뭔지요?
구조체에서 할 수 있는거. 클래스에서도 다 되고,
구조체로 만든다고 메모리 크기가 작은것도 아니구...
연산 속도가 빠르다면, 왜? 빠른지요?
초보적인 질문같지만, 꼬옥 답변 해주셨으면 합니다.

댓글

hyperhidrosis의 이미지

저는 멤버 함수는 필요없고 ctor, dtor 만 있으면 "편리한" 데이터를 표현할때
struct 를 활용합니다..

class C
{
...
struct S
{
S() { p=NULL;}
~S() {if(p) free(p);}
void* p;
};

};

와 같은 식으로요... 꽤 편리하다고 생각합니다만..

pool007의 이미지

이 쓰레드에서 마치 struct = POD 인 것 처럼이야기 되고 있는데,
이는 사실과 다릅니다.

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond 에 보면 다음과 같이 POD를 설명합니다.

Quote:

POD stands for “plain old data.” Believe it or not, that’s a technical term in the C++ standard. The standard gives us license to make all kinds of special assumptions about POD types. For example, PODs always occupy contiguous bytes of storage; other types might not. A POD type is defined to be either a scalar, an array of PODs, or a struct or union that has no user-declared constructors, no user-declared copy assignment, no user-declared destructor, no private or protected non-static data members, no base classes, no non-static data members of non-POD, reference, or pointer to member type, or array of such types, and no virtual functions.

결국 struct가 항상 POD가 되는건 아닙니다. 위의 조건을 다 지켜야하죠.

--
Passion is like genius; a miracle.

익명사용자의 이미지

구현이 비슷하다고 쓰는 용도도 비슷하다고 생각한다면, EXIT_SUCCESS와 FALSE를 같은 용도로 써도 되는 것이겠죠?

int main() {
...
return FALSE;
}

BOOL isCorrect() {
...
return EXIT_SUCCESS;
}

이 두 개의 함수가 그래도 "제대로"라고 생각하신다면, struct와 class는 별 차이가 없는 것이 맞겠지요.

어떤 "것"을 쓸 때, 프로그래머가 봐야하는 것은 그 "것"의 구현이 아니라 그 "것"의 의미입니다.

struct는 그저 "구조"를 나타내는데 쓰는 것이고, class는 "클래스"를 나타내는데 쓰이는 것일뿐입니다.

struct의 attribute가 struct의 본질이고, member function이 부가정보라면, class는 그 반대로 봐도 무방합니다.

물론, 구조와 클래스가 반드시 이거다 라고 할만큼 딱딱 나누기도 힘들뿐더러, 설령 나누었다고 쳐도, 구조를 나타내는데 class를 쓰면 안된다는 법도 없고, 클래스를 나타내는데 struct를 쓰면 안된다는 법이 없습니다.

EXIT_SUCCESS와 FALSE를 서로 바꿔써도 프로그램이 "아주 잘" 돌아가는 것 처럼 말이죠.

예진아씨의 이미지

struct 는 기본 접근 권한이 public 인 class 와 동일하고,
class 는 기본 접근 권한이 private 인 struct 와 동일합니다.

그냥 컨벤션으로 멤버함수가 없고 C에서도 그대로 쓸 수 있는 일차원 메모리 구조는 struct 라고 써 주는거죠. 코드 읽기 편하게요.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

romantic74의 이미지

제작자의 의도가 무엇일까요 ?
제가 공부한 바로는 struct는 C 의 호환성을 위해서 그대로 둔 것입니다.
그대로 두었다고 했지만 struct는 class 에서 접근 권한을 public으로 선언한 거와 동일하죠.
그래도 호환성에는 문제가 없어서 겠죠.
class 는 "사용자 정의 데이타 형식" 라고 말할 수 있습니다. "사용자 정의 데이타 형식"라고 하면
그 형식은 연산이 되어야 합니다. C 에서는 그것이 불가능하죠. 하지만 C++ 에서는 그 형식에 맞는
연산자를 정의할 수 있죠. 가령 string 이 + 연산자를 제공하는 경우겠지요
연산자를 정의할 수 있다는 것은 C++의 특징중에 하나이지요. 캡슐화, 상속성 등등은 논외로 하겠습니다. ^^
제작자는 초기 자신의 프로젝트에 사용자 정의 데이터를 설계할 수 있을까 라는
의문을 갖게 되고 class 라는 키워드를 사용하게 되었죠. ( 그래서 초기 이름은 C with class 였죠 ? 아마 )
여기에는 스몰톡 같은 순수 객체지향 언어가 많은 도움이 되었죠.
이후 Ada, BCPL 같은 언어의 특징들을 추가하여 C++이 탄생하게 됩니다.
제작자의 의도는 C의 호환성, 효율성, 성능 등을 절대로 놓칠 수가 없었죠. 그래서 C와 완벽히 호환되도록
만들었다고 합니다. 이 중에 bool 도 포함이 되었으며 타입 안정성이 강화 되었죠.
결론은 C++ 에서 struct는 C의 하위 호환성을 위해서 class 에서 접근권한이 모두 public인 경우와
동일하다. 입니다. 그리고 C와 동일하게 작성 될 수 있지만 비추입니다.
C++ 에서는 class 에 private 접근권한을 써야 합니다.. ^^
감사합니다.

vacancy의 이미지


C++은 C의 문법을 차용한 것 뿐이고
사실 완벽히 호환되지는 않습니다.
그리고 그게 계획되어 있지도 않고요.
사실 아예 새로운 언어로 만들었으면
더 낫지 않았을까 하는 생각을 합니다.
( 사람들 헷갈리지 않게 .. -_-; )

C++은 멀티패러다임이라는 단어 뒤에서
정말 온갖 것들을 혼동하게 만드는 게 가장 큰 특징같은데요.
이건 개념적인 부분부터 시작해서 실제 코드까지
광범위하게 영향을 주는 것 같습니다. -_-;

class는 사실 OO에서 나온 개념이지
그냥 "사용자 정의 데이터 형식"이라는 개념이 아닙니다.
( 뭐 키워드 이름만 잘못지었다, 하면 할 말이 없습니다만 .. )
C++에서 구현하기를 struct와 거의 같게 구현되었을 뿐이죠.
사실 생각의 과정이 개념->구현, 이 되어야 하는데,
종종 구현->개념, 으로도 가는 게 사람이다보니 -_-a
그걸 통제해줄 뭔가가 필요한데 언어 수준에서는 별로 도와주는 게 없는 셈이죠.
( 에, 언어 수준에서 꼭 뭘 도와줘야 한다는 말은 아닙니다. ;; )

연산자 재정의 같은 건, 뭐 좋아하시는 분들도 많이 있겠지만
역시나 많은 사람들이 같이 코드를 작성하는 경우엔 재앙도 많이 초래합니다.
제가 팀장이라면 아마 절대 이런 feature는 못 쓰게 할 거예요. ;;
팀원들이 전부 C++이라면 꿰고있다, 하는 초고수라면 모를까.

C++에서 사용하고 있는 다중 상속 메카니즘도 솔직히 쓰다보면 우울합니다. -_-
Delphi, Java, C# 라인의 상속을 쓸 때 가지는 마음하고는 아주 다르죠. ;;
Unmanaged 환경에 기반한 Java나 C#와 유사한 언어가 하나쯤 나와줘도 좋을 것 같은데요. (제발)
( Object-C/C++은 어떤지 모르겠긴 하네요 ;; )
C++로 짜다보면 (특히, 멀티패러다임(?)을 가진 팀원들과 코딩하다보면 ..) 온갖 생각이 다 듭니다.

여기까지는 제 방식대로의 이해와 푸념이었고요. ;;

사실 궁금한 게 있어서 답글을 추가하고 있는 것인데요.
C++에서 차용한 Ada나 BCPL의 특징이 뭔지 궁금합니다.
특히 Ada요. ;;
혹시 아시는 부분이 있으면 알려주시면 감사하겠습니다. ;;

익명 사용자의 이미지

Clearly, C++ owes much to C[Kernighan,1978]. [중략] C in turn owes much
to its predecessor BCPL[Richards,1980]; in fact, BCPL's // comment convention
was (re)introduced in C++.

Templates were partly inspired by Ada's generics (both their strengths
and their weaknesses) and partly by Clu's parameterized modules.
Similarly, the C++ exception-handling mechanism was inspired
partly by Ada[Ichbiah,1979], Clu[Liskov,1979], and ML[Wikstrom,1987].

- B. Stroustrup, The C++ Programming Language

여기까진 질문에 대한 답이고
"C++은 C의 문법을 차용한 것 뿐이고
사실 완벽히 호환되지는 않습니다."
이 말씀은 맞지만
"그리고 그게 계획되어 있지도 않고요."
높은 수준의 호환성은 C++을 설계할 때부터 의도한 것이었습니다.

However, great importance was attached to retaining a high degree of compatibility
with C[Koenig,1989][Stroustrup,1994] (Appendix B); this precluded cleaning up the C syntax.

- B. Stroustrup, The C++ Programming Language

C도 계속 변하고 있는 이상 완벽한 호환이라는 것은 가능하지도 않고 의미도 없는 일입니다만
실용적인 의미에서는 C는 C++의 subset이라고 볼 수 있습니다.
그리고 C++이 수정한 C의 문법을 C99에서 채택하기도 했고요.
실제로 TCPL에 실린 예제 코드들은 모두 완벽한 C++ 코드이기도 합니다.

Quote:
사실 아예 새로운 언어로 만들었으면
더 낫지 않았을까 하는 생각을 합니다.
( 사람들 헷갈리지 않게 .. -_-; )

전에 BS의 C++0x에 대한 강의를 동영상으로 본 적이 있는데 청중 가운데 누군가가
비슷한 얘기를 했습니다. 그러자 BS는 "새로운 언어를 완전히 처음부터(from scratch)
만든다는 것은 정말로 힘든 일이다. 그 당시에 C를 기반으로 삼은 것은 타당한
결정이었다."고 대답했습니다. (정확한 문장은 기억하지 못하지만 대략 그런 뜻이었습니다.)

vacancy의 이미지


답변 감사드립니다. ^^a

제가 계획되어 있지 않다고 한 부분은
"완전히 호환하게 한다"라는 것이고요.
높은 호환성에 대해 부정하는 것은 아니었어요.
( 혹시 오해가 있을까봐 덧붙입니다. )

여튼 참고가 많이 되었습니다.
좋은 하루 보내세요. ~

p.s.
여담이지만 개인적으로
BS의 말들은 별로 설득력이 있단 생각이 안들더군요.
제가 비뚤어진건지. -_-;

select99의 이미지

저도 그렇게 생각합니다.
저뿐만이 아니었군요..

select99의 이미지

댓글이상하게 달라붙는거 같은데..

김일영의 이미지

이게 맞는지는 모르겠는데요(혹시 제가 혼동하고 있는거면 알려주시길...)

제가 기억하기론 구조체는 대입문 형식의 복사를 할 수 있는데 { A = B; }
클래스는 복사 생성자를 정의해야 되는 걸로 압니다.

구조체는 복사를 할 수가 있다는걸 제일 유용하게 써먹는 경우는
구조체 원소에 배열을 넣은 경우입니다.

배열은 원래 대입문 형식의 복사를 할 수 없죠.
하지만 구조체는 할 수 있기 때문에
구조체의 원소로 배열을 넣고 그 구조체를 복사하면 배열도 간단히 복사가 되는 것이죠.

클래스는... 안 되죠? (갑자기 기억이 가물가물...)

익명 사용자의 이미지

class testclass
{
public:
	int i;
	int p;
};
 
struct teststruct
{
private:
	int i;
	int p;
 
public:
	teststruct() : i(1), p(2) {}
	~teststruct() {}
	teststruct(const teststruct &rhs) {
		*this = rhs; 
	}
 
	const teststruct& operator =(const teststruct &rhs) {
		this->i = rhs.i;
		this->p = rhs.p;
 
		return *this;
	}
};
 
int main( int argc, char* argv[]) 
{
	testclass a, b;
	teststruct c, d;
	a.i = 1;
	a.p = 2;
 
	b = a;
	d = c;
 
	return 0;
}

이 코드와 디스어셈 코드 기준은 c++ 컴파일러 vc2005입니다.

Quote:
제가 기억하기론 구조체는 대입문 형식의 복사를 할 수 있는데 { A = B; }
클래스는 복사 생성자를 정의해야 되는 걸로 압니다.

위의 소스를 보시면 아시겠지만, 클래스도 됩니다. 위의 글에서 계속 언급되었다시피 c++에서 구조체와 클래스는 키워드 구분외에는
사실상 같습니다.

Quote:
배열은 원래 대입문 형식의 복사를 할 수 없죠.
하지만 구조체는 할 수 있기 때문에
구조체의 원소로 배열을 넣고 그 구조체를 복사하면 배열도 간단히 복사가 되는 것이죠.

클래스는... 안 되죠? (갑자기 기억이 가물가물...)


또 다시 언급하지만 클래스도 됩니다.

여기서 저도 질문하나,
b = a같은 경우 c에서는 "byte to byte로 복사한다", c++에서는 "디폴트 복사생성자를 만들어준다."
이것이 제가 알고 있었던 지식입니다. 그러나, 디스어셈 코드를 보니 아니네요?

혹, 컴파일러가 최적화할 수도 있기때문에 코드 최적화에 관련한 모든 옵션은 사용하지 않았습니다.

b = a;
0043D686  mov         eax,dword ptr [ebp-18h] 
0043D689  mov         dword ptr [ebp-28h],eax 
0043D68C  mov         ecx,dword ptr [ebp-14h] 
0043D68F  mov         dword ptr [ebp-24h],ecx 
 
d = c;
0043D692  lea         eax,[ebp-38h] 
0043D695  push        eax  
0043D696  lea         ecx,[ebp-48h] 
0043D699  call        teststruct::operator= (42627Fh) 
 
 
const teststruct& operator =(const teststruct &rhs) {
00427C50  push        ebp  
00427C51  mov         ebp,esp 
00427C53  sub         esp,0CCh 
00427C59  push        ebx  
00427C5A  push        esi  
00427C5B  push        edi  
00427C5C  push        ecx  
00427C5D  lea         edi,[ebp-0CCh] 
00427C63  mov         ecx,33h 
00427C68  mov         eax,0CCCCCCCCh 
00427C6D  rep stos    dword ptr es:[edi] 
00427C6F  pop         ecx  
00427C70  mov         dword ptr [ebp-8],ecx 
 
this->i = rhs.i;
00427C73  mov         eax,dword ptr [this] 
00427C76  mov         ecx,dword ptr [rhs] 
00427C79  mov         edx,dword ptr [ecx] 
00427C7B  mov         dword ptr [eax],edx 
 
this->p = rhs.p;
00427C7D  mov         eax,dword ptr [this] 
00427C80  mov         ecx,dword ptr [rhs] 
00427C83  mov         edx,dword ptr [ecx+4] 
00427C86  mov         dword ptr [eax+4],edx 
 
return *this;
00427C89  mov         eax,dword ptr [this] 
}
00427C8C  pop         edi  
00427C8D  pop         esi  
00427C8E  pop         ebx  
00427C8F  mov         esp,ebp 
00427C91  pop         ebp  
00427C92  ret         4
codepage의 이미지

제 개인적으로는 구조체는 아래 두 가지 경우에만 사용합니다.

1. 논리적인 데이타 구조는 필요하지만 이것들이 하나의 Object가 될 필요는 없을 때,
다시 말해서 메소드를 가질 필요가 없고, 상속할 필요가 없고 멤버들이 모두 public일 경우
이러한 경우에는 구조체를 사용합니다.
즉, 코딩 시 필요한 기능에 정확히 맞는 기법만을 사용한다는 원칙이 있습니다.
물건을 담는 상자만 필요한데 거기다가 자물쇠 있고 뚜껑있고 서랍이 있는 상자를 만드는 수고는
하지 않는다는 뜻입니다.
딱 정확히 맞는 용도에 맞는 도구를 사용한다고 보면 되겠습니다.
반대로, 생성자안에서 맴버 변수도 초기화 해야 되고, 안에 있는 맴버 변수들을 노출시켜서
그 클래스를 사용하는 개발자들에게 쓸데없는 혼란을 주고 싶지 않고, 기능을 갖고 있는
메소드를 같이 정의하는 것이 타당하고.. 이런 명확한 설계상의 이유가 있을 때는 클래스를
쓰는 것이 타당하겠죠?

2. 또한 C ++이 아닌 C 함수를 호출할 때 인자로 넘겨주기 위해서도 씁니다.

rubenz의 이미지

구조체에 자료 넣어서 같은 구조체로 받을수 있지만,...
클래스로는 그러한 작업 못합니다.

구조체는 binaryf로 바로 파일로 저장 하지만..
클래스로는 그러한 작업 못합니다.

생각해 보니 못한게 아니고 안해 봤습니다..ㅡ.ㅡ

Scarecrow의 이미지

이 오랜 쓰레드가 아직도 활발한 것이 의외군요.

struct와 class의 차이를 얘기하려 노력하는 분들이 있습니다만
그런 차이는 전혀 없으며 실제적으론 둘다 됩니다.

class에서 되는건 struct에서 다 되며
struct에서 되는건 class에서 다 됩니다.

class data {
public:
    char name[10];
    int age;
};

이런식으로 사용하면 class또한 struct랑 완전 같죠.

struct도 상속이 되고 멤버함수를 가질 수 있고 가상멤버함수 또한 가질 수 있고 기타등등
class와 완전 동일합니다.

유일한 차이점은 접근자인데...
struct은 기본이 public이고 class는 기본이 private이라는 점이죠.

그래서 상속할때도

struct foo;
struct bar : foo;
class foo:
class bar : public foo;

같은 차이만 있을뿐 실제 동작은 완전 동일합니다.

차이점은 오히려
C의 struct와 C++의 struct에서 발생합니다.
이 둘은 완전 다릅니다.

C의 struct를 C++의 struct로 해석해도 전혀 문제가 생기지 않을 뿐입니다.

물론 멤버함수를 가지고 있거나 상속을 한다거나 등등의 C++적인 struct를
C에서 돌리려 한다면 많은 문제가 생깁니다.(당연히 안됩니다.)

imyejin의 이미지

어쨌든 쀍플달성 ㅊㅋㅊㅋ

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

익명 사용자의 이미지

컴파일 된 후에는 명백히 구조체가 좀더(매우 미묘하게) 빠르지 않을까 생각합니다.
왜냐하면 구조체변수를 지역 변수로 사용할때는 단지 우리가 일반적으로 여러 지역변수를 사용할때와 같이 stack 에 연속적인 공간으로 사용할텐데

class 를 사용하게되면 정보가 좀 더 필요하거나 추가적으로 처리해야될 것들이 더 있지않나요? 우선 현재 함수의 스택 프레임에는 데이터가 저장되어있는 주소값이 저장되어있고(주소를 여러번 타고 들어가서 실제 값을 찾는지 어쩐지는 모르겠음) 실제 데이터는 현재 함수가 사용하고 있는 스택 공간이 아닌 다른 공간(그게 스택이 될지 아닐지는 잘 모르겠지만 어쨋든 같은공간은 아닐듯) 에 저장될 것 같은데요 ㅎㅎ

klyx의 이미지

> class 를 사용하게되면 정보가 좀 더 필요하거나 추가적으로 처리해야될 것들이 더 있지않나요?

없습니다. class와 struct의 차이는 기본 접근 제한자가 private냐 public이냐 이것뿐이고 이건 컴파일 타임에 전부 해결되는 문제이므로 실행 속도와는 전혀 관계 없습니다.

ifree의 이미지

구조체를 스택에 저장하는 언어는 C#이고, C++에서는 컴파일 된 이후에는 어떠한 차이도 없습니다.

페이지

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.