3.1주차
📌 chapter 4. Computation
You already know,,,
이미 이 수업은 대부분의 문법에 대해서 알고 있음을 가정하고 있음. if, for, while, functions.. 등
structual에서는 function을 잘 사용할 수 있는게 중요하다. function으로 divide & conquer을 한는게 중요하다.
What i will show you today is mostly just vocabulary and syntax for what you already know.
Computation
Computation이 뭐야? -> 컴퓨터라는 얘기는 컴퓨트 하는 놈이라는 뜻. 일종의 state 머신.. state 머신이란 A라는 state를 B라는 state로 변경. 이론적인 기반을 현실화 한 것이 컴퓨터이다. 처응메는 수학적 이론에서 출발 -> 발전시키면서 중요한 사람이 튜링, 튜링 머신, state 머신 등 다양한 개념들이 있었음 -> 실제로 돌아가도록 하는 것이 컴퓨터이다. state 머신이 한 예
3, 1, 2 (현 state) -> state 머신 -> (1, 2, 3)
프로그래밍이라는 것은 state가 RAm에 등장 ramㅇ 존재하는 초기 값을 input, 메모리에 저장되는 값을 output. input state -> 프로그래밍, Computation -> output state
여기서 프로그래밍을 우리가 해야되는데 여기서 중요한 덕목이 있다.
- correctly(딱 원하는 output으로,,!) -> 이 과정에서 결과를 달성할때가지의 드는 비용(시간과 메모리)을 최소화하고 싶어 한다. / 상대적으로 시간이 좀더 중요하다. (거래 불가대상)
- correctly까지 가는 과정이 simply & efficiently
correctly 를 위해서 efficiently하게 접근해야되는데, 그 과정은 simply하게 하면 좋다.
One tool is called Divide and Conquer
sub task로 쪼개서 문제를 해결해라. 부러뜨리기 위한 전략은 쪼개라. 낱개로 divide하면 divide, conquer하기 쉽다. -> 코드로 어떻게 구현? Function 각각의 sub task로 나눠서 define -> main에서는 call만 하면 됨.
Another tool is Abstraction
핸들, 기어, 패달만 신경쓰면되지, 엔진 돌아가는 거 보이고, 기름 지나가는 거 보이고 걍 다보여,,, -> 그럼 매우 당황스럽다. 즉, 필요한것만 보여주고 필요없는거는 보여주지 말자.
Organization of data is often the key to good code.
language features
- operator
-
if 문 등장 중요
1차원 적으로 수행하는 machine. 일열로 수행해야되는 명령어들의 집합 -> if문이 없다면 이 프로그램은 언제나 고정, 결과는 동일 = 표현력이 제한력, 정해져있는 하나의 flow, expression power 제한
if의 선택에 따라서 결과가 다르게 나올 수 있다. = expression power가 증가
-
while은 라인수를 줄이는 효과, expression power는 별로 상관 X.
- Function은 재활용용, 역시 라인수를 줄어주는 효과, deivide conquer로 문제의 해결을 쉽게 도와줌
Expression
- binary operator
- unary operator
statements
semicolon까지가 한 문장.
Iteration(while loop, for loop)
c시절
#include <iostream>
int main()
{
int i;
for (i = 0; i < 100; i++)
{
printf("%d", i);
}
printf("%d", i);
}
c++에서는 괄호안에서 선언 가능하도록 함.
#include <iostream>
int main()
{
// int i;
for (int i = 0; i < 100; i++)
{
printf("%d", i);
}
// printf("%d", i); -> scope 종료
}
반복 횟수 실수 주의
functions
기본적으로 선언과 정의가 있다. 선언은 리턴 타입, 매개변수 개수, 매개변수의 리턴 타입을 결정하는 것이다.
#include <iostream>
int main()
{
myfunc();
}
void myfunc()
{
std::cout << "my" << std::endl;
}
컴파일러 에러 발생: 위에서 아래로 읽음로 없는 함수가 됨.
sol 1.
#include <iostream>
void myfunc()
{
std::cout << "my" << std::endl;
}
int main()
{
myfunc();
}
sol 2.
#include <iostream>
// 선언
void myfunc();
int main()
{
myfunc();
}
// 선언 + 정의
void myfunc()
{
std::cout << "my" << std::endl;
}
❗
#include <iostream>
// 선언 -> 중복이 되어도 문제가 없어.
void myfunc();
void myfunc();
int main()
{
myfunc();
}
// 선언 + 정의
void myfunc()
{
std::cout << "my" << std::endl;
}
여기까지가 C의 문법
C++에서 확장된 문법
#include <iostream>
// 선언 + 정의
void myfunc()
{
std::cout << "my" << std::endl;
}
void myfunc(int a)
{
std::cout << a << std::endl;
}
int main()
{
myfunc();
myfunc(5);
}
void myfunc()
, void myfunc(int a)
는 다른 함수로 취급. 파라미터로 구별을 할 수 있으면 중복을 허용해주자! = 폴리모피즘.
함수명 + 매개변수 개수/데이터형만 검사 -> 리턴형만 다르다고 다른 함수가 아니다.
이 정도도 가능. 매개변수 개수가 같은데 데이터형만 다른 경우.
#include <iostream>
// 선언 + 정의
void myfunc();
void myfunc(int a);
void myfunc(double a);
int main()
{
myfunc();
myfunc(5);
myfunc(5.5);
}
void myfunc()
{
std::cout << "my" << std::endl;
}
void myfunc(int a)
{
std::cout << a << std::endl;
}
void myfunc(double a)
{
std::cout << a << std::endl;
}
>>>
my
5
5.5
장점
- 코드의 재사용 / 효율성
- control flow clear => 언제가 함수쪽으로 갔다가 다시 돌아옴.
- divide & conquer 가능 🌟🌟🌟
vector
-
array:
- 장: 연속된 메모리
- 단: 연속된 공간을 미리확보하는 거라서 메모리 할당량이 제한되어있다. = 확장성이 없다 / 삽입, 삭제가 어렵다.
-
linked list:
- 장: flexable, 삽입 / 삭제가 쉽다. = 딱 필요한 만큼만 메모리 사용.
- 단: direct 접근 불가.
둘의 장점을 섞을 수 없을까?
그 희망사항때문에 태어난 게 Vector이다. random access 가능, space에 대한 효율성도 보장. 기본적으로 array인데, 더블링을 하는 array = 두배씩 늘린다.
1개 배열 -> 하나 와 -> 2개 배열 / 첫 번째 배열 복사 + 추가된 값 -> 하나 추가 -> 4개짜리 배열 / 첫 번째, 두 번째 값 복사 + 추가된 값 -> …
❓ 근데 추가 삭제는 어떻게 해결? 배열은 추가 삭제가 유동적이지 않고 비효율적이잖아..
A: => 근데 이 문제는 그냥 배열의 형식 그대로 진행된다. 추가/삭제에 대해서는 비효율이지만 direct 접근과 필요한 만큼만에 대한 메모리 유동 추가에 대한 장점은 가진다.
댓글남기기