우아한테크코스/레벨1

[책] 코딩을 지탱하는 기술

nauni 2021. 2. 12. 21:14

책을 읽게 된 계기

우테코 필독서 리스트에 있어서 읽게 되었다. 얇지만 사실 책이 재미없어 보였다. 필독서에 읽고나서 블로그에 정리해보면 좋다고 하니 읽기 시작했다. 읽을수록 왜 필독서에 있는지 알겠다는 느낌을 받았다. 프로그래밍을 하는 전반에 깔려있는 원리와 기본 개념들이 나오게 된 배경부터 여러 언어들에서 공통된 내용과 차이를 설명해주고 있다.

나의 이해를 바탕으로 한 책 내용정리

1. 컴퓨터 언어는 사람✨이 사용하기 편하게 발전해왔다.

컴퓨터 언어는 기계(컴퓨터)에게 일을 시키는 방식이다. 기계가 이해하는 언어인 바이너리코드(0과1의 조합)로 일을 바로 시키는 것이 가장 빠르다. 하지만 이것은 사람이 일을 시키기가 힘들다.😥 따라서 어셈블리어가 나오게 되었고, 이식성의 문제 등으로 C언어가 나왔다. 그 이후에 Java, Python, JS 등 더 사람이 사용하기 편한 언어들이 나왔다. 어떤 부분까지를 속도가 느려지는 대신 사람이 신경쓰지 않고 그 언어가 처리해 줄 것인지에 따른 차이이다.

 

컴퓨터 언어는 속도와 편리함 사이에서 각기 다른 특색을 가진다. 어떤 부분에서 사용을 편하게 할 것인가에 따라서 다양한 특징을 가진 언어들이 나온 것이다. 각 언어마다 문법, 규칙이 다르고 강점, 약점이 다르기 때문에 본인(사람)이 추구하는 특징에 부합하는 언어를 사용하면 된다.

 

여러 언어가 특색에 맞게 나왔지만, 그 언어들 사이에도 공통적으로 사용되는 부분들이 있다. 결국은 컴퓨터에게 일을 시키기 위해 바이너리코드로 변환하는 과정이 있고, 공통적인 특징을 가지고 있다. 어떤 언어를 배우든 if, while, 타입, 함수를 만드는 방식 등의 공통적인 내용이 있다. 그 외 작성 문법이 어떻게 다른지, 그 언어의 장점과 단점 등을 학습하게 된다.

2. goto를 편리하게 사용하기 위해 조건문과 반복문의 등장

if, if-else, while문이 왜 나오게 되었을까? 이것은 goto로 작성하던 문법을 더 가독성 좋게 만들기 위해 나온 것이다! 조건에 따라 점프하기 위해서 goto 방식의 명령을 사용했는데, 이것은 가독성이 떨어진다. 더 읽기 편하라고 if, if-else, while등의 문법이 등장하게 된 것이다.

3. 공통된 부분을 재사용하기 위한 함수의 등장

같은 내용을 계속 작성하는 것은 팔 아프고, 계속 생성해내는 것도 메모리 낭비이다. 따라서 공통적으로 사용되는 부분을 묶어서 재사용하기 위해서 함수가 등장하였다. 처음 프로그래밍을 배울 때, 함수를 왜 만드는지 이해가 안 되었다. 언제 변수나 함수를 만드는 것이고, 왜 만드는지 궁금했다. 내가 내린 결론은 귀찮게 같은 내용을 한번 더 써야되면 변수선언이나 함수로 만들어 재사용하자는 것이다. 실수도 줄이고 팔도 안 아프다😁

4. 실패를 처리하는 방식과 짝꿍처리

실패하는 경우 어떻게 처리할 것인지 정해두어야 한다. 더 큰 실패가 일어나기 전에 작은 실패에서 인식하고 바로잡아야 하기 때문이다.

실패를 처리하는 방식

1. 결과로 반환(return)하여 알려주는 방식

이 방식은 `실패를 결과값으로 알려줄테니 나중에 처리해` 방식이다. 실패 처리하는 것을 잊을 수도 있고, 처리하는 코드를 여기저기 작성하게 되면 전체적인 가독성이 떨어지는 단점이 있다. 

 

2. 실패하면 점프하는 방식 

