출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/9


이번에는 STL은 무엇인가에 대해서 설명하겠습니다. STL은 C++ 표준에 정의된 표준 라이브러리 중 하나입니다. 라이브러리는 함수가 모여 만들어진 것이라고 생각해주시면 되겠습니다.

그럼 이 STL에는 어떤 것들이 있을까라고 하면, 리스트를 쉽게 만들 수 있습니다. 리스트는 메모리를 동적 확보하고, 각각 관련성을 갖게 하고, 연쇄 구조처럼 하나의 리스트를 만드는 느낌의 구조입니다.

예를 들면, A~C는 메모리를 확보했다면, A→B→C처럼 A, 다음은 B, 다음은 C 식으로 관련을 가지고 하나로 연결해주는 이미지입니다. C언언어만 한다고 생각하면 되는데, 동적 확보나 메모리의 해방 등의 수고가 걸려버립니다. 이 근처의 처리를 간략화 되어 간편하게 리스트 구조를 만들도록 한 라이브러리가 STL이라고 하는 것입니다. 그 라이브러리를 사용하려면 몇 가지 템플릿이라고 불리는 것을 사용합니다. 템플릿은 클래스와 비슷한 의미인데, 일반적인 학급을 그저 단순히 생각하면 처음부터 학급 안의 변수과 함수의 형태를 미리 지정해 내야죠? 그럼 이 템플릿을 사용하면 임의의 형식을 지정하여 인스턴스를 생성할 수 있습니다. 바로 형태만 있고 내용물을 여러가지 형태의 임의로 변경할 수 있는 템플릿이란 말 그대로요.


그 STL템플릿에 대해서는 자주 쓰이는 것이 다음과 같은 것들이 있습니다.


  • vector
  • list
  • deque
  • stack
  • queue
  • map
  • set

이런 것 들입니다. 이들은 데이터를 관리하는 템플릿이기 때문에 컨테이너라고도 불립니다.

다음에는 상기의 템플릿을 차례대로 해설하겠습니다.


'공부 > C/C++' 카테고리의 다른 글

(C++) 컨테이너【list】  (0) 2014.03.29
(C++) 컨테이너 【vector】  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 가상 함수  (0) 2014.03.26

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/8


이번에는 C++에서 새로 추가된 String 형식에 대해서 설명하겠습니다. String 형식이라고 했지만, 엄밀하게는 클래스입니다. String 형식을 사용하려면 "string”을 포함해야 합니다. 항상 어미에 붙였던 ".h"는 필요로 하지 않습니다. 뭐냐하면, C에서 귀찮았던 문자열 처리를 쉽게 해주는 것입니다. 예를 들어 C에서 초기 값 설정 이외의 때 배열에 문자열을 설정하려면


char test [10];

test = "가나다라마바사";


같이 직접 할당할 수 없습니다. (선언 시 초기 값으로 설정할 때 가능)

String 형식은 이것을 


string str;

str = "가나다라마바사";


와 같이 쉽게 설정할 수 있습니다. 또한 지금까지 처럼,


str[3] = 'd';


같은 key를 사용하여 각 요소에 개별적으로 액세스하여 할당할 수 있습니다. 또한 클래스이므로, 기본적으로 어떤 함수가 구현되어있습니다. 주로 쓰이는 것을 몇 가지 소개하겠습니다.

아래 코드를 봐주세요.


소스코드 보러가기[각주:1]




일부 기능이 있기 때문에 위에서 부터 보고 갑시다. 첫째, size 함수에서 이것은 문자 수를 돌려줍니다. str 변수에 들어있는 문자는 7문자이므로 7이 되돌아오고 있습니다. 같은 의미의 length 함수도 상관 없습니다.


그런 다음, empty 함수입니다만, 이것은 대상의 변수가 비어있는지 검사해줍니다. 빈 경우 0이 아닌 값을 반환합니다. 그게 아니라면 0을 반환하게 됩니다.


다음은 함수는 아니지만, string 함수는 그저 + 연산자로 덧셈하는 걸로도 문자의 연결이 가능합니다. 나중에 더한 것이 이전 변수 뒤에 문자가 들러붙습니다. 실행 결과를 보시면 알 수 있습니다.


