전체 페이지뷰
2015년 3월 4일 수요일
2015년 1월 28일 수요일
[생각] 평면과 점
평면과 점
3차원 좌표상에 4개의 점이 있다. 이들 점이 한 평면상에 위치하는지 여부를 판단하는 프로그램을 작성한다.
입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다. 다음 줄부터는 한줄씩 점의 좌표를 네번 입력받는다.
점의 좌표는 정수이며 x, y, z의 순서이다.
이를 테스트 케이스 T만큼 반복한다.
출력
각각의 테스트 케이스에 대해서 4점이 한평면에 위치하면 YES를 그렇지 않으면 NO를 출력한다.
한줄에 하나씩 출력
입력 제한
1 <= T <= 10^4
-10^3 <= x, y, z <= 10^3
입력 예제 #1
1
1 2 0
2 3 0
4 0 0
0 0 0
출력 예제 #1
YES
예제 설명 #1
4개의 점 모두 z좌표값이 0이다. 따라서 같은 평면에 있고 출력값은 YES이다.
3차원 좌표상에 4개의 점이 있다. 이들 점이 한 평면상에 위치하는지 여부를 판단하는 프로그램을 작성한다.
입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다. 다음 줄부터는 한줄씩 점의 좌표를 네번 입력받는다.
점의 좌표는 정수이며 x, y, z의 순서이다.
이를 테스트 케이스 T만큼 반복한다.
출력
각각의 테스트 케이스에 대해서 4점이 한평면에 위치하면 YES를 그렇지 않으면 NO를 출력한다.
한줄에 하나씩 출력
입력 제한
1 <= T <= 10^4
-10^3 <= x, y, z <= 10^3
입력 예제 #1
1
1 2 0
2 3 0
4 0 0
0 0 0
출력 예제 #1
YES
예제 설명 #1
4개의 점 모두 z좌표값이 0이다. 따라서 같은 평면에 있고 출력값은 YES이다.
[생각] 더큰문자열 찾기
더 큰 문자열 찾기
알파벳 소문자로만 이루어진 문자열 w가 있다. w의 문자들을 재 조합해서 또다른 문자열 s를 만드는데 s는 w보다 그 크기가 크다.
(크기가 크다는 것은 사전 편찬 식으로 정렬했을 때 s가 w보다 뒤에 위치하게 된다는 의미이다.)
입력
첫출에 테스트할 횟수 t를 입력받는다.
그 다음 줄 부터 문자열 w를 입력받는다.
출력
각각의 테스트 케이스에 대해서 s를 출력한다. s가 여러개일 경우 그 중 가장 작은 것을 출력한다.
답이 존재하지 않으면 "no answer"를 출력한다.
제한
1 <= t <= 10^5
1 <= (w의 길이) <= 100
w는 알파벳 소문자로만 이루어져있으며, 길이가 100을 초과하지 않는다.
입력 예제 #1
3
ab
bb
hefg
출력 예제 #1
ba
no answer
hegf
입력 예제 #2
15
zedawdvyyfumwpupuinbdbfndyehircmylbaowuptgmw
zyyxwwtrrnmlggfeb
ocsmerkgidvddsazqxjbqlrrxcotrnfvtnlutlfcafdlwiismslaytqdbvlmcpapfbmzxmftrkkqvkpflxpezzapllerxyzlcf
biehzcmjckznhwrfgglverxsezxuqpj
rebjvsszebhehuojrkkhszxltyqfdvayusylgmgkdivzlpmmtvbsavxvydldmsym
unpzhmbgrrs
jprfovzkdlmdcesdcpdchcwoedjchcovklhrhlzfeeptoewcqpxg
ywsfmynmiylcjgrfrrmtyeeykffzkuphpajndwxjteyjba
dkuashjzsdq
gwakhcpkolybihkmxyecrdhsvycjrljajlmlqgpcnmvvkjlkvdowzdfikh
nebsajjbbuifimjpdcqfygeitief
qetpicxagjkydehfnvfxrtigljlheulcsfidjjozbsnomygqbcmpffwswptbgkzrbgqwnczrcfynjmhebfbgseuhckbt..
알파벳 소문자로만 이루어진 문자열 w가 있다. w의 문자들을 재 조합해서 또다른 문자열 s를 만드는데 s는 w보다 그 크기가 크다.
(크기가 크다는 것은 사전 편찬 식으로 정렬했을 때 s가 w보다 뒤에 위치하게 된다는 의미이다.)
입력
첫출에 테스트할 횟수 t를 입력받는다.
그 다음 줄 부터 문자열 w를 입력받는다.
출력
각각의 테스트 케이스에 대해서 s를 출력한다. s가 여러개일 경우 그 중 가장 작은 것을 출력한다.
답이 존재하지 않으면 "no answer"를 출력한다.
제한
1 <= t <= 10^5
1 <= (w의 길이) <= 100
w는 알파벳 소문자로만 이루어져있으며, 길이가 100을 초과하지 않는다.
입력 예제 #1
3
ab
bb
hefg
출력 예제 #1
ba
no answer
hegf
입력 예제 #2
15
zedawdvyyfumwpupuinbdbfndyehircmylbaowuptgmw
zyyxwwtrrnmlggfeb
ocsmerkgidvddsazqxjbqlrrxcotrnfvtnlutlfcafdlwiismslaytqdbvlmcpapfbmzxmftrkkqvkpflxpezzapllerxyzlcf
biehzcmjckznhwrfgglverxsezxuqpj
rebjvsszebhehuojrkkhszxltyqfdvayusylgmgkdivzlpmmtvbsavxvydldmsym
unpzhmbgrrs
jprfovzkdlmdcesdcpdchcwoedjchcovklhrhlzfeeptoewcqpxg
ywsfmynmiylcjgrfrrmtyeeykffzkuphpajndwxjteyjba
dkuashjzsdq
gwakhcpkolybihkmxyecrdhsvycjrljajlmlqgpcnmvvkjlkvdowzdfikh
nebsajjbbuifimjpdcqfygeitief
qetpicxagjkydehfnvfxrtigljlheulcsfidjjozbsnomygqbcmpffwswptbgkzrbgqwnczrcfynjmhebfbgseuhckbt..
[생각] 주식투자
주식 투자
당신은 오늘 부터 N일(DAY) 동안의 삼성전자 주가를 예측할 수있는 알고리즘을 개발했다(와우~!!!).
다만 현재 예산으로는 N일 동안 각각의 날에 다음의 액션중 하나만을 취할 수 있다.
1) 어떤 날은 삼성전자 주식 1주를 살 수 있다.
2) 어떤 날은 가지고 있는 주식 중 일부 혹은 전부를 팔 수 있다
3) 어떤 날은 아무런 액션을 취하지 않을 수도 있다.
N일 뒤에 최고의 수익을 남기기 위해서는 어떠한 전략을 수행해야 하는가?
입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다.
다음에는 숫자 N을 입력한다.
그 다음 줄에는 N일 동안 예측한 주식의 가격을 입력한다. (모두 정수, 스페이스로 구분)
이것을 T만큼 반복한다.
출력
각각의 테스트 케이스에 대해서 최고로 얻을 수 있는 수익을 출력한다.
제한
1 <= T <= 10
1 <= N <= 50000
입력 예제 #1
3
3
5 3 2
3
1 2 100
4
1 3 1 2
출력 예제 #1
0
197
3
예제 설명 #1
첫번째 테스트 케이스
주가가 5 > 3 > 2로 떨어지기만 한다. 이래서는 수익을 낼수가 없다.
두번째 테스트 케이스
1일과 2일에는 1주씩 구매한다. 3일때 모든 주식을 판매한다.
세번째 테스트 케이스
1일째 1주를 구매하고 2일째 이 것을 판매한다. 3일째 다시 1주를 구매하고 4일째 판매한다.
당신은 오늘 부터 N일(DAY) 동안의 삼성전자 주가를 예측할 수있는 알고리즘을 개발했다(와우~!!!).
다만 현재 예산으로는 N일 동안 각각의 날에 다음의 액션중 하나만을 취할 수 있다.
1) 어떤 날은 삼성전자 주식 1주를 살 수 있다.
2) 어떤 날은 가지고 있는 주식 중 일부 혹은 전부를 팔 수 있다
3) 어떤 날은 아무런 액션을 취하지 않을 수도 있다.
N일 뒤에 최고의 수익을 남기기 위해서는 어떠한 전략을 수행해야 하는가?
입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다.
다음에는 숫자 N을 입력한다.
그 다음 줄에는 N일 동안 예측한 주식의 가격을 입력한다. (모두 정수, 스페이스로 구분)
이것을 T만큼 반복한다.
출력
각각의 테스트 케이스에 대해서 최고로 얻을 수 있는 수익을 출력한다.
제한
1 <= T <= 10
1 <= N <= 50000
입력 예제 #1
3
3
5 3 2
3
1 2 100
4
1 3 1 2
출력 예제 #1
0
197
3
예제 설명 #1
첫번째 테스트 케이스
주가가 5 > 3 > 2로 떨어지기만 한다. 이래서는 수익을 낼수가 없다.
두번째 테스트 케이스
1일과 2일에는 1주씩 구매한다. 3일때 모든 주식을 판매한다.
세번째 테스트 케이스
1일째 1주를 구매하고 2일째 이 것을 판매한다. 3일째 다시 1주를 구매하고 4일째 판매한다.
[생각] 9와 0
9와 0
숫자 0과 9로만 이루어진 0 이상의 정수 X가 있다. (ex: 90, 9990, 9009009)
0이상의 정수 N이 주어졌을 때 X중 N의 배수이면서 가장 작은 수를 구하는 프로그램을 작성하시요.
입력
첫줄에 테스트 케이스 T를 입력 받는다. 다음 줄 부터 T줄만큼 N을 입력받는다.
출력
각각의 테스트 케이스에 대해서 조건 만족하는 수 X를 한줄에 하나씩 출력한다. 단 숫자 앞에 0이 와서는 안된다.
(ex: 00999 > 999로 출력할 것)
제한
1 <= T <= 104
1 <= N <= 500
입력 예제 #1
3
5
7
1
출력 예제 #1
90
9009
9
예제 설명 #1
첫번째 테스트 케이스 : 5의 배수이면서 9와 0으로만 이루어진 가장 작은 수는 90이다.
숫자 0과 9로만 이루어진 0 이상의 정수 X가 있다. (ex: 90, 9990, 9009009)
0이상의 정수 N이 주어졌을 때 X중 N의 배수이면서 가장 작은 수를 구하는 프로그램을 작성하시요.
입력
첫줄에 테스트 케이스 T를 입력 받는다. 다음 줄 부터 T줄만큼 N을 입력받는다.
출력
각각의 테스트 케이스에 대해서 조건 만족하는 수 X를 한줄에 하나씩 출력한다. 단 숫자 앞에 0이 와서는 안된다.
(ex: 00999 > 999로 출력할 것)
제한
1 <= T <= 104
1 <= N <= 500
입력 예제 #1
3
5
7
1
출력 예제 #1
90
9009
9
예제 설명 #1
첫번째 테스트 케이스 : 5의 배수이면서 9와 0으로만 이루어진 가장 작은 수는 90이다.
[생각] 정수트리플
정수 트리플 (Triples)
정수 배열 d가 있다.
다음을 만족하는 트리플의 수를 구하라
d[i] < d[j] < d[k], i < j < k
입력
첫째 줄에 배열의 크기 N을 입력바는다.
두번째 줄에는 N개의 정수를 입력받는다. (스페이스로 구분)
출력
문제의 조건을 만족하는 트리플의 수를 출력한다.
제한
N <= 10^5
배열에 속한 모든 정수값은 0보다 크고 2^16 - 1 보다 작다.
예제 입력 #1
6
1 1 2 2 3 4
예제 출력 #1
4
예제 설명 #1
조건을 만족하는 트리플은 다음과 갔다.
(1,2,3)
(1,2,4)
(1,3,4)
(2,3,4)
정수 배열 d가 있다.
다음을 만족하는 트리플의 수를 구하라
d[i] < d[j] < d[k], i < j < k
입력
첫째 줄에 배열의 크기 N을 입력바는다.
두번째 줄에는 N개의 정수를 입력받는다. (스페이스로 구분)
출력
문제의 조건을 만족하는 트리플의 수를 출력한다.
제한
N <= 10^5
배열에 속한 모든 정수값은 0보다 크고 2^16 - 1 보다 작다.
예제 입력 #1
6
1 1 2 2 3 4
예제 출력 #1
4
예제 설명 #1
조건을 만족하는 트리플은 다음과 갔다.
(1,2,3)
(1,2,4)
(1,3,4)
(2,3,4)
[생각] 배열의 무게 중심
배열의 무게 중심
[A1][A2]....[An]으로 이루어진 배열이 있다. 이 배열에서 다음의 조건을 만족하는 요소 Ai가 있는지 검사하는 프로그램을 작성하시오
1. Ai의 왼쪽에 있는 요소들의 합과 오른쪽에 있는 요소들의 합이 동일하다.
2. 왼쪽이나 오른쪽에 요소가 없다면 (A1이거나 An이라면) 합은 0으로 간주한다.
즉 [A1] + [A2].... [Ai-1] = [Ai+1] + [Ai+2] + [An]
입력
첫 번째 줄에 테스트 케이스의 수를 입력한다.
각 테스트 케이스에서 첫번째 줄은 배열의 크기 N을 그 다음 줄은 스페이스로 구분한 배열의 요소들을 입력받는다.
출력
각각의 테스트 케이스에 대해서 Ai가 존재하면 YES를 그렇지 않으면 No를 출력한다.
입력 예제 #1
2
3
1 2 3
4
1 2 3 3
출력 예제 #1
NO
YES
예제 설명 #1
첫번째 케이스에서는 만족하는 것을 찾을 수 없다.
두번째 케이스에서는 A[1] + A[2] = A[4]이다.
가산점
처리 속도를 향상시키면 가산점
[A1][A2]....[An]으로 이루어진 배열이 있다. 이 배열에서 다음의 조건을 만족하는 요소 Ai가 있는지 검사하는 프로그램을 작성하시오
1. Ai의 왼쪽에 있는 요소들의 합과 오른쪽에 있는 요소들의 합이 동일하다.
2. 왼쪽이나 오른쪽에 요소가 없다면 (A1이거나 An이라면) 합은 0으로 간주한다.
즉 [A1] + [A2].... [Ai-1] = [Ai+1] + [Ai+2] + [An]
입력
첫 번째 줄에 테스트 케이스의 수를 입력한다.
각 테스트 케이스에서 첫번째 줄은 배열의 크기 N을 그 다음 줄은 스페이스로 구분한 배열의 요소들을 입력받는다.
출력
각각의 테스트 케이스에 대해서 Ai가 존재하면 YES를 그렇지 않으면 No를 출력한다.
입력 예제 #1
2
3
1 2 3
4
1 2 3 3
출력 예제 #1
NO
YES
예제 설명 #1
첫번째 케이스에서는 만족하는 것을 찾을 수 없다.
두번째 케이스에서는 A[1] + A[2] = A[4]이다.
가산점
처리 속도를 향상시키면 가산점
[생각] 정수쌍
정수쌍(Pairs)
N개의 정수가 주어졌을 때 그 차가 K인 정수 쌍의 수를 구하시오
입력
첫째 줄에 N, K를 입력받는다. (스페이스로 구분)
두번째 줄부터 N개의 정수를 입력받는다. 단, 모든 정수는 그 값이 서로 달라야 한다. (스페이스로 구분)
출력
차가 K인 정수 쌍의 수를 출력한다.
제한
N <= 10^5
0 < K < 10^9
각 정수는 0보다 크고 2^31 - 1 보다 작다.
예제 입력 #1
5 2
1 5 3 4 2
예제 출력 #1
3
예제 입력 #2
10 1
363374326 364147530 61825163 1073065718 1281246024 1399469912 428047635 491595254 879792181 1069262793
예제 출력 #2
0
가산점
N개의 정수를 입력받았을 때 각각의 차가 K인것을 체크하려면 N^2의 비교가 필요하고 N이 커질수록 처리속도가 급격히 증가하게 된다.
이를 해결하기 위해 Time Complecity가 O(N log N)이거나 이보다 효율적으로 구현하도록 구현 하면 가산점 추가됨.
N개의 정수가 주어졌을 때 그 차가 K인 정수 쌍의 수를 구하시오
입력
첫째 줄에 N, K를 입력받는다. (스페이스로 구분)
두번째 줄부터 N개의 정수를 입력받는다. 단, 모든 정수는 그 값이 서로 달라야 한다. (스페이스로 구분)
출력
차가 K인 정수 쌍의 수를 출력한다.
제한
N <= 10^5
0 < K < 10^9
각 정수는 0보다 크고 2^31 - 1 보다 작다.
예제 입력 #1
5 2
1 5 3 4 2
예제 출력 #1
3
예제 입력 #2
10 1
363374326 364147530 61825163 1073065718 1281246024 1399469912 428047635 491595254 879792181 1069262793
예제 출력 #2
0
가산점
N개의 정수를 입력받았을 때 각각의 차가 K인것을 체크하려면 N^2의 비교가 필요하고 N이 커질수록 처리속도가 급격히 증가하게 된다.
이를 해결하기 위해 Time Complecity가 O(N log N)이거나 이보다 효율적으로 구현하도록 구현 하면 가산점 추가됨.
[생각] 막대자르기
막대기 자르기
각각 0이상의 정수를 길이로 하는 N개의 막대기가 있다. 이 막대기들 중 가장 짧은 막대기의 길이로 모든 막대기를 자르는 것을 [cut operation]이라고 하자.
예를 들어 6개의 막대기가 있고 그 길이가 다음과 같다면
5 4 4 2 2 8
이 경우 [Cut Operation]을 한번 수행하면 다음과 같다.
3 2 2 6
(가장 짧은 길이인 2로 6개의 막대기를 잘라내고 길이가 0이 되버린 2개의 막대기는 버려진다.)
N개의 막대기와 그 각각의 길이가 주어졌을 때 [Cut Operation]을 모든 막대기가 버려질 때(길이가 0이 될때)까지 반복하고 수행 시 마다 남은 막대기의 수를 출력하는 프로그램을 작성하라.
입력
첫줄에 막대기의 수 N을, 다음 줄에 각각의 막대기의 길이를 공백으로 구분해서 입력한다.
출력
매 줄마다 [Cut Operation]이 수행 되 때 마다 남은 막대기의 수를 출력
제한
1 <= N <= 1000
1 <= 막대기의 길이 <= 1000
입력 예제 #1
6
5 4 4 2 2 8
출력 예제 #1
6
4
2
1
입력 예제 #2
8
1 2 3 4 3 3 2 1
출력 예제 #2
8
6
4
1
각각 0이상의 정수를 길이로 하는 N개의 막대기가 있다. 이 막대기들 중 가장 짧은 막대기의 길이로 모든 막대기를 자르는 것을 [cut operation]이라고 하자.
예를 들어 6개의 막대기가 있고 그 길이가 다음과 같다면
5 4 4 2 2 8
이 경우 [Cut Operation]을 한번 수행하면 다음과 같다.
3 2 2 6
(가장 짧은 길이인 2로 6개의 막대기를 잘라내고 길이가 0이 되버린 2개의 막대기는 버려진다.)
N개의 막대기와 그 각각의 길이가 주어졌을 때 [Cut Operation]을 모든 막대기가 버려질 때(길이가 0이 될때)까지 반복하고 수행 시 마다 남은 막대기의 수를 출력하는 프로그램을 작성하라.
입력
첫줄에 막대기의 수 N을, 다음 줄에 각각의 막대기의 길이를 공백으로 구분해서 입력한다.
출력
매 줄마다 [Cut Operation]이 수행 되 때 마다 남은 막대기의 수를 출력
제한
1 <= N <= 1000
1 <= 막대기의 길이 <= 1000
입력 예제 #1
6
5 4 4 2 2 8
출력 예제 #1
6
4
2
1
입력 예제 #2
8
1 2 3 4 3 3 2 1
출력 예제 #2
8
6
4
1
2015년 1월 21일 수요일
fflush 함수의 올바른 사용방법
네트워크 프로그래밍에서 많이 다루게되는
문자열 처리에 도움이된다.
http://june0313.blog.me/50160420040
차후에 정리. 참고.
문자열 처리에 도움이된다.
http://june0313.blog.me/50160420040
차후에 정리. 참고.
2015년 1월 20일 화요일
2015년 1월 7일 수요일
TCP/IP 패킷 송수신 처리에 대하여
<TCP/IP 패킷 송신처리>
① 어플리케이션의 처리(Application Layer)
메일의 송신을 예로 들면, 메일 어플리케이션 프로그램을 작동시켜 '안녕하세요'라는
텍스트를 입력한다. 그리고 메일송신 버튼을 누르면 Presentation Layer에서 부호화 처리를
한다. 변환후메일을 송신하는데, 소프트웨어에 따라서 메일을 한꺼번에 송신할지를
결정하는 기능이 있다. 이러한 통신의 커넥션을 언제 확립하여 언제 전송할지의 기능은
Session Layer에서 관리한다.
② TCP 모듈의 처리(Transport Layer)
TCP는 어플리케이션의 지시에 의해 접속의 확립, 데이터의 송신, 접속의 절단 등의
기능을 하는데, 송신하는 데이터에 대한 신뢰성을 제공한다.
TCP 기능을 실현하기 위해 TCP의 헤더를 붙여서 보낸다. 헤더에는 포트번호, 시퀸스번호,
체크섬 등이 포함되어, 데이터와 함꼐 IP로 보내진다.
- 포트번호 : 송신호스트와 수신호스트의 어플리케이션을 식별하기 위한 번호
- 시퀸스번호 : 그 패킷의 데이터가 몇바이트째의 데이터인지를 나타내는 번호
- 체크섬 : 데이터가 파괴되어 있지 않았다는 걸 증명하기 위한 정보
③ IP 모듈의 처리(Internet Layer)
TCP에서 넘겨진 TCP헤더와 데이터를 하나의 데이터로 다루며, 데이터에 IP헤더가
붙여진다. IP 헤더에는 수신처와 송신처의 논리적인 주소가 붙으며, 다음으로는 TCP인지
UDP인지를 표시하는 정보가 포함된다. 패킷이 완성되면 라우팅 테이블을 참조하여
다음으로 패킷을 넘길 라우터나 호스트를 결정한다. 그리고 목적지의 NIC에 패킷을 넘겨
실제로 전송처리가 이루어진다.
통신할 상대의 MAC Address를 모를 경우, ARP(Address Resolution Porotocol)를
이용하여 목적지의 MAC Address를 구한 후 송신한다.
④ 네트워크 인터페이스의 처리(Network Access Layer)
IP 패킷을 단순한 데이터로 취급하여, 이 데이터에 이더넷 헤더를 부가한다.
이더넷 헤더에는 송ㆍ수신지의 MAC Address, 이더넷헤더에 이어지는 데이터의
프로토콜을 나타내는 이더넷 타입이 기록된다. 이상의 처리후 물리층을 통해 송신되는데,
송신 처리중에 FCS(Frame Check Sequence)가 하드웨어적으로 계산되어 프레임 끝에
붙게 되며, 이는 데이터가 파괴된 것을 검출하기 위한 것이다.
<TCP/IP 패킷 수신처리>
① 네트워크 인터페이스의 처리(Network Access Layer)
데이터를 받은 호스트는 수신처 MAC Address가 자신과 일치하는 아닌지를 검사후,
자신이 아니라면 프레임을 버린다. 다음으로 이더넷 타입 필드를 살펴서, 일치하는
프로토콜을 처리하는 루틴에 데이터를 넘긴다. IP이면 IP를 처리하는 루틴으로 보내지고,
ARP면 ARP를 처리하는 루틴으로 넘기게 된다. 만일 일치하는 프로토콜 처리 루틴이
없다면 프레임을 버리게 된다.
② IP 모듈의 처리(Internet Layer)
IP의 루틴에 데이터가 넘겨지면, 수신 IP 주소가 자기 호스트의 IP주소이면 수신하고,
상위 프로토콜을 살펴 TCP이면 TCP 처리 루틴으로, UDP면 UDP 처리 루틴으로 보낸다.
라우터의 경우 수신하는 패킷의 IP 주소가 거의 자기앞이 아니므로 라우팅 테이블과
비교하여 다음에 보내게 되는 호스트나 라우터를 살펴 전송하게 된다.
③ TCP 모듈의 처리(Transport Layer)
CheckSum을 살펴 데이터가 파괴되어 있지 않다는 것을 확인한 후, 데이터를 차례대로
수신하고 있는지를 확인한다. 또 포트번호를 확인하여 통신을 하고 있는 어플리케이션을
지정한다. 데이터가 제대로 도착한 경우 송신 호스트에 데이터가 도착했다는 '확인응답'을
보내고, 송신 호스트에서 확인응답을 받지 못할 경우, 받을 수 있을때까지 계속 보내게
된다. 데이터를 올바르게 수신한 경우 포트번호로 식별한 어플리케이션 프로그램에
데이터가 그대로 넘겨진다.
④ 어플리케이션의 처리(Application Layer)
송신측에서 보낸 데이터를 그대로 받게 된다. 데이터를 해석하여 모든 처리가 이상없이
진행되었다면 어플리케이션에 정상종료 메세지를 보내고 이 과정을 거쳐 디스플레이 된다.
2014년 11월 18일 화요일
게임회사 면접시 자주나오는 질문.
c++ 알고리즘
1. virtual 함수에 대하여 설명하여라
2. 소멸자에 virtual을 쓰는 이유는 무엇인가
3. 포함과 상속의 차이점에 대해서 설명하여라
4. 메모리 단편화를 해결할 수 있는 기법에 대하여 아는대로 설명하여라.
5. 멀티 코어를 활용할 수 있는 프로그래밍 기법들에 대해서 아는대로 나열하고 설명하여라
6. STL에서 erase와 remove 의 차이점은?
7. List 클래스를 직접 구현하고, 멤버를 추가/삭제 하는 함수를 구현하여라.
컴퓨터 그래픽스
1. 타켓이 플레이어의 정면으로부터 몇도(각도)의 위치에 있는지 계산하여라.
2. 쿼터니언은 어떤 경우에 사용하는가? 그리고 사용하는 이유는 무엇인가?
3. 컬링 기법들을 아는대로 나열하고 설명하여라.
4. 그림자를 생성하는 기법들을 아는대로 나열하고 설명하여라
해답)
1. 클래스에 virtual 함수를 선언하면 vtable이 생성된다. 클래스의 virtual 함수들은 이 vtable에 매핑이 된다. 자식클래스가 부모클래스의 virtual 함수를 오버라이딩 하면 자식 클래스의 vtable에 오버라이딩 함수가 매핑된다. 다형성을 사용하여 자식 클래스가 부모 클래스로 형변환이 되었을 경우, virtual로 선언된 함수들은 vtable에서 가져오기 때문에 자식 클래스가 오버라이딩한 함수를 제대로 호출할 수 있게 된다.
2. 다형성을 사용하여 자식 클래스가 부모 클래스로 형변환을 하고 삭제를 한 경우, virtual로 소멸자를 선언 하지 않았다면 vtable을 참조하지 않고 부모의 소멸자만을 호출하게 된다. 이런 경우, 만약 자식 클래스에서 메모리를 추가 할당한 경우 메모리 누수가 발생한다.
3. 파생 클래스가 부모 클래스와 is-a 관계가 성립할때는 상속. 클래스 2개가 has-a 관계가 성립할때는 포함. is-a 관계가 성립하지 않음에도 단지 편의때문에 상속을 남발해서는 절대 안된다.
4.
http://www.slideshare.net/agebreak/0410-10197035?related=2 참고위치
추후작성
1. virtual 함수에 대하여 설명하여라
2. 소멸자에 virtual을 쓰는 이유는 무엇인가
3. 포함과 상속의 차이점에 대해서 설명하여라
4. 메모리 단편화를 해결할 수 있는 기법에 대하여 아는대로 설명하여라.
5. 멀티 코어를 활용할 수 있는 프로그래밍 기법들에 대해서 아는대로 나열하고 설명하여라
6. STL에서 erase와 remove 의 차이점은?
7. List 클래스를 직접 구현하고, 멤버를 추가/삭제 하는 함수를 구현하여라.
컴퓨터 그래픽스
1. 타켓이 플레이어의 정면으로부터 몇도(각도)의 위치에 있는지 계산하여라.
2. 쿼터니언은 어떤 경우에 사용하는가? 그리고 사용하는 이유는 무엇인가?
3. 컬링 기법들을 아는대로 나열하고 설명하여라.
4. 그림자를 생성하는 기법들을 아는대로 나열하고 설명하여라
해답)
1. 클래스에 virtual 함수를 선언하면 vtable이 생성된다. 클래스의 virtual 함수들은 이 vtable에 매핑이 된다. 자식클래스가 부모클래스의 virtual 함수를 오버라이딩 하면 자식 클래스의 vtable에 오버라이딩 함수가 매핑된다. 다형성을 사용하여 자식 클래스가 부모 클래스로 형변환이 되었을 경우, virtual로 선언된 함수들은 vtable에서 가져오기 때문에 자식 클래스가 오버라이딩한 함수를 제대로 호출할 수 있게 된다.
2. 다형성을 사용하여 자식 클래스가 부모 클래스로 형변환을 하고 삭제를 한 경우, virtual로 소멸자를 선언 하지 않았다면 vtable을 참조하지 않고 부모의 소멸자만을 호출하게 된다. 이런 경우, 만약 자식 클래스에서 메모리를 추가 할당한 경우 메모리 누수가 발생한다.
3. 파생 클래스가 부모 클래스와 is-a 관계가 성립할때는 상속. 클래스 2개가 has-a 관계가 성립할때는 포함. is-a 관계가 성립하지 않음에도 단지 편의때문에 상속을 남발해서는 절대 안된다.
4.
http://www.slideshare.net/agebreak/0410-10197035?related=2 참고위치
추후작성
2014년 10월 24일 금요일
Selection Sort (선택정렬)
선택정렬(Selection Sort)란
정렬 대상의 레코드중 하나를 선택하여 정렬해나아가는 방식의 정렬 알고리즘이다.
쉽게말해서 무작위로 정렬된 값들중에 최소값을 찾아 맨앞에놓고 그다음 작은것을 찾아서 그뒤에놓는 방식이다.(오름 차순일경우)
아래 예제를 보면 알수있겠지만 시간복잡도는 O(N^2)이 된다.
5, 17,
2014년 10월 23일 목요일
C++ 리터럴을 쉽게 알아보자.
"Literal" , 리터럴
이라고 불리는 이녀석은 도대체 누구일까.
쉽게 알아보도록 하겠다.
Literal 또는 Literal constant 라고 불리는이 녀석은
특정한 메모리공간에 이름이 없이 임시적으로 저장되어있는 값을 의미한다.
간단하게 예제를 보고 알아보자.
아주 간단하고 직관적으로 이해할수 있는 코드다.
여기서 num 은 무엇인가? 바로 '변수'이다. 이는 당연히 우리가 알고있다.
그러면 10 + 100; 여기서 10과 100은 무엇인가?
바로 이와 같이 사용되는게 리터럴이다. num = 10+ 100;을 하게되면
메모리공간엔 이름이 없이 10과 100이라는 값을 저장하게된다.
그리고 이값을 사용한후 다음줄로 넘어가게되면 메모리공간에서 사라지게된다.
리터럴은 상수(constant)다. 그렇기에 리터럴 상수(Literal constant)라고도 불리는 것이다.
10과 100은 자체적으로 바뀔수도없고 변할수도 없는 그냥 10과 100이 되는것이다.
num = 10+100;
num = 50;
을한다고해서 10+100 이 50으로 바뀌는게 아니라 num이 50으로 바뀌는 것뿐이다.
10과 100은 여전히 그대로인 값이다.
C&C++에서는 그럼 어떤것들은 리터럴 상수로 정의할까.
정수 리터럴 값 : 1, 5, 100, 10023, 39342
실수 리터럴 값 : 1.84, 4.52, 0.524, 044412
문자 리터럴 값: "안", "녕", "A", "B", "C"
문자열 리터럴 값 : "안녕하세요", "HI", "HELLO"
위에 보인것과 같은 것들을 상수로 정의한다.
2014년 10월 21일 화요일
C++ 참조자 소멸에 관하여
반환형이 참조형인 함수에서
참조자의 소멸에 대해 정확히 이해하자.
에러 문구는 "int에서 int &로 변환 할수 없다"
당연하다 RefEx() 함수를 통해 반환된 값 int형을 가진 ref는
참조자 ref가 아니라
참조자 ref가 가리키는 변수 val1의 값이다.
따라서 int val2 변수에는 저장이 가능하지만
int &val3 에는 저장이 불가능 하다.
왜냐면 int &val3 = 10 이 된단소린데, 상수(number)는 const형태가 아닌이상 참조자로 선언 할 수 없다.
참조자의 소멸에 대해 정확히 이해하자.
반환형이 int& 이고 매개변수를 int &ref로 받는 Reference 라는 함수가 정의되어있다.
(ref 값을 1증가 시킨후에 참조자 ref를 반환한다.)
메인 함수
"참조형 반환 1" 부분을 먼저 보도록하자.
int &n2 = Reference(n1) 에서 n2는 Reference 함수에서 반환된 참조변수를 참조하게된다. 다시말해, n2 는 ref가 참조하고 있는 n1을 참조하는것과 같다.
따라서 n1과 n2의 값은 같기때문에 "참조형 반환 1" 의 결과를 보면 n2++ 를 했을때 n1의 값과 n2의 값이 함께 증가함을 알 수 있다.
다음
"참조형 반환 2" 부분을 보도록하자.
int p2 = Reference(p1) 으로 정의된 부분이다. Reference 함수에서 반환된 참조변수 ref를 int형 변수 p2에 저장하였다. 참조자가 아닌 일반 변수를 선언하여 반환값을 저장하여도 된다는 것을 알 수 있다. 이렇게 된다면 "참조형 반환 1" 과는 다르게 p1과 p2는 각각 별개의 저장공간과 값을 가진 변수가 된다. p2++후 출력결과를 보면 p1 과 p2 각각 다르게 값을 가지는것을 알 수 있다.
결론 :
반환형이 참조형인 함수를 이용했을때, 반환된 값을 어떻게 저장하느냐에 따라 결과가 다른 상황이 발생한다. 그러므로 잘 생각하여 사용하도록 하자.
처음 예제와는 다르게 반환형이 int 형인 함수를 정의하였다. RefEx() 함수를 통해 얻게된 반환값을 각각 int val2, int &val3 에 저장하였다. 그랬더니 &ref 에서 에러가 발생.
당연하다 RefEx() 함수를 통해 반환된 값 int형을 가진 ref는
참조자 ref가 아니라
참조자 ref가 가리키는 변수 val1의 값이다.
따라서 int val2 변수에는 저장이 가능하지만
int &val3 에는 저장이 불가능 하다.
왜냐면 int &val3 = 10 이 된단소린데, 상수(number)는 const형태가 아닌이상 참조자로 선언 할 수 없다.
2014년 10월 20일 월요일
C++ 템플릿 사용시 error LNK2019
책에서 배운 그대로 프로그래밍하였는데
왜 에러가날까?
바로 선언과 정의 파일을 나누어 만들었기 때문이다.
간단한 예를 보도록 하자.
<Pos.h> 헤더파일에서 선언을
<Pos.cpp> 파일에서 정의를
<test.cpp> 메인함수에서 실행
보이는것과 같이 error LNK2019 에러 발생.
위 문제의 해결을위해 클래스 템플릿의 선언과 정의를 구분하지 않고 한곳에서 해보기로 하겠다.
Pos.cpp 파일을 제거후에 헤더파일에 주석(/* */) 부분 제거후 재 실행.
<Pos.h> 선언과 정의를 한번에한 헤더파일
위에 사용한 메인함수와 같음(변경x)
<실행결과> 문제없이 컴파일이 되었다.
- 결론
" C++ (Template)템플릿을 사용하여 구현한 코드는 선언과 정의를 같은 파일에서 해야한다. 왜냐면 컴파일할때 템플릿 소스코드를 만들어내는데 이때 템플릿의 정의가 헤더파일과 Cpp 파일에 나뉘어져있으면 제대로 템플릿 코드가 생성되지 않을 수 있기 때문이다. (런타임시 소스코드를 만들어내는게 아님) "
물론 Cpp파일을 메인Cpp파일이 컴파일시 참조할수 있도록 include 해주면 되긴한다. 하지만 그냥 편하게 헤더파일 하나에다가 정의해서 쓰도록 하자. 귀찮다.
2014년 10월 14일 화요일
4. C에서 C++로.....(3)
< C에서 C++로 >
가장 아래에 표를 보시면 연산자들과 우선순위에 대한 설명이 나옵니다. 아까 말했듯이 bool도 자료형이기에 기본자료형과 동일한 방식으로 사용을 할 수 있습니다.
swap1() 함수를 사용했을때는 값을 매개변수로 전달했기 때문에 함수 외부에 선언된 변수에 접근이 불가능 하므로 값이 바뀌지 않는 결과가 나타나게됩니다. 하지만 swap2() 함수를 사용했을때는 포인터를 사용하여 주소값을 매개변수로 전달했기 때문에 함수 외부에 선언된 변수에 접근이 가능하여 값이 바뀌는 결과가 나타납니다.
swap3() 함수는 매개변수를 참조자로 선언하였습니다. 참조의 대상이 될 변수를 인자로 전달하게되면 되겠군요! 그렇게 val1과 val2를 전달한뒤 참조자를 통해서 함수내부에서 값을 교환하였더니 서로 바뀐숫자값이 출력이 되었습니다. 도대체 어떻게 이렇게 될까요? 바로참조자를 이용하면 함수 내부에서도 외부에 선언된 변수에 접근이 가능하기 때문입니다.
- 자료형 bool
- 참조자
안녕하세요. 벌써 네번째 강의의 시작입니다.
오늘은 C++에 새롭게 추가된 자료형 bool 그리고 참조자(reference)에 대해서 알아보도록 하겠습니다. 조금 이해하기 어려울수 있겠지만 노력하면 안될 것 은 없다고 봅니다. 힘냅시다!
(출처 : C++ for everyone 2nd edition)
bool을 알아보기에앞서 우리는 먼저 true(참)과 false(거짓)에 대해서 확실하게 알고 넘어가야합니다. C에서는 우리는 보통 매크로상수를 이용하여 참을의미하는 숫자는 1, 거짓을 의미한는 숫자는 0 로 사용을 하였었죠.
#define TRUE 1
#define FALSE 0
이렇게 계속사용하다보니 무의식적으로 우리는 TRUE =1, FALSE=0 으로 생각하게 되는데 TRUE는 반드시 1이어야하는것은 아니고 FALSE 또한 반드시 0이어야하는것도 아니랍니다.
단순히 참과 거짓을 구별하려고 사용한것이기 때문이죠. 앞으로 는 참과 거짓을 숫자의 의미로서 생각하지마시고 말의 의미 그대로 참, 거짓으로 생각하길 바라겠습니다.
bool이란 무엇일까?
C++에서는 C에서와는 달리 bool이라는 자료형을 새롭게 추가하였습니다. 이 자료형은 단 두가지의 값만을 가지게됩니다. 바로 "True" 와 "False" 입니다. 말그대로 참과 거짓을 의미합니다.
bool은 int, double과 마찬가지로 기본자료형과 같기 때문에 보통 변수를 선언할때 처럼
bool Love = true;
bool Love = true;
bool Love = false;
이렇게 선언과 초기화가 가능하답니다.
위에 그림에 보시면 boolean Truth table(부울 진리표)가 있습니다. bool형에대한 AND, OR 연산에 대한 결과표 인데요. (bool도 자료형이기에 연산이 가능합니다.)
AND 연산일때는 거짓이 하나라도 있으면 거짓, 모두 참일때만 참.
OR 연산일때는 참이 하나라도 있으면 참, 모두 거짓일때만 거짓.
이렇게 생각하시면 됩니다.
위에 그림에 보시면 boolean Truth table(부울 진리표)가 있습니다. bool형에대한 AND, OR 연산에 대한 결과표 인데요. (bool도 자료형이기에 연산이 가능합니다.)
AND 연산일때는 거짓이 하나라도 있으면 거짓, 모두 참일때만 참.
OR 연산일때는 참이 하나라도 있으면 참, 모두 거짓일때만 거짓.
이렇게 생각하시면 됩니다.
가장 아래에 표를 보시면 연산자들과 우선순위에 대한 설명이 나옵니다. 아까 말했듯이 bool도 자료형이기에 기본자료형과 동일한 방식으로 사용을 할 수 있습니다.
CheckNum 함수를 보도록 하겠습니다. 반환형은 bool , 매개변수를 int num으로 받습니다. 그리고 받아온 num이 0보다 작으면 false를 크면 true 를 출력하는군요.
이전에 함수를 정의해오던 방식과 같습니다. 중요한점은 반환형이 bool 이기때문에 true
또는 false가 return 되야 한다는점입니다. 아시겠나요?
이전에 함수를 정의해오던 방식과 같습니다. 중요한점은 반환형이 bool 이기때문에 true
또는 false가 return 되야 한다는점입니다. 아시겠나요?
메인함수에서 키보드로부터 입력받은 숫자를(isnum) CheckNum 함수를 이용해서 0보다 큰지 작은지 판단후에 true 와 false 를 저장해줍니다.(bool Number에)
그리고 if-else 조건문을 이용해서 양수인지 음수인지 화면에 출력을 해주게 됩니다.
아주 쉬운 부분이라 문제없이 이해되실겁니다~
bool에 대해서는 이정도로 알고 넘어가도록 할게요.
그리고 if-else 조건문을 이용해서 양수인지 음수인지 화면에 출력을 해주게 됩니다.
아주 쉬운 부분이라 문제없이 이해되실겁니다~
bool에 대해서는 이정도로 알고 넘어가도록 할게요.
다음은 참조자(Reference)에 대한 부분을 다루어 보겠습니다.
참조자도 C++에서 처음등장하는 개념으로 다소 생소한 부분이니 정확하게 알고 넘어가셔야 합니다.
'참조자' 는 말 그대로 참조를 하는 녀석입니다. 어떤 방식으로 참조를 하는 것일까요?
간단하게 예를 들어 보겠습니다.
제 이름은 김철수 입니다. 친구들은 저에게 "직소" 라는 별명을 지어줬습니다. 그래서 친구들은 저를 부를때 철수야 또는 직소 라고 부른답니다.
이 문장을 보면 김철수 = 직소 이렇게 볼 수 있습니다. 그러므로 철수를 부를 때 "철수야!" 라고 해도되고 "직소!" 이렇게 불러도 철수는 고개를 돌리며 "응?" 이라고 대답하는 것이겠죠. 참조자도 바로 이런 역할을 한답니다.
컴퓨터가 알아들을수 있게끔 이야기를 바꾸자면
변수 A에 100이라는 숫자가 저장되어있다. 참조자를 사용해서 A의 별명을 B로 지어주었다. 그랬더니 B를 호출해도 100이라는 숫자를 얻어올 수 있었다. 정도가 됩니다.
참조자의 개념에 대해서 어느정도 이해가 되시나요?
이제그럼 참조자를 사용하는법을 알아보겠습니다.
int A = 100; (변수 A에 100이라는 숫자가 저장되어있다.)
int &B = A; (참조자를 사용해서 A의 별명을 B로 지어주었다.)
이렇게 사용하는게 참조자입니다. 해당 대상에 별명을 지어 주는것이죠.
위 코드를 보면서 머리를 갸우뚱하게 만들만한 부분이 있습니다. 바로 "&B" 이 부분인데요. 우리는 이전에 & 연산자를 변수의 주소값을 반환하는 연산자로 사용해왔습니다. 하지만 여기서 & 연산자는 전혀 다른 의미로 사용이 되어지는 것을 알 수가 있습니다. 이 둘을 어떻게 구분 하는지는 다음을 따릅니다.
참조자를 이용한 Call by Reference
C언어에서 우리는 두 수를입력받아 그값을 서로 바꾸어 주는 Swap() 함수를 만들면서 포인터의 활용에대해 이해를 하였습니다. 기억나시죠?
그때의 기억을 잠시 되짚어보면, Call by Value 와 Call by Reference 이 두가지가 떠오를겁니다. C++ 에서는 참조자를 이용한 Call by reference의 함수호출을 지원합니다. 포인터를 이용해서 만들었던 swap 함수를 이제는 참조자를 이용해서 만들수 있단 말이죠.
다음예제를 보면서 알아보도록 하겠습니다.
참조자도 C++에서 처음등장하는 개념으로 다소 생소한 부분이니 정확하게 알고 넘어가셔야 합니다.
'참조자' 는 말 그대로 참조를 하는 녀석입니다. 어떤 방식으로 참조를 하는 것일까요?
간단하게 예를 들어 보겠습니다.
제 이름은 김철수 입니다. 친구들은 저에게 "직소" 라는 별명을 지어줬습니다. 그래서 친구들은 저를 부를때 철수야 또는 직소 라고 부른답니다.
이 문장을 보면 김철수 = 직소 이렇게 볼 수 있습니다. 그러므로 철수를 부를 때 "철수야!" 라고 해도되고 "직소!" 이렇게 불러도 철수는 고개를 돌리며 "응?" 이라고 대답하는 것이겠죠. 참조자도 바로 이런 역할을 한답니다.
컴퓨터가 알아들을수 있게끔 이야기를 바꾸자면
변수 A에 100이라는 숫자가 저장되어있다. 참조자를 사용해서 A의 별명을 B로 지어주었다. 그랬더니 B를 호출해도 100이라는 숫자를 얻어올 수 있었다. 정도가 됩니다.
참조자의 개념에 대해서 어느정도 이해가 되시나요?
이제그럼 참조자를 사용하는법을 알아보겠습니다.
int &B = A; (참조자를 사용해서 A의 별명을 B로 지어주었다.)
cout << B << endl; (그랬더니 B를 호출해도 100이라는 숫자를 얻을수 있었다.)
위 코드를 보면서 머리를 갸우뚱하게 만들만한 부분이 있습니다. 바로 "&B" 이 부분인데요. 우리는 이전에 & 연산자를 변수의 주소값을 반환하는 연산자로 사용해왔습니다. 하지만 여기서 & 연산자는 전혀 다른 의미로 사용이 되어지는 것을 알 수가 있습니다. 이 둘을 어떻게 구분 하는지는 다음을 따릅니다.
* 이미 선언된 변수의 앞에 &연산자를 사용하면 주소 값의 반환
* 새로 선언되는 변수의 이름 앞에 &연산자를 사용하면 참조자의 선언
int *ptr = &A; (A의 주소값을 반환해서 포인터 ptr에 저장)
int &B = A; (변수 A에 대한 참조자 B를 선언)
그러므로 B는 A의 참조자가 되는 것입니다.
(*포인터의 개념과 교차시켜 스스로 골머리를 앓게 하시면 안됩니다. 포인터에 개념은 잠시 넣어두세요)
참조자는 변수로 보아야하는가? 참조자가 하는 기능, 연산, 결과 등은 변수와 동일합니다. 하지만 C++에서는 참조자와 변수를 구분해서 이야기 합니다.
참조자의 주소값에 대한 예제를 하나 보도록 하겠습니다.
위 예제를 보면 참조자에도 역시 &연산자를 사용하면 참조자의 주소값을 가져올 수 있다는걸 알수가 있습니다. 그리고 변수 a의 참조자 ref1, ref2, ref3 들의 주소값 역시 변수 a의 주소값과 동일 하다는 것을 알 수 있죠. 왜냐면, ref1, ref2, ref3은 변수 a의 별명이니까요.
주소값이 모두같다는건 변수와 참조자들이 같은 공간을 가지고 있다는 소리가 됩니다. 그저 a를 부르게되는 별명만 늘어나는 것 입니다. 또 참조자는 선언할 수 있는 갯수에 제한이 없습니다.(별명이 여러개라고 문제가 안되듯이..) 위와 같이 여러개의 참조자를 선언 해도 문제가 없습니다. 하지만 엄청많이 참조자를 선언하면 본인도 사용하는데 까먹어서 정신이 없을거에요ㅋㅋ
참조자를 선언할때는 중요한 점이 있습니다. 참조자는 앞서 누누히 말했듯이 '변수에 별명을 지어주는것이다' 라고 했습니다. 만약 변수가 아니면? 참조자는 선언이 불가능 하겠지요.
int &ref = 100;
int &ref = NULL;
int &ref = NULL;
이 참조자의 선언은 유효할까요? 유효하지 않습니다. 왜냐면 변수를 참조하는게 아니라 상수(number), NULL을 참조했기때문입니다.
int &ref;
여기서 &ref의 선언은 유효할까요? 이것도 역시 유효하지 않습니다. 왜냐면 참조자는 반드시 참조할 대상이 함께 존재해야만 의미가 있습니다.
int &ref = *ptr;
int &ref = arr[0];
이렇게 선언된 참조자는 유효할까요? 이 둘은 유효하답니다. 포인터도 역시 변수며 배열요소도 변수로 간주되어 선언이 가능하답니다. 이점 꼭 알아두시기 바래요.
참조자를 이용한 Call by Reference
C언어에서 우리는 두 수를입력받아 그값을 서로 바꾸어 주는 Swap() 함수를 만들면서 포인터의 활용에대해 이해를 하였습니다. 기억나시죠?
그때의 기억을 잠시 되짚어보면, Call by Value 와 Call by Reference 이 두가지가 떠오를겁니다. C++ 에서는 참조자를 이용한 Call by reference의 함수호출을 지원합니다. 포인터를 이용해서 만들었던 swap 함수를 이제는 참조자를 이용해서 만들수 있단 말이죠.
다음예제를 보면서 알아보도록 하겠습니다.
Swap1() 는 Call by value 에 의한 두 숫자의 값을 바꾸는것.
Swap2() 는 Call by reference에 의한 두 숫자의 값을 바꾸는것. (포인터사용)
Swap2() 는 Call by reference에 의한 두 숫자의 값을 바꾸는것. (포인터사용)
Swap3() 는 Call by reference에 의한 두 숫자의 값을 바꾸는것. (참조자 사용)
이렇게 정의가 되어있습니다.
이렇게 정의가 되어있습니다.
swap1() 함수를 사용했을때는 값을 매개변수로 전달했기 때문에 함수 외부에 선언된 변수에 접근이 불가능 하므로 값이 바뀌지 않는 결과가 나타나게됩니다. 하지만 swap2() 함수를 사용했을때는 포인터를 사용하여 주소값을 매개변수로 전달했기 때문에 함수 외부에 선언된 변수에 접근이 가능하여 값이 바뀌는 결과가 나타납니다.
swap3() 함수는 매개변수를 참조자로 선언하였습니다. 참조의 대상이 될 변수를 인자로 전달하게되면 되겠군요! 그렇게 val1과 val2를 전달한뒤 참조자를 통해서 함수내부에서 값을 교환하였더니 서로 바뀐숫자값이 출력이 되었습니다. 도대체 어떻게 이렇게 될까요? 바로참조자를 이용하면 함수 내부에서도 외부에 선언된 변수에 접근이 가능하기 때문입니다.
(참조자를 쓰면 포인터는 사용안해도 되겠네요? 라고 혹시 생각하는 분이 있겠지만.. 그건 아닙니다. 앞으로 코딩을 하는데 상황에 알맞게 참조자와 포인터 둘다 빈번히 사용하는게 알맞습니다.)
매개변수 부분에 int &a, int &b 로 선언만 되어있고 변수값 참조를 하지않는데 어떻게 swap3() 함수가 에러없이 정의가 가능한지 궁금한 분들이 있으실겁니다. 정확하게 참조자를 이해하고 공부하신분 입니다. 하지만 매개변수는 함수가 호출되었을때 전달되는 인자로 초기화가 되는것이기 때문에 아무 문제가 없습니다. 다시말해서 swap3()함수는 매개변수에 인자가 전달되지 않으면 함수가 실행이안되고 인자가 전달되면 그 순간 선언과 초기화가 이루어져서 함수가 실행된다는 의미랍니다.
매개변수 부분에 int &a, int &b 로 선언만 되어있고 변수값 참조를 하지않는데 어떻게 swap3() 함수가 에러없이 정의가 가능한지 궁금한 분들이 있으실겁니다. 정확하게 참조자를 이해하고 공부하신분 입니다. 하지만 매개변수는 함수가 호출되었을때 전달되는 인자로 초기화가 되는것이기 때문에 아무 문제가 없습니다. 다시말해서 swap3()함수는 매개변수에 인자가 전달되지 않으면 함수가 실행이안되고 인자가 전달되면 그 순간 선언과 초기화가 이루어져서 함수가 실행된다는 의미랍니다.
C언어에서 배웠던 const(상수) 한정자에 대한 개념을 간단히 집고 넘어가겠습니다.
*상수는 한번 선언후 초기화를 하면 절대 변하지 않으며 변할 수도 없다.
여기서 const는 참조자는 상수(number)를 참조 할 수 있게 해주는 역할을 합니다. 어떻게 그것이 가능할까요? 다음 예제를 통해 알아보도록 하겠습니다.
const 한정자를통해 int &a = 10으로 초기화 시켰습니다. 이때 저장되는 숫자 10은 바로 "리터럴" 입니다. (리터럴이 생각이 안나면 => 리터럴)
그러면 cont int &a = 10; 다음줄로 넘어가게되면 '10'이라는 리터럴값은 메모리공간속에서 사라지게 됩니다. 그러면 참조자 a는 아무것도 참조할것이 없게되므로 에러가 발생하게되는것이 정상입니다. 그러나 위의 코드는 아무런 에러를 보여주지 않고있습니다. '10'이라는 값이 메모리상에 계속 남아있기 때문에 참조자 a가 참조를 잘하고 있다는 소리겠지요?
여기에 특수한 로직이 하나숨어져있습니다. const 한정자를 이용해서 리터럴을 참조할 때는 메모리에 '임시변수'를 하나 만들어 그곳에 '10'을 저장하여 참조자가 문제없이 참조할 수 있도록 해준답니다.
그러면 cont int &a = 10; 다음줄로 넘어가게되면 '10'이라는 리터럴값은 메모리공간속에서 사라지게 됩니다. 그러면 참조자 a는 아무것도 참조할것이 없게되므로 에러가 발생하게되는것이 정상입니다. 그러나 위의 코드는 아무런 에러를 보여주지 않고있습니다. '10'이라는 값이 메모리상에 계속 남아있기 때문에 참조자 a가 참조를 잘하고 있다는 소리겠지요?
여기에 특수한 로직이 하나숨어져있습니다. const 한정자를 이용해서 리터럴을 참조할 때는 메모리에 '임시변수'를 하나 만들어 그곳에 '10'을 저장하여 참조자가 문제없이 참조할 수 있도록 해준답니다.
또 참조자 a는 const로 선언되어있으므로 절대 값이 바뀔수 없습니다.
이렇게 리터럴을 참조하는 방식을 가지고 더욱 직관적인 함수를 만들어낼 수 있습니다.
아래 예제를 보도록하겠습니다.
이렇게 리터럴을 참조하는 방식을 가지고 더욱 직관적인 함수를 만들어낼 수 있습니다.
아래 예제를 보도록하겠습니다.
addnum1()과 addnum2() 두 함수를 사용할때 차이점 보이시나요?
addnum2() 함수처럼 매개변수 인자를 리터럴로 받아오게 되면 addnum1() 함수를
사용할때 처럼 굳이 val1과 val2를 선언해서 인자전달을 하는 번거로움이 줄어들게
된답니다.
이렇게 자료형 bool과 참조자에대해서 알아보는 시간이 모두 끝났습니다.
다들 쉽게쉽게 이해 되셨길바라면서 강의를 마치겠습니다. 다음강에서 뵙겠습니다.
(궁금한점은 댓글 달아주시면 답변드리겠습니다.)
addnum2() 함수처럼 매개변수 인자를 리터럴로 받아오게 되면 addnum1() 함수를
사용할때 처럼 굳이 val1과 val2를 선언해서 인자전달을 하는 번거로움이 줄어들게
된답니다.
이렇게 자료형 bool과 참조자에대해서 알아보는 시간이 모두 끝났습니다.
다들 쉽게쉽게 이해 되셨길바라면서 강의를 마치겠습니다. 다음강에서 뵙겠습니다.
(궁금한점은 댓글 달아주시면 답변드리겠습니다.)
피드 구독하기:
글 (Atom)