언어

C++ (함수, 배열, 정렬, 객체)

werty2 2026. 3. 25. 21:33

- 함수

원하는 기능들을 모아 하나의 도구처럼 사용할 수 있도록 해줌

반환타입 함수명() {
	//코드 작성
}

형태는 다음과 같다. 함수명은 대문자로 시작해 의미 단위로 다시 대문자를 적어 구분해주는 파스칼 케이스를 따른다.

 

함수 실행 시에는 함수명(); 형태로 적어주어야 한다.

 

  > 인자를 포함하는 함수

void Print(int n) {
	//코드
}

위의 예시와 같이 괄호 안에 인자의 타입과 변수명을 넣어준다.

 

함수에서 값을 반환하려면 return을 사용한다.

int Add(int a, int b) {
	return a + b;
}

위의 예시와 같이 원하는 값을 return 뒤에 적으면 반환할 수 있다.

함수는 return을 만나게 되면 내부의 모든 코드를 수행하지 못했더라도 즉시 종료된다.

 

- Call By Value

  > 함수에 인자를 넘길 때는 기본적으로 값을 복사해서 넘겨준다.

  > 실제 인자값 자체가 바뀌는 것은 아니다.

 

- Call By Reference

  > 포인터: 변수의 주소를 나타낸다.

  > 주소를 나타내는 변수(포인터변수)의 타입은 들어있는변수타입 * 으로 나타낸다. (ex. int * 타입 = int 변수의 주소를 가리킴)

  > 원하는 변수의 주소를 나타내려면 변수명 앞에 &를 붙인다. (ex. &a)

  > 포인터변수가 가리키고 있는 곳에 적힌 값을 참조하기 위해서는 앞에 *을 붙여주어야 함 (ex. cout << *b  //포인터변수 b가 가리키는 곳에 담긴 값)

  > 함수에 인자를 넘길 때 주소값을 넘겨준다.

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
    cout << a << " " << b << endl;
}

int main() {
    int n = 10, m = 20;
    swap(n, m);
    cout << n << " " << m;
    return 0;
}

> 위는 &를 이용한 참조를 통해 Call By Reference를 구현한 것이다. 참조는 이미 존재하는 객체를 가키는 또 다른 이름이다.

> int & 라는 표기만으로 n, m을 넘길 시 전달되는 객체가 복사되지 않고, 원본 객체에 대한 참조가 전달되어 주소를 전달한 것과 같은 효과를 얻을 수 있다.

> 참조를 만들면, 하나의 객체에 대해 그 객체를 가리키는 이름이 두 개가 된다.

 

- 배열

  > 배열은 연속된 주소들로 이루어져 있다.

  > 포인터값에 1을 더하면 배열의 그 다음 원소를 가리키도록 주소 값을 변화시킨다.

     > *x = arr, *(x + 1) 은 arr배열의 두 번째 원소값

     > 배열명 arr은 그 자체로 배열 첫 번째 원소 주소인 &arr[0]을 나타낸다.

  > 배열을 함수의 인자로 넘길 때는 배열 첫 번째 원소 주소만 넘기면 된다. (배열의 원소들은 연속하여 주소가 할당되기 때문)

//인자타입 = 포인터
void Func(int *x) {
	//코드
}

//인자타입 = 포인터 X
void Func(int x[]) {
	//코드
}

위의 두 가지 방법으로 배열을 함수의 인자로 전달할 수 있다.

모두 주소를 기반으로 하기 때문에 함수 내부에서 값을 변경시킨 이후에 함수를 빠져나가도 실제 값이 바뀐다.

 

- 정렬

  > 숫자 오름차순 정렬: #include <argorithm> 을 위에 추가해준 후, std::sort(배열명 + 시작인덱스, 배열명 + 끝인덱스+1) 함수 사용

  > 숫자 내림차순 정렬: #include <functional> 을 추가한 뒤, std::sort(배열명 + 시작인덱스, 배열명 + 끝인덱스+1, greater<int>()) 를 사용, 오름차순 함수 뒤에 greater<int>()를 추가해주면 된다.

  > 문자열 알파벳순 정렬: sort(문자열명.begin(), 문자열명.end()) 로 sort 함수에 해당 문자열의 .begin(), .end() 값을 넣어주어야 한다.

  > 문자열로 구성된 리스트 정렬: 숫자 정렬과 같다.

 

- 객체

객체는... 정해진 틀을 만드는 것과 같다고 생각한다. 예를 들어 사람의 정보를 기록할 때 이름, 나이, 지역을 기록하기로 했다면 이 세 가지 특징을 적는 틀을 만들어야 할 것이다. 이러한 틀을 만들어주는 것이 객체이다. 하나의 사람으로 예를 들었지만, 이 객체는 사람 뿐만이 아니라 다양한 대상이 될 수 있을 것이다.

 

  > 클래스: 객체를 지칭하는 것이 가능하도록 해준다.

class Student {
public:
    string n;
    int a;

    // 생성자
    Student(string n, int a) {
        this->n = name;
        this->a = age;
    }
};

생성자는 이 클래스의 형태를 정의한다. 인자로 넘어오는 값들을 생성자에서 받는다.

여기서 저장되는 현재 학생의 이름과 나이 변수인 n과 a는 클래스의 멤버변수 라고 부른다. 멤버변수들을 조회하기 위해서는 객체이름.멤버변수 형태로 사용이 가능하다.