그리고 substr 함수입니다. 이것은 첫 번째 인수에 숫자를 지정하면 전부터 센 문자 번호에서 뒤에 문자를 모두 출력해줍니다. 첫 번째 문자는 0 문자부터 시작됩니다. 이번에는 5로 지정하고 있으므로 F에서 표시되어 있습니다. 이 함수는 두 번째 인수에 추가 숫자를 지정하여 해당 위치에서 무슨 문자까지 꺼내기, 라는 것도 지정할 수 있습니다.


마지막으로, c_str 함수입니다. 이것은 string 형식에서 char 형식으로 변환 할 때 사용하는 함수입니다. string 형식은 유용하지만 char 형식과는 다르므로, char 형식을 사용하는 함수는 string 형식은 사용할 수 없습니다. 그래서 변환이 필요합니다. 이 c_str 함수를 실행하면 char 형식에 변환된 문자열의 포인터를 돌려줍니다. 위의 코드에서는 문자열을 계속 사용할 수 있도록 하기 위해, 미리 확보해놓은 char 형식 배열 test에 strcpy 함수를 사용하여 문자열을 복사합니다. (포인터 변수로 받아도 좋지만, 그 소스 영역은 string 형식이 손실된 때 소멸할 가능성이 있기 때문에 일부러 배열에 복사합니다.)

이 함수는 첫번째 인수 대상 포인터, 두 번째 인수에 문자 또는 문자열이 있는 포인터를 지정합니다. 그럼 char 형식으로 변환할 수 있기 때문에 평소 printf 함수로 표시하고 있습니다.


이상 string 형식의 설명입니다. char 형으로 변환만 조심하면 매우 편리해서 꼭 사용해보세요. 이외에도 많은 함수가 있기 때문에, 인터넷에서 검색하여 여러가지 조사해봅시다. 다음부터는 STL에 대해 설명해 가려고 합니다.

  1. 해당 코드는 티스토리 에디터 기능과 syntax highlighter 기능의 충돌로 정확히 표기되지 않아 링크로 대체합니다. [본문으로]

'공부 > C/C++' 카테고리의 다른 글

(C++) 컨테이너 【vector】  (0) 2014.03.27
(C++) STL에 대해서  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 가상 함수  (0) 2014.03.26
(C++) 클래스의 상속  (0) 2014.03.26

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/7


이번에는 C++ 문자열 출력에 대해 설명합니다. C에서 printf 함수와 puts 함수를 사용하여 문자열을 출력하고 있었습니다만, C++에서도 전용 함수가 있습니다.

다음 코드를 봐주세요.



#include 
#include 

int main(void)
{
	char test[30];

	std::cin >> test;

	printf("%s\n",test);

	std::cout << test << std::endl;
	
	return 0;
}



이렇게 하면, 문자의 입력을 요구하게 되므로 입력하면 해당 문자를 두 번 표시합니다. 이 코드 안의 std::cin이 입력 함수이고, std::cout가 출력 함수입니다. 또한 >>이 입력 연산자 <<이 출력 연산자라고 말합니다. 이 함수를 사용하기 위해서는 iostream을 포함(include) 해야 합니다. (.h 제외) 그럼 이 cin의 앞에 붙어있는 std::는 무엇일까요?

std는 네임 스페이스로, 그룹 조립을 위한 공간과 같은 것입니다. C++ 에서 전역 변수와 전역 함수는 같은 이름으로 정의할 수 없습니다. 하지만 이 네임 스페이스로 묶어주면, 그것을 제한하는 영역이 되므로 다른 곳에서도 같은 이름의 변수와 함수를 정의할 수 있습니다.

추가로 이번엔 cin이라는 함수가 std라는 네임 스페이스에 속해 있었습니다. 네임 스페이스에 속하는 함수는 콜론을 두 번(::) 쓰고 그 뒤에 함수 이름을 쓰는 것만으로도 액세스 할 수 있습니다. 그 cin과 함수와 함꼐 입력 연산자 >>를 쓰고, 오른쪽에 할당되는 변수를 써주고 있습니다. 마지막 std::endl이라고 써 있습니다만, 이것은 개행을 나타내는 것입니다. 이것을 쓰는 것만으로 줄 바꿈을 할당할 수 있습니다. 물론 출력 연산자도 필요합니다.


