글
[C++] 참조 변수
Programming/C++ Language
2010. 7. 31. 17:22
참조 반환에 이어 참조 변수에 대해 알아보자.
참조 변수는 DataType& 를 이용하여 선언을 한다. 그리고, 어떤 변수의 참조를 가지도록 초기화할 때는 변수를 선언 할 때만 가능하다.
아래의 코드를 보고, 결과를 예상해 보자.
결과는 아래와 같다.( 상자 안을 마우스로 클릭하여 영역을 잡으면 보인다. )
결과 처럼, nRef = b 구문을 실행 할 떄는 nRef 가 b 변수를 참조 하는 것이 아니라, 이미 nRef 는 a 변수를 참조 하고 있으므로, b의 값을 a 에 대입을 하게 된다.
이러한 참조변수를 이용하여 Call by Reference 를 이용 할 수 있다. C에서는 Call by Reference 를 이용하기 위해서 포인터 변수를 사용했지만, C++ 에서는 대신에 참조변수를 이용하면 된다.
-> void Func( int& param1 ) {}
참조 변수는 DataType& 를 이용하여 선언을 한다. 그리고, 어떤 변수의 참조를 가지도록 초기화할 때는 변수를 선언 할 때만 가능하다.
아래의 코드를 보고, 결과를 예상해 보자.
int a = 10, b = 20;
int& nRef = a;
cout << "a is " << a << endl;
nRef = 100;
cout << "a is " << a << endl;
nRef = b;
cout << "a is " << a << endl;
cout << "b is " << b << endl;
int& nRef = a;
cout << "a is " << a << endl;
nRef = 100;
cout << "a is " << a << endl;
nRef = b;
cout << "a is " << a << endl;
cout << "b is " << b << endl;
결과는 아래와 같다.( 상자 안을 마우스로 클릭하여 영역을 잡으면 보인다. )
a is 10
a is 100
a is 20
b is 20
a is 100
a is 20
b is 20
결과 처럼, nRef = b 구문을 실행 할 떄는 nRef 가 b 변수를 참조 하는 것이 아니라, 이미 nRef 는 a 변수를 참조 하고 있으므로, b의 값을 a 에 대입을 하게 된다.
이러한 참조변수를 이용하여 Call by Reference 를 이용 할 수 있다. C에서는 Call by Reference 를 이용하기 위해서 포인터 변수를 사용했지만, C++ 에서는 대신에 참조변수를 이용하면 된다.
-> void Func( int& param1 ) {}
'Programming > C++ Language' 카테고리의 다른 글
[C++] 동적바인딩( Dynamic binding ) (0) | 2011.01.03 |
---|---|
[C++] this 포인터 사용하기 (0) | 2010.07.31 |
[C++] 참조 반환 (0) | 2010.07.31 |
[C++] 클래스 I (0) | 2010.07.21 |
[C++] C++상에서 발생하는 name mangling에 관한 내용 (0) | 2010.07.16 |
글
[C++] 참조 반환
Programming/C++ Language
2010. 7. 31. 16:54
C++ 의 문법 중의 하나인, 참조변수가 있다. 이를 잘못 사용하게 되면 객체지향의 규칙을 깨버릴 수 있다. 그리고, 컴파일 에러는 전혀 나지 않는다. 한번 살펴 보도록 하자.
Times.h
Times.cpp
위와 같이 Times 클래스가 선언이 되어 있고, GetHour 유틸리티 함수는 int형이 아니라 int& 즉, int 참조변수형을 리턴하고 있다.
이제, 아래의 Main 문을 보도록 하자. 세번의 출력 결과를 예상해 보자.
main.cpp
출력 결과는 아래와 같다..( 상자 안을 마우스로 클릭하여 영역을 잡으면 보인다. )
즉, 참조 변수 형으로 변수를 받게 되면 참조형 변수는 private, public 여부에 관계없이 변경을 할 수 있다. 물론 Get 함수에서 포인터로 변수의 주소를 넘겨줄 경우, 받는 쪽에서 private 이든, public 이든 관계없이 이를 변경 시킬수 있다. 클래스 캡슐화를 위반하는 문법을 사용 하는 것을 피하도록 하자.
값을 받아서 사용 할 때의 문법상의 차이점 말고는 실질적인 원리는 어떻게 다른지 잘 모르겠다. 알아봐야겠다. :)
Times.h
class CTimes
{
public:
CTimes( int = 0, int = 0, int = 0 );
~CTimes();
int& GetHour();
void Print();
private:
int hour;
int minute;
int second;
};
{
public:
CTimes( int = 0, int = 0, int = 0 );
~CTimes();
int& GetHour();
void Print();
private:
int hour;
int minute;
int second;
};
Times.cpp
int& CTimes::GetHour()
{
{
return hour;
}
void CTimes::Print()
{
void CTimes::Print()
{
cout << "hour is " << hour << endl;
}
위와 같이 Times 클래스가 선언이 되어 있고, GetHour 유틸리티 함수는 int형이 아니라 int& 즉, int 참조변수형을 리턴하고 있다.
이제, 아래의 Main 문을 보도록 하자. 세번의 출력 결과를 예상해 보자.
main.cpp
int main()
{
{
Ctimes time( 1, 2 );
time.Print();
int a = time.GetHour();
a = 5;
time.Print();
int& b = time.GetHour();
b = 10;
time.Print();
return 0;
time.Print();
int a = time.GetHour();
a = 5;
time.Print();
int& b = time.GetHour();
b = 10;
time.Print();
return 0;
}
출력 결과는 아래와 같다..( 상자 안을 마우스로 클릭하여 영역을 잡으면 보인다. )
hour is 1
hour is 1
hour is 10
hour is 1
hour is 10
즉, 참조 변수 형으로 변수를 받게 되면 참조형 변수는 private, public 여부에 관계없이 변경을 할 수 있다. 물론 Get 함수에서 포인터로 변수의 주소를 넘겨줄 경우, 받는 쪽에서 private 이든, public 이든 관계없이 이를 변경 시킬수 있다. 클래스 캡슐화를 위반하는 문법을 사용 하는 것을 피하도록 하자.
값을 받아서 사용 할 때의 문법상의 차이점 말고는 실질적인 원리는 어떻게 다른지 잘 모르겠다. 알아봐야겠다. :)
'Programming > C++ Language' 카테고리의 다른 글
[C++] this 포인터 사용하기 (0) | 2010.07.31 |
---|---|
[C++] 참조 변수 (1) | 2010.07.31 |
[C++] 클래스 I (0) | 2010.07.21 |
[C++] C++상에서 발생하는 name mangling에 관한 내용 (0) | 2010.07.16 |
[C++] Errors : cannot allocate an object of abstract type '???' (0) | 2010.06.14 |
글
[Wireshark] 필터링 방법 - Display Filter
Tools/Wireshark
2010. 7. 31. 16:27
display 필터는 캡쳐된 데이터에서 원하는 정보를 찾을 때 사용합니다.
display 필터의 검색 능력은 capture 필터 보다 더 뛰어납니다. 그리고 필터의 내용을 바꾸고 싶을 때 캡쳐 작업을 다시 시작하지 않아도 됩니다.
Syntax: | Protocol | . |
|
. |
|
|
|
|
| |||||
|
|
|
|
|
|
|
|

OSI layer 2에서 layer 7 사이에 있는 매우 다양한 프로토콜을 사용 할 수 있습니다. 그것들은 메인 화면에 보이는 "Expression..." 버튼을 클릭하면 볼 수 있습니다.


아래에 보이는 그림에서 간단한 설명과 함께 지원 가능한 프로토콜들을 확인 할 수 있습니다:


Wireshark 웹사이트에서 프로토콜과 그것의 하위 카테고리에 대한 설명을 제공하고 있습니다.]

각 프로토콜의 하위 프로토콜 카테고리.
그것을 보기 위해서, 프로토콜을 선택한 뒤 "+" 표시를 클릭하세요.


6개의 비교 연산자를 사용 할 수 있습니다:
영문 표기: | C언어 표기: | 의미: |
|
|
같다 |
|
|
틀리다 |
|
|
크다 |
|
|
작다 |
|
|
크거나 같다 |
|
|
작거나 같다 |

영문 표기: | C언어 표기: | 의미: |
|
|
논리곱 |
|
|
논리합 |
|
|
배타적 논리합 |
|
|
부정 |
다음의 display 필터를 이용하여 예시를 보여드리겠습니다:
"tcp.dstport 80 xor tcp.dstport 1025"
목적지가 TCP 포트 80이거나 출발지가 TCP 포트 1025인 (두 가지 모두인 경우는 제외하고) 패킷이 결과로 화면에 나타납니다.
사용 예:
snmp || dns || icmp | SNMP 혹은 DNS 혹은 ICMP 트래픽을 보여줍니다. |
ip.addr == 10.1.1.1 |
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6 |
다른 말로 하자면, 화면에 보여지는 패킷은 다음과 같을 것입니다:
출발지 IP 주소 : 10.1.2.3이 아닌 모든 주소, 목적지 IP 주소 : 10.1.2.3이 아닌 모든 주소
그리고
출발지 IP 주소 : 모든 주소, 목적지 IP 주소 : 10.4.5.6이 아닌 모든 주소
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6 |
다른 말로 하자면, 화면에 보여지는 패킷은 다음과 같을 것입니다:
출발지 IP 주소 : 10.1.2.3이 아닌 모든 주소, 그리고 목적지 IP 주소 : 10.4.5.6이 아닌 모든 주소
tcp.port == 25 | 출발지와 목적지의 TCP 포트가 25인 패킷을 보여줍니다. |
tcp.dstport == 25 | 목적지의 TCP 포트가 25인 패킷을 보여줍니다. |
tcp.flags | TCP 플래그를 가지고 있는 패킷을 보여줍니다. |
tcp.flags.syn == 0x02 | TCP SYN 플래그를 가지고 있는 패킷을 보여줍니다. |
![]() |
올바른 구문 |
![]() |
잘못된 구문 |
추가 ) http.request.method == "POST" 는 Http 중에 request method 가 POST 인 경우만 필터링을 해준다.
출처 : http://openmaniak.com/kr/wireshark_filters.php#display
'Tools > Wireshark' 카테고리의 다른 글
[Wireshark] 필터링 방법 - Capture Filter (0) | 2010.07.31 |
---|