실패하면 어딘가로 점프(goto)하는 방식이다. 이렇게 작성하면 원래 코드와 실패했을때 처리하는 코드가 분리가 된다. 실패했을 경우 점프할 코드를 사전에 등록하는 방식이다. 

실패할 것 같은 처리를 묶는 구문 (ex: try-catch-finally)

실패할 것 같은 항목을 try에 넣어서 catch로 처리방식을 묶어주는 방식이다. 이때, finally가 도입된 이유는 마무리해주기 위해서다. 무언가를 열었다면 짝이 되는 것이 닫는 것이다. 파일을 열었다면 닫아야 하고, lock을 했으면 unlock을 해주어야 한다. 이런 것들이 실패를 하든 안하든 마무리 처리를 해주기 위해서 finally가 생겼다. 

 

5. 스코프와 이름

쉽게 인식하기 위해서 이름이 필요하다. 이름이 없다면 메모리 주소값으로 불러야할 것이다. 이름이 있더라도 스코프가 없이 전체를 하나로 사용하면 그 이름을 구분짓기가 힘들다. 겹치는 이름이 있으면 안 되기 때문에 스코프가 없다면 모든 이름을 지을 때마다 달라야 한다. 따라서 편리한 구분을 위해 스코프라는 개념이 생겼다. 스코프가 다르면 이름이 구분되기 때문에 다른 스코프에 있는 이름과 중복될 수도 있고 탐색 범위도 좁아진다. 

 

특히 함수마다 스코프가 개별적으로 생성되는 정적 스코프 구조를 따르고 있다고 한다. 언어마다 특징이 다르지만, 가까운 스코프를 먼저 탐색하고 없을 경우 전역 스코프를 탐색하여 값을 찾아낸다. 이것은 상속받는 클래스에서도 마찬가지고 적용된다. 

6. Type이 왜 나왔는가

컴퓨터 언어를 작성한다는 것은 컴퓨터에게 일을 시키려는 것이다. 컴퓨터는 binary로 표현된 값들로 일을 한다. 결국 0과 1의 조합이고 모든 정보는 0과 1로 표현된다. 컴퓨터에서 효율적인 표현(적은 표시값으로도 큰 숫자를 표현)이 가능하게 십진수보다는 이진수가 선택되었다. 

 

모두 2진수로 표현되지만 어떤 타입이냐에 따라 규칙이 다르다. 예를들면 정수, 소수도 모두 2진법으로 표현된다. 0과 1로만 표현하기 때문에 정수와 소수를 표현하는 규칙이 다르다. 어떤 규칙을 적용해서 인식할 것인지 컴퓨터에게 알려주기 위해서 type 이라는 것이 나왔고, 숫자뿐만 아니라 다양한 타입으로 발전하게 되었다. 

7. 불변과 병행처리

컴퓨터가 발전할수록, 한군데에서만 값을 사용하는게 아니라 여러군데에서 동시에 값에 접근하여 처리할 수 있게 되었다. 값을 공유할 때, 하나의 값인데 서로 다르게 변경하면 혼선이 생긴다. 따라서 한 번에 하나만 접근하게 하는 등의 동시성 처리가 중요해졌다. 하지만, 변경되지 않는 값이 있을 수도 있다. 이런 경우 누구도 변경시기키 않고 어디서나 같은 값을 가지고 처리할 수 있게 하기 위해 불변을 처리가 중요해졌다. 

8. 객체지향, 상속

컴퓨터 언어의 발전은 사람이 사용하기 편하도록 발전했다. 객체지향이나 상속 또한 마찬가지이다. 객체지향이나 상속 모두 그 자체가 중요한 것이 아니라 사람이 사용하기 편하게 하도록 생겨났다고 생각한다. 일반 세계를 컴퓨터 세계에 반영하여 사람이 이해하기 편하도록 만들어진 것이다.

정리

이 책을 읽으면서 든 가장 큰 생각은 프로그래밍에서 사용하는 모든 것들은 사람이 사용하기 편한 방식으로 발전했다는 것이다. 무언가의 개념을 배울 때, 그 개념으로 인해 사람이 어떻게 더 편해졌는지를 생각하면 그 원리나 본질을 깨닫기 수월해질 것 이라는 생각이 든다.