이것이 C++ 문자열 출력 방법입니다. 신경이 쓰인 사람도 있을 거라고 생각합니다만, std::는 매번 쓰기 귀찮지요? 이를 해소하는 방법이 있습니다. 글로벌 영역에

using namespace std;

라고 쓰는 것만으로도, std::cin라고 써야했던 함수를 cin로 쓸 수 있게 됩니다. 또한 cout, endl도 함꼐 쓸 필요가 없습니다. 만약 다른 함수에서 네임 스페이스 이름을 쓰는 것이 번거로우면, using namespace 네임_스페이스_이름;라고 쓰면 생략할 수 있습니다. 꼭 기억하시길 바랍니다.


이번은 여기까지.

다음은 string 형식에 대해 설명합니다.

'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) 가상 함수  (0) 2014.03.26
(C++) 클래스의 상속  (0) 2014.03.26
(C++) 클래스의 생성자와 소멸자  (0) 2014.03.26

(C++) 가상 함수

공부/C/C++2014. 3. 26. 22:44

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/6


이번에는 가상 함수에 대해 설명합니다. 가상 함수는 기본 클래스에 정의된 함수를 재정의 한 함수입니다. 즉 같은 이름의 함수라는 것입니다. 전회, 같은 이름의 함수를 정의하면 받는 포인터의 형식에 따라간다고 말했습니다만, 가상 함수로 만들어버리면 파생 클래스 작성시의 포인터를 기본 클래스의 포인터로 받은 경우에도 제대로 파생 클래스 측의 함수가 실행되게 됩니다.

우선 코드를 봐주세요.



//기본 클래스 TEST class TEST{ public: virtual void output(){ printf("TEST 클래스입니다. \n"); } }; //파생 클래스 SUPER class SUPER : public TEST{ public: void output(){ printf("SUPER 클래스입니다. \n"); } }; int main(void) { //파생 클래스 SUPER 포인터를 선언 TEST *test[2]; //ne를 사용해 동적 확보 test[0]=new TEST; test[1]=new SUPER; test[0]->output(); test[1]->output(); delete test[0]; delete test[1]; return 0; }



결과물은 아래와 같습니다.



코드를 보면 알 수 있듯이, 기본 클래스와 파생 클래스는 output이라는 같은 이름의 함수가 정의되어 있습니다. 그리고 기본 클래스의 함수 앞에 vitual라고 쓰여져 있습니다. 이것이 함수는 가상 함수 앞에 virtual이라고 쓰여있습니다. 이것이 이 함수는 가상 함수입니다, 라고 명시하는 것입니다.

그리고 main 함수를 보세요. TEST 클래스의 포인터를 배열로써 두 개 선언했지요? 그리고, 첫 번째 요소에 TEST 클래스의 인스턴스 포인터를 두 번째 요소에 SUPER 클래스의 인스턴스 포인터를 각각 할당하게 합니다.  가상 함수가 아닌 경우는 받는 포인터의 클래스에 따라 함수가 실행되고 있었습니다만, 이번은 다릅니다. 각 output 함수가 두 번째는 SUPER 클래스의 output 함수가실행되고 있는 것을 알 수 있죠? 이것이 가상함수의 구조입니다. 어떤 때에 사용하는 것인지 잘 모르는 사람도 많을 거라고 생각합니다. 저도 거의 사용한 적이 없구요. 단지 알고있는 것만으로도, 기본 클래스의 포인터만으로 각 파생 클래스 처리를 정리하여 흘릴 것입니다. 예를 들어, 이 기본 클래스를 바탕으로 많은 파생 클래스를 만들어야 한다면 어떻게 될까요?
만약 같은 이름의 함수를 함께 실행하고자 할 때, 각 클래스의 포인터를 선언하고 있으면 귀찮고, 코드 가독성도 떨어집니다. 그럴 때 가상 함수를 사용한다면 함꼐 관리할 수 있으므로 편리합니다. 만약 그런 상황이 발생하면 일단 가상 함수를 사용하여 보는 것은어떨까요?

