2025.12.17 요약노트
함수 오버로딩
C언어와는 달리 cpp 언어에선 동일한 이름의 함수를 여러개 정의할 수 있다. cpp는 함수의 이름뿐만 아니라 매개변수와 타입정보를 함께 사용하기때문
- 함수 이름을 구분하기위해 "내부적으로" '고유' 한 이름을 부여하는것을 네임 맹글링 이라고 한다. 단, 함수의 반환형을 바꾸는것만으론 오버로딩이 되지 않 는다.
- 매개변수가 다른경우
- 매개변수의 개수가 다른경우
★ 각 함수가 "명확히" 구분되어야 함
함수가 오버로딩이 되려면 호출되는 함수가 명확해야한다.
함수 오버로딩의 순서
cpp 에서는 아래와 같은 명확한 우선순위 규칙에 따라서 호출할 함수를 결정함.
- [정확한 매칭 -> 타입 승격 변환 -> 표준 타입 변환 -> 사용자 정의 타입 변환]
- 정확한 매칭) : 타입이 정확히 일치하는지 확인
- 타입 승격 변환) : 일치하는 타입이 없다면 그다음으로 값이 손실되지 않는 방향으로 변환
- 표준 타입 변환) : 일치하는 타입이 없고 값이 손실되지 않는 방향도 없다면 값 손실을 감수하고 변환
- 사용자 정의 타입 변환) : 클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 변환 NOT YET
Template 로 정의
- 메서드의 타입을 T로 정의 해놓으면 int 형이든 double형이든 하나의 템플릿으로 정의가 가능
템플릿 클래스
template 을 사용하여 함수를 구현했을때 T add() 라고 가정하자 이때
T add(const T& a, const T& b) 이렇게 매개변수를 정하게되면
main 함수에서 호출할때 add(10, 20) 이렇게 값만 넘겨주는게 가능하게 되는데
그 이유는 원래라면 &는 참조자로 기본값을 가지고 있어야만 가능하다 단, template 에서 매개변수에 const를 선언하게되면 [C++ 설계자들은 "임시 값이라도 읽기 전용으로만 쓴다면 참조를 허용해주자"라는 예외 규칙을 만들었습니다] 해당 예외 규칙이 존재하기 때문에 변수를 선언하지 않고 그냥 값을 넘겨 줄 수 있다는 것을 알게되었다.
표준 템플릿 라이브러리
표준 : c++ 에서 기본적으로 제공
템플릿 : 데이터에 의존 x
STL 은 3가지 : 컨테이너, 알고리즘, 반복자
컨테이너 : 데이터를 담은ㄴ것
알고리즘 : 동작
반복자 : 컨테이너와 알고리즘에대해서 세부사항을 몰라도 동일하게 사용할 수있게해주는 문법
컨테이너 : 데이터를 담는 자료구조
벡터
벡터의 선언
vector vec / vector vec2(크기, 원소값)
vector vec3 = {1,2,3,4,5} 초기화 리스트로 크기가5이며 순서대로 1,2,3,4,5 가 삽입됨 : 초기화 리스트 선언
vector vec4(vec3) 기존의 생성된 벡터의 복사본을 만듦 메모리는 독립적으로 잡히지만 값은 vec3와 동일 : 벡터 복사선언
vector vec2D(3, vector(4,7)) : 2차원배열 '처럼' 사용 3 == 행의갯수 배열과 동일하진않음 : 2차원배열처럼 사용하는 벡터
push_back : 벡터의 맨끝에 원소를 추가하는 메서드
pop_back : 맨끝에 원소를 제거하는 메서드
size : 현재 벡터의 크기를 확인하는 메서드
erase : 특정 구간의 원소를 제거하는 메서드 , 단, 벡터의 성능을 떨어뜨릴 수 있어서 되도록이면 사용 금지
vec.erase(vec.begin + 1) 0 1 2 == 1삭제
vec.erase(vec.begin + 1, vec.begin + 3) == a <= x < b x에 해당되는 값 전부 삭제
맵
insert()
make_pair() 를 이용하여 pair 객체를 생성한 후 insert 함수를 사용할 수 있다. 또는 {} 나 [] 를 활용하여 값을 추가할 수도 있다.
find()
알고리즘
sort () : 컨테이너의 내부를 정리하는 함수
사용자 정렬함수가 없다면 오름차순으로 장리
comp(a, b) 라고 가정했을때 첫번째 인자 a가 앞에원소를 의미 그리고 반환 타입은 bool
정렬함수 구현시 true 반환한다면 위에 순서를 그대로유지 false 라면 a와 b의 순서를 바꿈
컨테이너의 내부 구조는 서로 다르지만 대부분 알고리즘의 동일한 코드를 활용해서 사용할 수 있다.
find () : 컨테이너의 내부에서 특정원소를 찾아 해당원소의 '반복자' 를 반환
헷갈릴만한 요소 find() 메서드 사용시 두번째 인자를 전달할때 두번째 인자는 내가 찾을 범위의 다음위치를 넘겨야함
왜냐하면 못찾았을경우에 빈공간을 반환해야 하기 때문에 못찾았는데 마지막 값을 반환하면 파악하기 힘듦
find(a, b) a<= x < b 의구조
반복자
순방향 반복자 : 앞에서부터 뒤로 순차적으로 순회하는 반복자
역방향 반복자 : 마지막원소부터 첫번째원소까지 역순으로 순회하는 반복자
rbegin 은 마지막원소 rend 는 첫번째원소 이전을 가리킴 rbegin <= x < rend 구조