C++ Return문, 포인터, 배열 응용
Return 키워드
return문은 함수에서 값을 반환하고 함수를 종료하는 키워드입니다.
#include <iostream>
#include <cpltasks.h>
using namespace std;
int Add(int a, int b)
{
return a + b;
}
int main()
{
int a = 5;
int b = 6;
int ret = Add(a, b);
return 0;
}
C++
복사
return문의 역할:
•
함수의 실행을 종료
•
함수 호출한 곳으로 값을 반환
•
main 함수에서 return 0은 프로그램이 정상 종료됨을 의미
숫자채우기 연습
번호 순서로 숫자를 배열에 채우기
x는 0 ~ 2까지, y는 0 ~ 2까지 반복하며 2차원 배열에 순차적으로 값을 저장합니다.
#include <iostream>
using namespace std;
int main()
{
int vect[3][3] = { 0 };
int x, y;
int t = 1;
for (y = 0; y < 3; y++)
{
for (x = 0; x < 3; x++)
{
vect[y][x] = t;
t++;
}
}
return 0;
}
C++
복사
결과:
1 2 3
4 5 6
7 8 9
Plain Text
복사
역순으로 숫자 채우기
y방향이 바깥에 움직이고, x방향이 안쪽에 움직입니다.
x는 2부터 0까지 움직이고, y는 0부터 2까지 움직입니다.
#include <iostream>
using namespace std;
int main()
{
int vect[3][3] = { 0 };
int x, y;
int t = 1;
for (x = 2; x >= 0; x--)
{
for (y = 0; y < 3; y++)
{
vect[y][x] = t;
t++;
}
}
return 0;
}
C++
복사
결과:
7 4 1
8 5 2
9 6 3
Plain Text
복사
포인터 타입 변수
포인터의 기본 개념
메모리에 위치를 가리키는(주소값) 을 저장할 수 있는 변수입니다.
포인터의 특징:
•
포인터 변수: 자료형 뒤에 을 붙여서 사용합니다. (int p)
•
변수의 주소값을 알고 싶으면 해당 변수 앞에 &(주소 연산자)를 붙여주면 됩니다.
•
주소값은 일반적인 정수(값) 10진수와 구분하기 위해 16진수를 사용합니다.
기본적인 사용과 16진수의 주소값
#include <iostream>
using namespace std;
int main()
{
int n = 10;
void* ptr = &n;
cout << ptr << endl;
// 출력 예: 000000A32D9FC64
return 0;
}
C++
복사
포인터와 메모리 구조
포인터 변수에는 해당 주소 위치로 접근할 수 있는 특별한 연산이 있습니다.
* 을 붙이면 해당 주소 위치로 이동할 수 있습니다.
하지만 중요한건 해당 주소로 이동했을시에 알맞은 크기만큼 접근하기 위해서 포인터 변수의 타입 앞 부분과 실제 변수의 자료형을 맞춰야 주의하여야 합니다.
다만 그냥 주소값을 저장하는 용도로 사용한다면 void*을 사용하여 됩니다.
변수의 자료형 일치
#include <iostream>
using namespace std;
int main()
{
int number = 0;
// 주소값을 저장하는 용도로는 void* 사용 가능
void* p = &number;
// *p = 200; // 오류!
// 해당 주소로 이동했을 때 알맞은 크기만큼 접근하기 위해서
// 포인터 변수의 지료형과 실제 변수의 자료형을 맞춰야 한다.
int* numberCopy = &number;
*numberCopy = 100;
char ch = 'A';
char* pCh = &ch;
return 0;
}
C++
복사
포인터를 이용한 값의 복사 (코드 분석해보기 숙제)
메모리 그림도 추가해주야 합니다.
값에 의한 복사 (Call by Value)
#include <iostream>
using namespace std;
// 값을 복사
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
C++
복사
주소에 의한 복사 (Call by Reference)
#include <iostream>
using namespace std;
// 값을 복사
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int num1 = 100;
int num2 = 200;
//swap(num1, num2); // 값 전달 - 원본 변경 안됨
swap(&num1, &num2); // 주소 전달 - 원본 변경됨
return 0;
}
C++
복사
차이점:
•
Call by Value: 값을 복사하여 전달하므로 원본 변수는 변경되지 않음
•
Call by Reference: 주소를 전달하여 원본 변수를 직접 변경
플래그 코딩 기법
기본 플래그 사용법
Flag 변수를 하나만들고 활용하는 방식입니다. 배열에 어떤 값이 존재하는지 판단할 때 사용합니다.
#include <iostream>
using namespace std;
int main()
{
int vect[7] = { 5, 6, 7, 1, 2, 7, 8 };
int flag = 0;
for (int i = 0; i < 7; i++)
{
if (vect[i] == 7)
{
flag = 1;
break;
}
}
if (flag == 1)
{
cout << "발견" << endl;
}
else
{
cout << "미발견" << endl;
}
return 0;
}
C++
복사
플래그 기법의 장점:
•
조건을 만족하는 순간 반복을 중단할 수 있음 (break 사용)
•
결과를 나중에 한번에 처리 가능
•
코드의 가독성 향상
최대값, 최소값 찾기
#include <iostream>
using namespace std;
int main()
{
int vect[7] = { 5, 6, 7, 1, 2, 3, 8 };
// 최대값 찾기
int max = INT_MIN; // 가장 작은 정수값으로 초기화
for (int i = 0; i < 7; i++)
{
if (max < vect[i])
{
max = vect[i];
}
}
// 최소값 찾기
int min = INT_MAX; // 가장 큰 정수값으로 초기화
for (int i = 0; i < 7; i++)
{
if (min > vect[i])
{
min = vect[i];
}
}
cout << "최대값: " << max << endl; // 8
cout << "최소값: " << min << endl; // 1
return 0;
}
C++
복사
최대값/최소값 찾기 알고리즘:
1.
초기값을 적절히 설정 (INT_MIN, INT_MAX 또는 배열의 첫 번째 원소)
2.
배열을 순회하면서 현재 최대값/최소값과 비교
3.
조건에 맞으면 값을 갱신
“강의는 많은데, 왜 나는 아직도 코드를 못 짤까?”
혼자 공부하다 보면 누구나 이런 고민을 하게 됩니다.
•
강의는 다 들었지만 막상 손이 안 움직이고,
•
복습을 하려 해도 무엇을 다시 봐야 할지 모르겠고,
•
질문할 곳도 없고,
•
유튜브는 결국 정답을 따라 치는 것밖에 안 되는 것 같고.
문제는 ‘연습’이 빠졌기 때문입니다.
단순히 강의를 듣는 것만으로는 실력이 늘지 않습니다.
실제 문제를 풀고, 고민하고, 직접 구현해보는 시간이 반드시 필요합니다.
그래서, 얌얌코딩 코칭은 다릅니다.
그냥 가르치지 않습니다.
스스로 설계하고, 코딩할 수 있게 만듭니다.
얌얌코딩 코칭에서는 단순한 예제가 아닌,
스스로 문제를 분석하고 구현해야 하는 연습문제를 제공합니다.
이 연습문제들은 다음과 같은 역량을 키우기 위해 설계되어 있습니다:
•
문제를 스스로 쪼개고 설계하는 힘
•
다양한 조건을 만족시키는 실제 구현 능력
•
기능 단위가 아닌, 프로그램 단위로 사고하는 습관
•
마침내 자신의 힘으로 코드를 끝까지 작성하는 경험
지금 필요한 건 더 많은 강의가 아닙니다.
코드를 스스로 완성해 나가는 훈련,
그것이 지금 실력을 끌어올릴 가장 현실적인 방법입니다.