cs를 customer service로만 알고 있었던,,, 나를 반성하면서 Computer Science 알기위해 도서관에서 책을 빌려보았다.. (사실 책 구경하다가 우연히 보게 됨 ㅎ;)
컴퓨터과학이라는 학문이. 컴퓨터과학은 컴퓨터가 문제 해결에 어떻게 활용될 수 있는지 보여주었다. 결국 프로그램을 효과적으로 작성하려면 컴퓨터과학을 필수적으로 배워야 한다..
⇒ 프로그그래밍적 사고력을 요하는 개발자는 결국 코딩을 잘 해야하는데 이를 효과적으로 작성을 하려면 컴퓨터과학은 필수적으로 배워야 한다.
모든 사람은 프로그래밍을 배워야 한다. 프로그래밍은 생각하는 방법을 가르쳐주기 때문이다 - 스티브잡스
$
컴퓨터 프로그램도 결국 절차이기에 사람이 봐도 이해할 수 있도록 그릴수 있어야 한다.
아래 대전제를 기억해보자
vscode에서도 .excalidraw 파일로 업로드 가능하다.
수리논리학에서도 변수와 연산자를 이용해 사물의 타당성을 나타낸다고 한다.
eg) “만약 수영장의 물이 따뜻하면, 나는 수영하겠다. “
이 명제가 타당하기 위해서는 다음 두 명제가 타당해야함.
A : 수영장의 물이 따듯하다.
B : 나는 수영한다.
이러한 명제는 True 또는 False 둘 중하나만 될수 있다.
참고 … fuzzy logic 이라는 개념에 의해 명확하게 정의될 수 없는 지식을 표현하는 방법이 있다고 한다.
eg ) 참과 거짓이라는 2개의 값만을 가지는 고전적인 이진 논리에서 벗어나 참과 거짓으로 명확히 선을 그을 수 없는 예를들어 저는 키가 177~8정도 되는데 키가 큰 편일까요? 등
이 처럼 이러한 한계점을 극복하기 위해 논리식의 값이 구간 [0, 1] 사이의 값을 가질 수 있도록 정의한다고 합니다.
위 예시의 명제에서 따듯한 물에서만 수영할 것을 뜻하는건 아닙니다. 이 명제는 차가운 수영장 물에 대해서는 아무것도 약속하지 않았다. 달리 말해 A→B는 B→A를 의미 하지 않는다.
만약 두 명제가 서로 의존하다는 것을 나타내려면 ‘상호조건명제’를 사용하면 된다.
A ←→ B : 만약 수영장의 물이 따뜻하다면, 그리고 오직 수영장의 물이 따뜻해야만 나는 수영하겠다.
어디까지나 상호조건명제에서만 그렇지 일반적으로 A→ B에서 B → A를 추론하지말자. 이렇게 추론하는 것을 ‘도치 (inverse)의 오류’ 리고 한다.
이처럼 우리가 알고 있고 앞으로 학습할수 있는 여러 연산자(논리, boolean, 진리표등)을 통해 논리적인 사고력을 길러보자.
여,,,기에서는 다양한 문제에서 나올 수 있는 결과나 구성의 가짓수를 세는 수학정 방법론과 확률 계산의 기본 원칙을 다루고 있어 pass 합니다. (아마 전공 과정에서는 이를 이산수학이라고 지칭하는거 같네요)
어느 책에서 본 적이 있는데 사람이 집으로 갈 때는 무의식적으로 익숙한 주위를 보면서 가지만 컴퓨터는 도착지와 현재 위치 기반으로 어디를 어떻게 거리는 얼마나 등을 고려해야 한다 했습니다. 이처럼 컴퓨터에게 어떠한 명령을 하려면 논리를 기반으로 프로그래밍을 해야하는게 중요하며 위 4가지 속성아래 진행해야한 다는 것을 알수 있습니다.
“ 말하는 대로 프로그램이 바로 만들어지는 프로그래밍 언어는 없나요? “ 하고 말하는 사람을 보면, 막대사탕을 물려주라.
- 앨런 퍼리스 Alan Jay Perlis ( 참고로 앨런 퍼리스는 컴퓨터과학의 노벨상인 튜링상을 최초로 수상한 미국의 컴퓨터 과학자,,,
머지 않아 사람이 쓰는 언어로 컴퓨터에게 할 일을 지시하는 날이 오겠지만, 현재까지는 기계가 해야 할 일을 제약 없이 지시할 수 있는 능력을 가진 사람은 프로그래머뿐이다. 내리고 싶은 명령을 프로그래밍 언어(기계가 이해하는 언로)로 표현해야지..
값은 (value)은 정보를 나타낸다. 값은 정말인지 중요하기에 프로그래밍 언어의 ‘일급 시민’이라고 부른다.
” 1급 시민 “ 또는 “ 1급 객체 “ 라는 용어는 해당 언어의 요소가 다음과 같은 특성을 갖추었을 때 사용된다고 한다.
a. 변수나 데이터 구조 안에 담길 수 있음
b. 함수의 인자로 전달될 수 있음
c. 함수의 결과로 반환될 수 있음
d. 할당에 사용된 표현식 내에서 리터럴로 표현될 수 있음
⇒ eg. Javascript에서 함수는 1급 객체라고 할수 있다. 대표적인 전통적의 객체지향 프로그래밍 언어인 Java는 함수를 1급 시민으로 취급하지 않았지만 Java 8부터 람다 표현식을 도입하여 함수형 프로그래밍 스타일을 어느 정도 지원하기 시작했다고 한다.
참고로 람다 표현식(lambda expression)이란 함수형 프로그래밍을 구성하기 위한 함수식이다.
eg
int add(int x, int y) {
return x + y;
}
// 위의 메서드를 람다 표현식을 이용해 아래와 같이 단축 시킬수 있다. (메서드 반환 타입, 메서드 이름 생략)
(int x, int y) -> {
return x + y;
};
// 매개변수 타입도 생략 할 수 있다.
(x, y) -> {
return x + y;
};
// 함수에 리턴문 한줄만 있을 경우 더욱 더 단축 시킬 수 있다. (중괄호, return 생략)
(x, y) -> x + y;
출처: [https://inpa.tistory.com/entry/☕-Lambda-Expression](https://inpa.tistory.com/entry/%E2%98%95-Lambda-Expression) [Inpa Dev 👨💻:티스토리]
식(expression)은 값을 생성하는 표현이다.
값을 생성하는 방법에는 크게 두가지가 있다.
a. 리터럴(literal)을 작성하는 방법
b. 함수를 호출해 구하는 방법
eg. 3
코드에 표기된 문자3이 의미하는 대로 값3이 바로 생성된다. 코드의 표현을 그대로 값으로 옮기는 말그대로 literal 것이다.
함수의 경우, 다른 어딘가에 작성된 방법이나 절차에 따라 명령을 수행함으로써 값을 생성하는 것이다.
사실 식이란, 우리가 어떻게 작성하더라도 컴퓨터의 계산 과정에서 하나의 값으로 축약되기 마련이기에 연산자를 이용하면 여러식을 하나의 큰 식으로 결합하고, 이것을 다시 한층 더 큰 식으로 만들수도 있다.
식이 값을 나타내는 데 사용된다면, 문(statement)은 컴퓨터에게 무언가를 수행하도록 명령하는 데 사용된다.
eg. print(”hello world”) 라는 문은 메시지가 출력되도록 하는 것 처럼
일부 프로그래밍 언어는 정의(definition) 라는 특별한 문을 제공하며, 정의는 새로운 값이나 함수처럼 이전에 존재하지 않았던 대상을 추가하여 프로그램의 상태를 변경하는 것.
정의된 대상을 가리킬 수 있으려면 이름을 대상에 연관시켜 두어야 하고 이를 이름 바인딩(name binding)이라고 한다.
변수는 이름 바인딩(이름과 값을 묶는 매개) 중에서 가장 대표적인 것
변수는 어떤 값이 저장된 메모리 주소와 이름을 연결한 것.
변수에 특정 유형(정수, 부동소수점 수, 문자열 등)이 있기에 이 변수의 유형을 통해 프로그램은 변수의 메모리 블록에서 읽어들인 비트(0과 1)들을 어떻게 해석해야 할지 알 수 있다.
변수가 어디에서 유효하게 사용될 수 있는지는 변수의 유효 범위(scope)에 의해 정의된다.
eg. 전역변수
전역에서 유효한 모든 이름은 이름공간(namepace)을 구성한다. 불필요한 것들을 이름공간에 추가하면 이름 공간이 더렵혀지게 되고 이를 이름공간 오염(namespace pollution) 이라고 한다.
패러다임은 코드를 작성하는 형식과 기술을 결정한다.
프로그래밍 언어 구조와 프로그래밍 패러다임을 간략히 살펴 보았다. 앞으로 다양한 프로그래밍언와 패러다임이 생길 것이기에 이러한 개략적인 구조를 이해하였으니 어떤 언어가 등장하든 가볍게 접근할수 있도록 해야겠다!