절차지향 & 객체지향
절차지향 - C언어
{
a;
b; a -> b -> c '순서대로' 수행
c; -> 대규모 project에 부족함이 있다.
}
대규모 프로젝트 => 각자의 관계가 중요해진다.
객체 간의 관계를 연결/상호작용의 능력이 중요하다.
객체지향 - C++
Class <- 함수 + 구조체 (모양)
추상 개념 : 설계 <- 추상 class
Class 분리
실체 구현 <- Implementation
개념과 구현을 분리하자!
Hello World로 본 C++
std::cout << "Hello, World" << std::endl;
std : namespace '소속'으로 생각
:: : '범위 지정 연산자' ~안에 들어있다.
cout : 출력을 담당하는 객체
endl : end of line 한줄을 띄운다.
<< : Redirection
terminal 에서 어떤 내용을 어떤 곳에 넘길 때 사용되는 명령어
모든 장치는 file로 추상화 되므로, I/O관련 장치가 추상화된 file에 내용을 '넘긴다(쓴다)'의 개념으로 이해
즉, std에 속한 cout 객체에게 "Hello, World"와 std에 속한 end of line이라는 것을 출력해 달라고 넘겨준다.
C vs C++
C - 물건(함수)를 사용자(개발자)가 잘 써라
C++ - 사용하기 쉬운 물건(객체)를 '잘'만들어서 사용자(개발자)에게 제공하고, 사용해라.
어떤 일을 할 때 그 일을 잘 수행하는 객체에게 일을 맡긴하는 개념을 가지자.
행위의 주체와 이용하는 주체를 분리하자.
=> 구조가 간결해지고 큰 틀을 만들고 세세한 부분을 차후 개발하기 용이하다.
Instance
일종의 '예시'라고 볼 수 있다.
ex)
철수는 사람이다. 라고 할 때 철수는 사람이란 형식의 하나의 '예시'가 된다.
int a; a는 int라는 자료형에 대한 하나의 '예시' 즉, 인스턴스이다.
변수라는 단어 대신 Instance 라는 단어를 사용하자.
자료형
int a(10);
int b(a); 와 같은 방식으로 선언 및 정의가 가능하다. (물론 C Style도 가능하다.)
int (10); 이름없는 인스턴스 선언 및 정의 (이런것도 가능하다.)
auto
초기값 형식에 맞춰 선언하는 인스턴스의 형식이 '자동'으로 결정
함수포인터를 대상으로도 가능하다. (개꿀)
int a(10);
int b(a);
auto c(b); <- 자동으로 int형으로 선언
Memory 동적할당
malloc() - 성공, 실패를 반환값을 통해 판별이 가능하다.
허나 현재 왜앤만하면 실패하지 않는다 (고로 예외처리로 넘어갔다.)
=> 연산자로 재 탄생
malloc(), free() -> new, delete
형식 *변수이름 = new 형식
delete 변수이름
형식 *변수이름 = new 형식[요소개수]
delete[] 변수이름
굳이 memory 크기를 정하지 않아도된다.
배열형태로 동적할당한 것은 배열 형태로 삭제 해야한다.
new 연산자 객체 생성자 호출, delete 소멸자 호출
참조자 형식
참조자는 '별명'이다.
형식 &이름 = 원본; or 형식 &이름(원본);
Pointer가 가리키는 대상이 수시로 변할 수 있는 '변수'라는 점 때문에 생겨난 문법
선언과 동시에 초기화 해야한다.
처음 초기화한 대상을 변경할 수 없다.
구현상 '형식 * const 이름 = 원본'과 같이 선언한 포인터와 동일하다.
참조자 안에는 가리키고있는 변수의 주소가 들어있다.
간접 지정 연산을 사용하지 않는다.
call by reference 에서 함수를 call할 때 instance의 주소가 아니라 원형을 전달해야 한다.
그렇기 때문에 호출자 code만 봐서는 매개변수가 참조형식인지 아닌지 알 수 없다.
r-value 참조
int &&rdata = 3; 과 같은 꼴로 선언 및 정의
r-value만 참조가 가능하다.
이름이 없는 임시객체를 저장하기위해 나옴 (자세한 설명은 아직 할 수 없다함...)
범위 기반 for문
for (auto 요소변수 : 배열이름)
반복구문;
배열의 갯수에 맞춰 자동으로 반복 횟수를 결정한다.
배열의 내용을 변경하려면 요소 변수 자리에 참조형 변수를 사용하면 된다.
for (auto n : 배열이름)
반복구문; <= Read Only
for (auto &n : 배열이름) 의도치 않은 Write 실수를 막을 수 있다.
반복구문; <= Read / Write
- 출처 : 이것이 C++이다. (최호성, 한빛미디어)