배운것중 키워드를 뽑으라면 추상화 , 실수 python 입문 정도라고 생각한다.
추상화, 프로그래머가 유일하게 하는일을 뽑으라면, 나는 프로그래밍이라 답했는데 원하는 답은 abstraction 였다.
일단, procedural programming 절차지향이라고 쓰지만, 함수지향(?)이라고 보는게 어떤가라고 하셨다.
oop (object-oriented-programming) 객체 지향과 비교하면서 보면 될 것 같다.
그렇다면 절차지향 프로그래밍에서 추상화란 무엇인가?
함수를 시그니처(인터페이스) 와 내부구현(implementation)으로 구분하는것이다.
함수 시그니처에는 함수이름, 매개변수, 결과값이이 존재하니 사용자는 내부구현을 몰라도 시그니처만 알면
개발자들이 내부 구현을 해놓은 것 이다. 이렇게 함수 시그니처 들을 모아놓은것을 문서(document)라고한다.
다만, 함수 시그너처가 같아도 작성한 알고리즘에 따라 시간복잡도가 달라지기 때문에 어떻게 구현하는가가 실력을 가르는 것 같다.
프로그래밍에서의 추상화를 보았으니 언어에서의 추상화를 보자
언어추상화
고급,저급 high-level언어, low-level-언어를 가르는 것은
일단 로우 레벨언어는 어셈블리어 밖에없다. 이것은 하드웨어(cpu에 의존적이다) 여기서 한단계 벗어난다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
고레벨언어는 하드웨어 의존에서 벗어난 언어들을 말한다( c, c++ 이후)
다만 이들은 메모리에 의존을 한다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
고레벨언어이며, 하드웨어의 의존을 받지 않고 또한 메모리까지 의존하지 않는 언어들이 있다 (java, c#이후) 이들은 언어 자체가 메모리 할당/해제, 가비지 컬렉션의 기능이 있다. 다만 이영역의 언어들까지는 컴파일러에 의존해 기계어로 번역되는데,
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
컴파일러의 의존까지 벗어난 언어를 python/JavaScript등이 있다. 이언어는 인터프리터 언어로 컴파일러까지 의존하지 않는다.
high레벨, low레벨이라 고급이다 저급이다 라는건 번역의 문제고 상황과 목적에 따라 쓰는 언어를 잘 선택해야 된다.
생산성 vs 성능의 측면이다. 일단 저급어인 어셈블리어를 제외한 고급어부터는 c나 c++같은 경우엔 생산성이 다른 영역의 언어보단 낮다.
다만 성능이 좋다, 다른 영역의 언어들역시 각자의 특성을 갖기 때문에. 웹같이 생산성이 중요한 측면에서는 JS,python
게임같이 성능이 중요한 영역에선 c,c++을 사용하면 된다( python으로 게임을 만들면 너무느린 예)
실수
실수의 표현방식중 부동소수점, 그중 단정도 배정도 공부를 했었고, 그중 현재 내가 알아야할 언어인 JS는 배정도를 사용하고 있다.\
이에 따라 8바이트로 실수를 갖는다? 표현한다?
1비트의 부호싸인, 11비트 정수부, 52비트의 가수부가 존재한다.
예를들어, 10.625라는 십진수 실수를 이진화하면, 1010.101 이라는 이진수가 되고,
이를 정규화시키면 1.010101x2^3이 된다. (정규화란, 한자리수의 0이 아닌 자연수르 정수부를 변경시키는것 즉,2진법에서는 1뿐)
공식 +-.man x2^exp-bias에 따라
부호는 0, exp-bias=3 man=010101이 되고
수 = 지수부 - bias이므로 수+bias= 지수부가 된다
위에선 3 = 지수부 - 1023이 되어서 지수부= 1026이 되고
부호비트 0, 지수부 10000000010 man이 010101 나머지 46(52-6) 비트는 0으로 채워진다
이를 작성하면 10.625는
0|10000000010|010101 ...0 (46개) 가 된다
이 범위안에서만 수를 표현할 수 있어서 자바스크립트에서 실수 계산시 문제 상황이 발생할 수 있고,
10.625 이후 다음에 표현할 수를 알기위해 epsilon을 알아야한다
위의 0|10000000010|010101 ...0 (46개)에서 끝에 52번째수가 1로 올라간것이 다음수인데)
앱실론을 1.0과 그다음 표현할 수 있는 수 사이의 차이라고한다
10.5와 그다음 표현 가능한 수의 차이는
diff = 2^E x epsilon = 2^E x 2^-52
=2^49이 된다
이 수를 수학자들이 diff값은 |num|x epsilon과 비슷하다고 결론을 내려주셨다
그래서 절대 비교와 상대 비교가 나온다 절대비교와 상대비교는 코드로 작성해서 비교해보겠다
https://github.com/hbsowo58/FastCampus_Summary/tree/master/basic
파이썬 입문
파이썬은 동적 타이핑이다 (dynamic typing)
또한 기존의 알고있던 박스 모델은
a=10이라고 선언시, a라는 상자에 10을 넣었고, a=20으로 바뀐다면 아까 상자에 20으로 바뀌는것인데
파이썬은 a라는 이름객체, 10이라는 값 객체라 a -> 10 a라는 이름객체가 10이라는 값객체를 가리키는 상황에서
a=20을 입력하면, 20이라는 새로운 상자를 만들고 a -> 20가리키는 상황으로 만들어 10이라는 상자가 자신을 가리키는것을 잃어 소멸되
는 방식이다 이것을 기존에 내가 알던 방식을 박스 모델이라고 하는데, 파이썬은 박스모델이 아니다.
또한 a = 127; a++ 하면 -128이 나오는 정수 오버플로우 현상같이 오버플로우가 안나는대신 경계검사를 하여 속도가 느리다
mutable object(변경 가능객체)| immutable object(변경 불가능객체)
리스트 |정수,실수,상수 ( a=10, a=20의 예)
딕셔너리 | 문자열
집합 | 튜플
'공부 > TIL-D' 카테고리의 다른 글
함수 (0) | 2019.04.20 |
---|---|
오늘 배움에 - 깊이를(연산,가위바위보,버블소트) (0) | 2019.04.19 |
오늘 배운것 자세히 (0) | 2019.04.17 |
<picture>태그 <source>태그 background-size속성 (0) | 2019.04.16 |
오늘의 배운것 자세한 내용 (0) | 2019.04.15 |