다음은 C++ 문자열 출력에 대해 설명합니다.


'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 클래스의 상속  (0) 2014.03.26
(C++) 클래스의 생성자와 소멸자  (0) 2014.03.26

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/5


이번은 클래스의 상속에 대해서 설명합니다. 클래스의 상속은 클래스의 기능(변수나 함수)를 이어 받아 새로운 클래스를 만드는 것입니다. 상속 클래스의 것을 기초 클래스, 혹은 기본 클래스라고 하며, 상속된 클래스를 파생 클래스라고 합니다. 파생 클래스는 기본 클래스의 public, protected의 한정자가 지정된 변수와 함수를 이어 사용할 수 있습니다. pravte 한정자가 지정되어 있던 것은 그 클래스 내에서 밖에 액세스 할 수 없으므로, 파생 클래스에서 사용하는 것은 불가능합니다.

일단 코드를 먼저 봅시다.



//기본 클래스 TEST
class TEST{
private:
	int pv;
protected:
	int figure;
	TEST(){
		figure=10;
		pv=5;
	}
};

//파생 클래스 SUPER
class SUPER : public TEST{
private:
	int superfigure;
public:
	//생성자로 기본 클래스의 figure 변수를 superfigure에 할당한 후, 렌더링
	SUPER(void){
		superfigure=figure;
		printf("%d\n",superfigure);
	}
};

int main(void)
{
	//파생 클래스 SUPER 포인터를 선언
	SUPER *test;

	//new를 사용하여 동적 확보
	test=new SUPER;

	delete test;

	return 0;
}



위 예제는 "10"이 표시가 됩니다. 먼저 키본 클래스 TEST를 정의하고 있습니다. 이건 괜찮네요. 보셔야 할 것은 그 아래의 SUPER라는 클래스가 TEST 클래스를 상속한 파생 클래스입니다.

최종적인 작성 방법은


class 파생_클래스_명 :상속_한정자 기본_클래스_이름{


};


입니다. 여기에 쓰기 상속 한정자는 다음과 같은 의미가 있습니다.


  • public - 기본 클래스에서 설정한 액세스 한정자 설정을 그대로 이음.
  • protected - 기본 클래스에서 public이였던 것을 protected로 인계함. 다른 것들은 그대로.
  • private - 기본 클래스의 모든 멤버를 private로 인계.

public의 경우는 그대로 계승하므로 설명은 필요없다고 생각합니다만, protected나 private의 경우는 이해하실 수 있으려나요? 예를 들어, 상속 한정자를 pretected로 한정하는 경우 기본 클래스에서 public인 멤버가 파생 클래스에서는 protected로 취급 되기 때문에, 외부에서는 액세스할 수 없습니다.
마찬가지로 상속 한정자가 private인 경우, 당연히 외부에서 액세스 할 수 없게 되고, 클래스를 다시 상속하더라고 그 앞의 파생 클래스에서 액세스 할 수 없게 됩니다.
뭐, 앞으로 프로그래밍을 하는 데에 있어서 상속 한정자는 대부분 public을 사용할 것이라고 생각하니 그렇게 신경쓰지 않으셔도 될 겁니다. ^^

파생 클래스에서 사용할 변수와 함수는 기본 클래스의 액세스 한정자 proected 또는 public으로 정의한 것 뿐입니다. private로 설정하는 것은 파생 클래스에서 액세스(실행) 할 수 없기 때문에 주의해주세요. 덧붙여서 반대로는 할 수 없습니다.

즉, 기본 클래스에서 파생 클래스의 변수와 함수를 액세스 하는 것은 어떤 액세스 한정자도 불가능이라는 겁니다. 이제 상속 작성, 구조는 이해할 수 있나요?


