알고리즘 1주차
포인터
Bit
- 메모리의 가장 작은 단위
- 공학적인 표현으로 0아니면 1 두가지 중 한가지 상태를 가질 수 있다.
- 1비트의 경우 2^1 여기서 승수가 비트를 나타낸다.
- 데이터를 저장하고 처리하는데에 사용된다.
Byte
- 메모리 상의 최소 데이터 단위
- 데이터 타입의 크기를 결정하는 기본 단위
- 1바이트 = 8개의 비트를 나타내는 단위
- 32bit 환경에서 인트형은 4바이트, 2^32 인트형의 범위와 같다.
// 자료형 크기
#include <iostream>
using namespace std;
int main()
{
bool a;
char b;
int c;
count << sizeof(a) <<endl;
count << sizeof(b) <<endl;
count << sizeof(c) <<endl;
}
결과값:
---------------------------------
1
1
4
포인터 변수
- 메모리상의 주소를 저장하는 변수
- 변수명앞에 ‘*’ 기호를 사용하여 정의한다.
- 다른 변수의 주소를 가르켜 데이터를 변경하거나 참조할 수 있다.
// 포인터 활용
#include <iostream>
using namespace std;
int main()
{
int num = 10;
int* pnum = # // 포인터의 변수가 num의 주소값을 가리킨다.
*pnum = 20;
cout << num << endl; // 포인터의 변수로 접근하여 값을 바꾸었기 때문에 20이 출력된다.
cout << *pnum << endl; // 포인터 변수가 num에 주소값을 가르키고 있기에 num의 값인 20이 출력된다.
int num2 = 30;
pnum = &num2; // 포인터 변수가 num2의 주소값을 가리킨다.
cout << *pnum << endl; // 포인터 변수가 num2에 주소값을 가르키고 있기에 num2의 값인 30이 출력된다.
int* pnum2 = 5; // 상수 5는 메모리 주소가 없기 때문에 포인터로 가르킬 수 없다.
}
Call By Value
-
값에 의한 호출로 인자로 받은 값을 복사하여 처리한다.
-
함수 영역에서 매개변수에 인자 값이 복사가 되고 함수 내에서 매개변수 끼리 값이 바뀌지만 함수가 종료 되면 매개변수들은 사라지게 되므로 실제 전달한 인자의 값에 대한 변화는 없다.
// Call By Value
#include <iostream>
using namespace std;
void TempValue(int n, int m)
{
int tmp = n;
n = m;
m = tmp;
}
int main()
{
int n = 10;
int m = 20;
cout << n << " " << m << '\n';
TempValue(n, m);
cout << n << " " << m << '\n';
}
결과값:
---------------------------------
10 20
10 20
Call By Address
-
주소에 의한 호출로 매개변수인 포인터 변수에 원본의 주소값을 복사한다.
-
매개변수의 복사된 주소를 참조하여 값을 변경하면 원본의 데이터도 바뀌게된다.
// Call By Address
#include <iostream>
using namespace std;
void TempAddress(int *n, int *m)
{
int tmp = *n;
*n = *m;
*m = tmp;
}
int main()
{
int n = 10;
int m = 20;
cout << n << " " << m << '\n';
TempAddress(&n, &m);
cout << n << " " << m << '\n';
}
결과값:
---------------------------------
10 20
20 10
Call By Reference
-
참조에 의한 호출로 인자로 받은 값의 주소를 참조하여 직접 값을 변경할 수 있다.
-
Call By Adress와 결과 값은 같지만 주소를 복사하여 참조하는 것이 아니라 인자의 주소를 바로 참조하여 값을 변경한다
-
C++에서 도입된 개념이다.
// Call By Reference
#include <iostream>
using namespace std;
void TempReference(int &n, int &m)
{
int tmp = n;
n = m;
m = tmp;
}
int main()
{
int n = 10;
int m = 20;
cout << n << " " << m << '\n';
TempReference(n, m);
cout << n << " " << m << '\n';
}
결과값:
---------------------------------
10 20
20 10
이중 포인터
-
포인터 변수는 주소를 저장하는 변수이고 마찬가지로 이중 포인터는 포인터의 주소를 저장하는 변수이다.
- numPtr2 = numPtr1의 주소
- *numPtr2 = numPtr1의 값 = num1의 주소
- **numPtr2 = numPtr1이 참조하는 값 = num1의 값
다음과 같이 더블 포인터를 활용할 수 있다.
// 더블 포인터 활용
#include <iostream>
using namespace std;
void Func(int** b) {
*b = new int;
cout << b << endl; // *a의 주소값
cout << **b << endl; // *a의 값
**b = 10; // *a가 가르키는 값을 직접 바꾼다.
cout << **b << endl;
}
int main()
{
int* a = NULL;
Func(&a);
cout << &a << endl; // *a의 값
cout << *a;
delete a;
}
결과값:
---------------------------------
00EFFA0C
-842150451 // 쓰레기 값
10
00EFFA0C
10
클레스
-
변수와 함수를 결합한 데이터 타입 객체를 생성하기 위해 변수와 함수를 정의하는 일종의 틀의 개념이다.
- 클래스와 구조체의 차이는?
- 구조체는 접근 지정자가 없다. 전부 public처럼 접근 가능하다.
- 클레스는 public, private, protected 접근 지정자가 존재함
- 클래스, 구조체의 맴버 변수 접근 시 ‘ . ‘을 사용한다.
- 맴버 변수가 스택 영역에 존재한다.
- 클래스, 구조체 포인터에 접근할 경우 ‘->’ 또는 ‘(*ptr).’ 같은 방식으로 접근한다.
- 맴버 변수가 힙 영역에 존재한다.
// 클레스 예시
#include <iostream>
using namespace std;
class Person
{
// 접근 지시자
//public 어디서든 접근 가능
//protected 내부에서 접근 가능, 자식 접근가능
//private 내부에서 접근 가능, 프랜드 접근 가능
public:
int num;
private:
int num1;
public:
Person()
{
cout << "생성자 호출" << endl;
num = 10;
num1 = 50; // 프라이빗 맴버 변수 클래스 내부에서 사용 가능
cout << num << " " << num1 << endl;
Print1(); // 프라이빗 맴버 함수 클래스 내부에서 사용 가능
cout << "생성자 끝" << endl;
}
void Print()
{
cout << "public: " << "학술회 너무 재밌어" << endl;
}
private:
void Print1()
{
cout << "private: " << "학술회 너무 재밌어" << endl;
}
};
int main()
{
Person a;
// public 외부에서 사용 가능
a.Print();
a.num;
// private 외부에서 사용 불가능
a.Print1(); // private 맴버 함수 외부에서 접근할 수 없다.
a.num1; // private 맴버 변수 외부에서 접근할 수 없다.
}
결과값:
---------------------------------
생성자 호출
10 50
private: 학술회 너무 재밌어
생성자 끝
public: 학술회 너무 재밌어
댓글남기기