<1학기 C++ 스터디 2, 3, 4 주차 복습 문서화>
1) 2주차 내용
> 조건문
- if 문: " if (조건식) 실행할 문장; " , 여러 줄 사용 시 { } 로 묶어주기
- if ~ else 문: if (조건식) {참일 때 실행할 명령} else {거짓일 때 실행할 명령}
- 다중 if ~ else 문: if (조건식) {조건식 1이 참일 때 실행할 명령}
else if {조건식 2가 참일 때 실행할 명령}
else {둘 다 거짓일 때 실행할 명령}
- 중첩 if 문: 조건을 3개 이상 사용할 때 사용, 말 그대로 중첩해서 사용하는 것
- switch ~ case 문: 다중 if문과 같은 용도로 쓰임. but 정수식에 따라 분기.
" switch( ) { case1: 실행할 명령; break;
case2: 실행할 명령; break; } "
> 반복문
- for 문: " for (초기값; 조건식; 증감식;) {반복할 명령들;} " , 지정된 횟수 만큼 반복.
- 중첨 for 문: " for (초기값1; 조건식1; 증감식1)
{ for (초기값2; 조건식2; 증감식2) {반복할 명령들} } "
- while 문: " while (조건식) {반복할 명령들} ", 조건을 만족하는 동안 명령을 반복.
- do ~ while 문: " do {반복할 명령들;} while (조건식); ", while 문과 달리 거짓이어도 명령이 한번은 실행됨.
> 제어문
- break: 반복문의 제어를 벗어날 수 있음.
- continue: 반복문의 처음으로 돌아감. (switch 문에서 사용 X)
- goto: 지정된 위치로 이동, "goto 레이블명;
goto문 레이블: 실행할 코드; "
- return 문: 현재 실행중인 함수 종료. " return 0; "
> 배열
- 동일 타입의 데이터들을 보다 편리하게 한번에 다루기 위해서 사용
- 선언: " 자료형 배열명 [원소의 개수]; ", 인덱스는 항상 0부터 시작.
- 크기선언 시 null 값과 함께 생각해서 +1 하기
- 문자 하나 선언 시 ' ' , 문자열 선언 시 " "
- 2차원 배열: " 타입 배열이름 [행의 길이][열의 길이]; "
> 포인터
- 실행 중인 메모리의 주소값. 즉 포인터 변수에는 변수의 주소값이 할당됨.
- 포인터 선언: 변수 앞에 * 을 붙여준다. ex) int * ptr;
- 포인터 초기화: ex) int *ptr = &k;
- 배열과 포인터: 배열의 이름 = 배열 메모리 시작 주소.
2) 3주차 내용
> 함수
- 특정 기능을 반복해야 할때, 효율적으로 처리하기 위해서 이용함.
- main 함수: 프로그램의 시작이자 끝, main 함수에 의해서 라이브러리 함수와 사용자 정의 함수 호출.
- 구현 방법: " 반환자료형 함수이름 (매개변수 목록) {실행할 코드; retrun 반환값;} "
- 선언과 동시에 구현할수도, 선언부&구현부 나눌 수도 있음.
- 전역변수: 프로그램 전체에서 사용되는 변수 (함수 밖 정의)
지역변수: 한정된 지역에서만 사용되는 변수 (함수 내 정의)
- swap 함수 (call by value): 두 매개변수를 넣었을 때, swap 함수 내에서는 값이 교환되더라도 main 에서는 교환 X
값을 넘겨받아 활용하는 것 뿐.
> 포인터
- 포인터 변수에 자료형 선언 이유: 여기에서 자료형이 몇 바이트를 읽을지 결정하기 때문.
- int형: 4바이트/ char형: 1바이트/ double형: 8바이트
- 포인터 변수: 메모리 내의 특정 주소를 저장하는 변수, 자체의 크기는 4바이트로 동일함
- 용어정리: ex) int *p; p= &n; 의 경우 (n은 메모리 공간의 이름)
&n, p : n 의 주소값/ *p : n 이 저장한 값
- 포인터 변수가 배열을 가리킬 경우 주소 저장 방법:
int *p =NULL; 다음에 p = n; 또는 p = &n[0]; (n은 배열이름)
모두 배열의 첫번째 원소의 주소를 저장하는 방법
+ 배열에선 데이터형의 크기만큼 각 원소가 메모리를 차지한다.
- swap 함수 (call by address): 포인터 변수를 이용하는 경우 main 함수의 지역변수에 대해 제어권을 가지기 때문에,
swap 함수 내부의 변수가 교환되면서 동시에 main 내부의 변수값도 교환됨.
> 참조
- 참조란, 이미 존재하는 변수에 대한 별명, "int &ref = n; " -> ref 가 n의 참조자
- 새로운 공간을 할당받지 않음.
- swap 함수 (call by reference): call by address 와 유사하게 이 역시 별명을 통해 main의 지역변수 제어 가능.
swap 함수 내부의 변수가 교환되면서 동시에 main 내부의 변수값도 교환됨.
- 포인터와 참조의 차이: 1. 참조자는 단독으로 존재할 수 없기에 선언과 동시에 초기화 필요
2. 별명이기 때문에 차후 변경 불가능
3. 포인터는 예를 들어 배열의 경우 다른 메모리 주소값에도 접근 가능, but 참조자는 불가능
3) 4주차 내용
> 객체와 클래스
- 클래스: 객체를 정의하는 틀이자 설계도. 실체 X
- 객체: 클래스의 모양을 그대로 가지고 탄생하는 실체
하나의 클래스에서 여러 개의 객체 생성 가능
- 클래스 선언부:
* class 키워드 이용해서 클래스 모양 선언, 멤버 변수 및 함수 선언, 멤버에 대한 접근 권한 지정
ex) class Circle {public: int radius;
double getarea(); };
여기서 class= class 키워드/ Circle = 클래스 이름/ public = 접근 지정자/ radius, getarea() = 멤버 변수&함수
+접근 지정자 종류
private: 디폴트, 외부 접근 X
protected: 자식 클래스 접근 O
public: 모든 클래스 접근 O
- 클래스 구현부:
ex) double Circle:: getarea(){ return 3.14*radius*radius;}
여기서 double = 함수 리턴 타입
-> 선언부와 구현부를 나누는 이유는 클래스의 재사용을 위함임.
- 객체 생성: " 클래스이름 객체이름; " 으로 생성
멤버변수 접근 시 " 객체이름.멤버변수 = 변수; "
멤버함수 호출 시 " 변수 = 객체이름.함수이름; "
> 생성자
- 생성자란 객체가 생성되는 시점에서 자동으로 호출되는 멤버함수
- 특징: 객체 생성 시점에 오직 한번만 실행
생성자 함수의 이름= 클래스 이름
리턴 타입 및 void 선언하지 X
기본 생성자는 자동으로 생성
생성자 중복 가능
- 위임생성자: 생성자가 다른 생성자 호출하는 것이며 코드 간소화를 위한 것
타겟 생성자: 객체 초기화 전담, 위임 생성자: 타겟 생성자를 호출하는 생성자
ex) Circle::Circle() : Circle(1) { } <- 위임 생성자에 해당
Circle::Circle(int r){ ~ } <- 타겟 생성자에 해당
- 기본 생성자: 디폴트 생성자, 클래스에 생성자는 반드시 있어야 하므로 생성자 X 시 자동으로 생성해줌.
> 소멸자
- 객체 소멸 시점에 자동으로 호출되는 클래스의 멤버함수
- 오직 한번만 자동 호출(임의호출 X), 메모리 소멸 직전 호출됨
- 선언 및 구현: ~ Circle(); / Circle::~Circle(){ ~ }
- 특징: 동적으로 할당받은 메모리 반환 등의 마무리 작업을 위해 사용
리턴타입 및 매개변수 없음, 중복 선언 불가능함
선언되어 있지 않으면 기본 소멸자 자동 생성
- 지역 객체: 함수 내에서 선언된 객체, 함수 종료 시 소멸
- 전역 객체: 함수 바깥에서 선언된 객체, 프로그램 종료 시 소멸
* 객체 소멸 순서는 생성 순서의 역순이다.
>접근 지정
- 객체 보호 및 보안을 위해 사용
- 종류 세 가지는 위에서 (초록 글씨) 한번 정리함.
- 특징: 접근 지정자는 여러번 사용 가능
기본 원칙은 비공개, 멤버 변수는 private 으로 지정하는 게 바람직하다.
> inline 함수
- 오버헤드: 실행 도중 동떨어진 위치에 코드를 실행할 경우 추가적으로 시간, 메모리, 자원이 사용되는 현상
- 실행 속도 저하를 위해 도입된 기능, 함수 앞에 inline 키워드 붙여서 선언
- but 컴파일러의 판단에 따라 불필요하면 무시됨.
- 자동 inline 함수: inline 선언이 없어도 자동으로 인라인함수 처리될 수 있음.