그렇다면 코드의 자세한 설명으로 들어가겠습니다. 먼저 main 함수 super 클래스를 동적 확보합니다. 동적 확보 했을 때는 무엇이 실행되는지 기억하고 있나요? 네, 생성자입니다. 하지만 이번에는 상속된 클래스를 동적 확보하고 있습니다. 두 생성자가 실행되는 걸까요? 정답은 기본 클래스의 생성자가 실행된 후, 파생 클래스이 생성자가 실행되는 것입니다.

그래서 이번 처리의 흐름은 이렇게 되어있습니다.


[1] new로 SUPER 클래스를 동적 확보

[2] 기본 클래스 TEST의 생성자가 실행 (figure = 10, pv = 5로 설정된다.)

[3] 파생 클래스 super 생성자가 실행된다 (기본 클래스 figure 변수를 대입하며 printf로 표시)


이런 흐름에서 10이라는 숫자가 표시되어지는군요. 이해할 수 있으셨나요? 덧붙여서, 동적 확보한다는 것은 외부에서 액세스 할 수 있다는 것이므로, 기본 클래스와 파생 클래스 생성자의 액세스 한정자는 public이여야 합니다.


그럼 추가로 소멸자의 경우는, 생성와 역순으로 실행됩니다. 즉, 파생 클래스 → 기본 클래스의 순서대로 실행됩니다.


또한 이번에는 파생 클래스의 인스턴스를 생성 (동적 확보) 한 떄에는, SUPER 클래스의 포인터에서 포인터로 받았지만, SUPER 클래스는 TEST 클래스를 상속하고 있기 때문에, TEST 클래스의 포인터로 해당 동적 확보를 한 포인터를 받을 수 있습니다.

그러니까,


TEST *test;

test = new SUPER;


로 작성하는 것도 가능하다는 것이죠. 이후 동일하게 실행됩니다. 하나 쯤 다른 것이라면 기본 클래스와 파생 클래스에서 동일한 함수 이름을 정의하고 실행한 경우입니다. 이 경우는 받는 포인터의 클래스에 따라 실행됩니다.

즉,

TEST *test;

test = new SUPER;

라고 한 경우, TEST 클래스(기본 클래스) 측의 함수가 실행됩니다. SUPER *test라고 하면 파생 클래스 측의 함수가 실행됩니다. 동일한 함수 이름을 정의할 때 이러한 차이에 유의하시길 바랍니다. 그 밖에는 무슨 의미가 있지? 라고 의아해 하는 분도 있을지 모르겠습니다만, 이것은 나중에 공부할 가상 함수라고 합니다. 꼭 기억해두세요.


이번 시간은 여기까지 입니다. 다음 시간은 가상 함수에 대해 설명합니다.

'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 가상 함수  (0) 2014.03.26
(C++) 클래스의 생성자와 소멸자  (0) 2014.03.26

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/4


이번에는 생성자와 소멸자에 대해 설명합니다. 먼저 생성자에 대해서입니다. 생성자는 클래스를 동적 확보 (인스턴스 생성) 할 때, 

실행되는 함수입니다. 일반 함수와 다른 것으로 하면, 반환 값을 돌려 줄 수 없는 것입니다. 그리고, 함수 이름이 클래스 이름과 동일하게 될 것입니다 

아래의 코드를 봐주세요.



class TEST{
public:
	int figure;
	TEST(int temp){
		figure=temp;
	}
};

int main(void)
{
	//클래스 TEST 포인터를 선언
	TEST *test;

	//new를 사용하여 동적 확보
	test=new TEST(50);

	printf("%d\n",test->figure);
	
	delete test;

	return 0;
}



이렇게 하면 50이 표시됩니다. TEST 함수가 있다고 생각합니다만, 이것이 생성자입니다. 생성자는 무조건 클래스 이름과 동일해야 합니다. 그리고 반환 값을 돌려받지 않기 때문에 반환 장소에는 아무것도 쓰여있지 않지요? 그것 이외엔 일반 함수입니다.


그럼 이제 생성자는 어떻게 실행되는지 살펴보니, new로 동적 할당된 때입니다. 만약 인수를 설정한 경우는 위와 같이 TEST(50)이라고 씁니다. 이제 생성자에 50이라는 값을 전달한다는 의미입니다.


위의 코드는 생성자의 처리에서 전달된 인수를 클래스 내의 figure 변수에 할당시킵니다. 그런 다음 main 함수 내의 printf 함수에서 그 변수에 액세스하여 표시하고 있습니다. 제대로 50으로 표시되어있기 때문에, 생성자가 작동하고 있다는 것을 알 수 있다고 생각합니다.


그런 다음 소멸자에 대해서입니다만, 생성자가 new로 동적 확보되었을 때 실행되고 있던 것에 반해, 반대로 소멸자는 메모리에서 지워졌을 때 실행됩니다.

아래 코드를 봐주세요.



class TEST{
public:
	int figure;
	TEST(int temp){
		figure=temp;
	}
	~TEST(){
		printf("소멸자 실행\n");
	}
};

int main(void)
{
	//클래스 TEST 포인터를 선언
	TEST *test;

	//new를 사용하여 동적 확보
	test=new TEST(50);

	printf("%d\n",test->figure);

	delete test;

	return 0;
}



이렇게 하면 50, 그리고 "소멸자 실행"으로 표시됩니다. 소멸자 작성 방법은, 클래스 이름 앞에 물결표(~)를 붙이는 것 뿐입니다. 생성자 처럼 반환 값을 반환할 수 없으며, 물결표 뒤에 클래스 이름과 동일해야 합니다. 즉, delete 함수가 실행되었을 떄입니다.


생성자는 클래스 내부의 변수 값을 초기화 하는 등, 용도가 상당히 많겠는데, 소멸자는 사용할 수 있는걸까? 라고 생각하는 사람도 많겠다고 생각합니다. 저도 처음에는 사용하지 않았지만, 대규모 프로그램을 짤만한 실력이 된다면, 클래스 내부에서 메모리의 동적 확보를 하게 됩니다. 그때의 삭제 처리를 하기 위해 소멸자를 자주 쓰게 됩니다.


별도로 이 함수는 절대 사용하지 않으면 안 되는 것은 아닙니다. 하지만 기억해두면 편리해서 잘 기억해둡시다.


다음은 클래스의 상속에 대해서 설명합니다.

'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 가상 함수  (0) 2014.03.26
(C++) 클래스의 상속  (0) 2014.03.26

본문 내용을 그대로 싣는 건 염치없는 짓이라고 생각해서 간단하게 적는다.


터미널에서 정수를 입력 받아 그 수를 각각 영단어로 배열(one, two, three… zero ) 하라~인데. 책 내용에도 써져있지만 머리를 엄청 쓰게 만들었다.


처음 볼 때는 각 숫자에 대한 값에 단어를 넣어주고 scanf로 정수 값을 입력 받아서 if 문으로 말해주면 되나? 라고 생각했지만, 조금만 더 생각해봐도 알 수 있듯, %d에 2자리 수 이상을 입력해버리면 말짱 꽝이였다.


하여튼 지금 생각나는 건 전부 효율성 없는 쌩 노가다 작업 뿐이다. 선생님께 질문했으니 곧 답을 알려주시지 않을까?

출저: http://www.xpressengine.com/userForum/21620074


/config/func.inc.php에서


if($_SERVER['REQUEST_METHOD'] != 'POST')

{

return FALSE;

}


$defaultUrl = Context::getDefaultUrl();

$referer = parse_url($_SERVER["HTTP_REFERER"]);


$oModuleModel = getModel('module');

$siteModuleInfo = $oModuleModel->getDefaultMid();


if($siteModuleInfo->site_srl == 0)

{

if(!strstr(strtolower($defaultUrl), strtolower($referer['host'])))

{

return FALSE;

}

}

else

{

$virtualSiteInfo = $oModuleModel->getSiteInfo($siteModuleInfo->site_srl);

if(strtolower($virtualSiteInfo->domain) != strtolower(Context::get('vid')) && !strstr(strtolower($virtualSiteInfo->domain), strtolower($referer['host'])))

{

return FALSE;

}

}


부분을 지우면 된다. 유효성 검사를 하지 않게 되니 스팸에 위험성이 있어 권한 설정을 잘 해야 한다고...