에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🧸

[1일1로그 100일 완성 IT지식] 30번 '기술 표준의 중요성'

 

 

표준의 뜻은 '어떻게 만들어지고' '어떻게 작동하는지' 인데, 지역마다 콘센트와 콘센트 구멍의 표준이 다르다면 집에서 조금 먼 카페에 가면 핸드폰을 충전하기 쉽지 않을거다.

 

소프트웨어에도 많은 표준이 있다.

아스키코드, 유니코드 같은 문자 집합, C와 자바 같은 프로그래밍 언어, 암호화와 압축 알고리즘 등등..

종류와 규격이 동일하기 때문에 사용자가 편하게 사용할 수 있다!

 

표준은 상호운용성을 보장하고 공개경쟁이 이루어지도록 하는데 결정적인 요소이다.

 


[1일1로그 100일 완성 IT지식] 31번 '자유로운 소프트웨어, 오픈소스'

 

 

프로그래머가 작성한 코드는 보통 소스 코드라고 하고, 소스 코드를 컴파일한 결과는 오브젝트 코드라고 한다.

옛날에는 오픈 소스라는 개념이 희박해서 소스 코드에 저작권 등이 걸려있었고 해당 기업은 기업 비밀이 유출되는 소스 코드를 공개하지 않고 오브젝트 코드만을 공개하는 경우가 대부분 이었다.

그러다 사회 발전에 발맞춰 오픈소스가 대두되었고, 현재 구글 마이크로소프트 등 많은 기업들은 오픈소스 문화에 기여하는 부서를 따로 만들어 오픈소스 생태계에 기여하고있다. 우리 같은 프로그래머들은 정말 감사한일이 아닐 수 없다!

 

(위키백과 오픈소스란 -오픈 소스 소프트웨어는 소스 코드를 공개해 누구나 특별한 제한 없이 그 코드를 보고 사용할 수 있는 오픈 소스 라이선스를 만족하는 소프트웨어를 말한다. 통상 간략하게 오픈 소스라고 말하기도 한다.)

 

-오픈 소스에 대한 참고 블로그 https://brunch.co.kr/@bumgeunsong/15

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🧸

[1일1로그 100일 완성 IT지식] 28번 '구글 같은 서비스는 어떻게 개발할까?'

 

 

우리가 집을 짓는다고 생각을 해보자!

집을 지으려고 벽돌부터 만드는사람은 없을거다. 어떻게 이쁘게 지을지 설계부터 할거고, 잘 만들어진 부품들을 사올거고  부품들을 조립할거다. (물론 이렇게 간단하진 않겠지만ㅎㅎ)

[사진=게티이미지뱅크]

 

프로그래밍도 별반 다르지 않다.

대규모 프로그래밍을 할 때는 뭘 할지 파악하고, 큰 맥락에서 점차 작은 부분으로 적당히 나눠서 개인에게 업무를 분담하고, 각자 작업하면서 전체적으로 일관되어 있는지 확인을 하며 프로그래밍이 진행될거다.

(집 지을때 비유한 잘 만들어진 부품이란 프로그래밍 세계에서 라이브러리, 인터페이스, 개발 키트 등이 있다. )

 

 

이때 프로그래밍의 규모가 커질수록 협업하는 인원도 늘어날텐데 다들 아시겠지만 남의코드를 읽고 이해하는건 쉽지않다.. 때문에 개인으로 분담한 업무가 합쳐질때 여러 오류가 발견된다.

 2015년 구글 발표에 따르면 당시 구글의 전체 코드는 20억 행이라고 하니(omg) 중간중간 얼마나 많은 오류가 있었을지 생각만해도 어지럽다.

실제로 소프트웨어 개발 기업에는 구현코드보다 오류를 검증할 테스터 코드가 더 많고, 프로그래머보다 테스터가 더 많다고 한다.

 

소프트웨어의 발전 방향!

환경이 빠르게 변하는 만큼 프로그램도 거기에 맞춰 변화해야한다. 새로운 하드웨어가 개발되면 새로운 소프트웨어가 필요하다. 이 때문에 시스템을 변경해야 할 수도 있다. 또한, 새로운 법이나 기타 요구사항이 등장하면 프로그램의 사양이 바뀐다. 예를들어, 세법 프로그램의 경우는 세법이 바뀔 때마다 해당 프로그램을 바꿔줘야한다.

빠르게 변하는 환경에 맞춰 소프트웨어를 유지보수 해야한다. 안그러면 소중한 내 코드를 금방 못쓰게됨ㅠ

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🎃

[1일1로그 100일 완성 IT지식] 27번 '작문과 비슷한 프로그래밍'

 

 

저자는 여러 프로그래밍 언어를 소개하고, 프로그래밍을 작문과 비유한다.

글을 쓸 때 문체와 적절한 어휘 사용이 중요하듯이, 프로그램을 작성할 때도 적절한 프로그래밍 언어를(자바 파이썬 등)

사용하고 적절한 코드를 쓰는건 중요하다!

 

 

다음은 대표 언어들의 특징을 알아보자

 

C 언어 - 시스템 프로그래밍 용도로 사용되는 언어의 대표! (시스템 프로그래밍 용도의 언어 _어셈블러, 컴파일러, 텍스트 편집기 같은 프로그래머 도구와 운영체제까지 작성할 목적의 언어)

 

 

자바 - 프로그래밍을 빠르고 편하게 하기위해 개발던 언어 중 하나!원래는 속도는 그다지 중요하지 않지만 유연성이 중요한 가전 제품과 전자 기기 같은 작은 임베디드 시스템에 적용할 목적 이었다. 또한, 자바스크립트처럼 웹페이지상에서 실행할 용도로 변경되었지만 인기가 없고, 지금은 웹 서버에 널리 사용되고있다.(JAVA -spring)

 

자바스크립트 - 처음부터 웹페이지의 동적인 효과를 구현하기 위해 브라우저 내부에서 사용할 목적으로 설계되었고, 현재 거의 모든 웹페이즈는 자바스크립트 코드를 어느 정도 포함하고있다!자바스크립트는 언어 자체가 단순해 만들기 쉽고 컴파일러가 모든 브라우저(ex. Chrome)에 내장되어 있어 콘솔창에 바로 실행 할 수 있다.

 

파이썬

 - 가독성에 초점을 두고 설계되었다. 파이썬은 배우기 쉽고, 쉽고 간결한 문법으로 생산성이 높아 개발도 빠르다.

다른 언어나 라이브러리에 쉽게 접근 & 연동할 수 있어 확장성도 높고 , 이미 수많은 생태계와 커뮤니티가 형성되어 있어 라이브러리가 미친듯이 많다. 다양한 장점으로 저자도 언어를 하나만 꼽자면 파이썬을 꼽았을 정도다!

 

 

 

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🎠

[1일1로그 100일 완성 IT지식] 26번 '고수준 언어에서 프로그램 실행까지'

 

 

어제 자 주제랑 비슷해서 어떻게 정리할까~ 고민했는데 한번 복습하는게 좋을것 같당.

또, 저자가 뒤에 얘기하는 프로그래밍 언어 포트란/ 코볼/ 베이직 은 스킵하는게 제 독후감에 더 목적적합한것 같당.

 

일전에 내용처럼 옛날 프로그래머들은 0과 1을 컴퓨터에 직접 입력을 해주어야했습니다.

그러다가 어셈블리어와 어셈블러가 나오면서 프로그래밍 효율성이 폭발적으로 증가했고!

고수준 프로그래밍 언어가 나오면서 프로그래밍은 다시한번 폭발적인 성장을 거쳤습니다!

(그 당시는 포트란 같은 언어가 나온건데 쉽게 파이썬이라고 생각하자!)

어셈블리어를 사용하다가 파이썬을 쓰니 당연히 프로그래밍 하기 쉬워졌고 효율성도 엄청나게 올라갔습니다~

배우기 쉽고 쓰기 쉬울뿐 아니라 고수준 프로그래밍 언어는 에러를 발견하고 고치기 쉽습니다.

파이썬 언어를 0과1로 변환하는 컴파일 과정에서 컴퓨터가 명백한 에러를 미리 점검해줍니다! (철자 오류, 괄호 불일치 등의 구문 오류, undefined 변수의 연산 등등)

 

또한, 자바스크립트 자바 등등 세계적으로 유명한 고수준 프로그래밍 언어들은 계속 발전되고 업데이트되어 더욱 쓰기 쉽고 용이하게 되니 개발자인 저희들 입장에서는 너무너무 개이득입니다!

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🎁

[1일1로그 100일 완성 IT지식] 24번 '알고리즘은 이상, 프로그래밍은 현실'

 

 

알고리즘은 추상적이고, 이상적입니다. 

밑의 라면을 끓이는 알고리즘을 보시면 간단하게 표현한 만큼 추상적이고, 자세한 예외처리를 해주지 않아 이상적입니다.

(예를들어, 중간에 물이 끓는데 가스가 없어서 불이 안나오면 물은 끓지 않습니다!)

 

그에비해 프로그래밍 (프로그램을 만드는것 ) 은 아주 상세하고 실질적으로 명령어들을 입력해야합니다.

 

이때 프로그래밍을 0과 1로 해주기는 너무 힘드니까 이용하는것이 다양한 프로그래밍 언어입니다.

 


[1일1로그 100일 완성 IT지식] 25번 '다른 프로그램을 처리하기 위한 프로그램'

 

 

저자가 설명한 어셈블러로 들어가기전에 위의 프로그래밍 언어를 보자.프로그래밍 언어가 없으면 0과 1로 컴퓨터와 소통해야한다.

 

아래는 영화 '이미테이션게임' 에서 나오는 최초의 컴퓨터인데,Java나 JavaScript 같은 프로그래밍 언어가 존재하지 않던 시절.. 컴퓨터에 0과 1을 직접 입력해주었다.당연히 마우스나 키보드도 없으니 사진 안의 동그라미 하나하나가 메모리 적재 장소인데 열어서 안에 뭘 넣어주면 1이고 아무것도 안 넣어주면 0 이런식으로 구동이 되었다..

 

그래서 발전이 된 것이 어셈블리어와 어셈블러이다.

자바스크립트가 컴파일러를 통해 0과 1로 변환되듯이, (0과 1로 바로 변환은 안되고 어셈블리어로 변환이 된 뒤 0과 1로 변환되는 과정을 거치는데 이번 챕터의 범위를 벗어나는 듯 하니 0과 1로 변환된다고 하겠습니다:) )

어셈블리어가 어셈블러를 통해 0과 1로 변환된다.

당연히 우리는 자바나 자바스크립트 같은 훨씬 좋은 언어를 사용해서 느낌은 안오지만, 그 당시에는 획기적인 방법이 나온거고 이거 만든 사람은 그들만의 세계의 노벨상인 튜링상을 수상했다고 한다.

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감👶

[1일1로그 100일 완성 IT지식] 22번 '10개 도시를 최단거리로 여행하는 법'

 

 

내용이 모호하고 어렵다.. 그렇다고 또 그렇게 중요한것 같지도 않아서 짧게 정리하려고 한다! ㅎㅎ

 

알고리즘의 복잡도를 잠깐 언급하는데 크게 시간 복잡도와 공간 복잡도로 나뉜다.

 

1. 시간 복잡도  (어제자 그래프 느낌)

 -특정한 크기 입력(n) 에 알고리즘이 얼마나 오래 걸리는지.

 -알고리즘에 필요한 연산 횟수

2. 공간 복잡도

 -특정한 크기 입력(n)에 대해 알고리즘이 얼마나 많은 메모리를 차지하는지.

 -알고리즘에 필요한 메모리의 양

 

또 다항이다 비결정적 다항이다해서 P(합리적인 시간안에 푸는 문제) NP의 개념을 사용하시는데 이건 넘어가고 ㅎㅎ

 


오늘 Title인 여행하는 외판원 문제!

옛날에 한번씩 해본 모든 곳을 한번씩만 찍고와야되는데 최단거리로 찍고오는 문제다.

 

 

외판원 뿐만 아니라 통학 버스나 쓰레기차가 쓰레기를 수거 할 때도 최단거리를 한번씩 도는건 중요하니 요런게 생각보다

그들만의 세계에선 유명한 문제였다.

 

'휴리스틱' 이라는 내가 있는곳에서 가장 가까운 곳으로! 이동을 반복해서 처음 출발했던 곳으로 돌아오는 방법이 현실적으로 정답에 가까운 해결책이라고 한다.

 

방법이야 많지만 아직까진 결국 모든 경우의 수를 다~ 돌아봐야 최단거리를 구할 수 있다고한다.

(이런 류의 문제의 경우의 수 공식은 (n-1)!/2 로 저 외판원은 모든 경로 약 18만 개를 다 다녀봐야 가장 짧은 길을 구할 수 있다..) 

 

물론 현실적으로는 '휴리스틱' 방법처럼 대충~ 가겠지만 알고리즘에서는 컴퓨터의 모든 경우의 수를 생각해야되니까 똑똑한 사람들은 이것저것 고려를 하나보다.

 

 

 

 

 

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감👻

[1일1로그 100일 완성 IT지식] 20번 '10억 개 전화번호에서 이름찾기: 이진검색'

 

 

지금은 사라져버린 두꺼운 전화번호부 책을 생각해봅시다~

그곳에서 '엄준식' 이라는 이름을 찾아보면!

 

우린 엄준식을 찾으려고 1페이지부터 찾지는 않을거다. 중간쯤 펴서 첫글자가 '엄' 보다 앞에있으면(ex. '신준식' 이라면) 적당히 뒤쪽을 찾아볼거고 '엄'보다 뒤에있으면(ex. '정준식' 이라면) 적당히 앞쪽을 찾아볼꺼다.

 

이 행동을 여러번 해서 결국 엄준식을 찾는게 이진 방법이다.


[1일1로그 100일 완성 IT지식] 21번 '검색을 쉽게 만드는 선택 정렬 vs 퀵 정렬'

 

 

하지만 현실은 녹록치 않은법.. 전화번호부처럼 모든 데이터가 이름 순으로 정렬되어 있지는 않다ㅠ

정렬은 크게 선택 정렬과 퀵 정렬이 있다.

 

선택 정렬

위 그림같이 데이터 하나하나 비교해 가장 작은수를 앞으로 보내주는 방법이다.

요 방법은 데이터의 갯수가 n개라고 할때 n(n+1)/2 번 반복해야 모든 데이터가 정렬된다.

따라서, 위 그림은 6(6+1)/2 => 21번의 반복후에 모든 데이터가 정렬이된다. 

데이터의 수가 많아질 수록 반복행동이 엄청나게 많아지는 단점이 있다.

 

퀵 정렬

아래와 같이 처음에 소개한 이진정렬 느낌으로 정렬한다.

데이터 중 가운데수로 정렬할 데이터들을 2등분한다. 2등분 한 각각의 데이터들을 가운데수로 도 2등분한다.

이를 반복해 각각의 데이터가 0 or 1개가 될때까지 반복해 오름차순으로 만들어준다.

 

이는 데이터의 개수가 n개일때 nlogn (밑수가 2인 log) 번 반복하면 정렬이 완료된다.

아래 그림처럼 데이터의 개수가 커지면 선택 정렬(대충 n제곱)보다 압도적으로 적은 반복으로 정렬을 완료시킬 수 있다.

에게해 스터디원들과 함께하는 CS 간단 발표 및 독후감🐈

[1일1로그 100일 완성 IT지식] 18번 '알고리즘과 초콜릿 케이크 레시피'



사실 초콜릿 케이크 레시피는 저자의 어그로 제목이다.

알고리즘은 데이터를 명시하고(선언) 수행할 작업을 자세히 설명하고 결과값을 도출하는데, 

 

계란을 '반숙'으로 구우려면 반숙의 정의부터 불 세기와 몇 분동안 구울지를 명확히 제시하지는 않으니까

잠깐 생각해봐도 ,(쉼표) 나 ;(세미콜론) 하나만 달라져도 에러를 띄워버리는 알고리즘과 유사하지는 않아보인다.

 

그래서 알고리즘은 이렇다~ 설명하고 19번 '반에서 가장 키 큰 사람 찾기: 선형 알고리즘'으로 넘어간다.

  • 알고리즘은 모든 가능한 상황을 다루어야 한다.
  • 알고리즘은 결국 멈춰야 한다. (for 문에서 i 값을 0~10 까지 정해주듯이)

[1일1로그 100일 완성 IT지식] 19번 '반에서 가장 키 큰 사람 찾기'

 

 

우리는 반에서 가장 키 큰 사람은 그냥 둘러보면 알 수 있다.

하지만 알고리즘은 아주 명확하고 상세하게 설명해야 답을 구할 수 있다.

 

기본적으로는 한 명 한명 키가 몇인지 묻고, 지금까지 확인한 사람 중에 가장 키 큰 사람이 누군지 계속 체크하는 것이다.

이런식으로 모든 사람의 키를 물어보면 '가장 키 큰 사람과 그 사람의 키'를 알 수있다.

 

그런데 키가 같은 사람이 있으면 어떨까? 또, 추가로 모든 사람의 키 평균을 구하려면?

 

키가 같은 사람이 가장 클 수도 있으니 키가 같은 사람 모두의 이름을 기억하고 있어야한다. 또 키 평균을 구하려고 보니까 사람이 아무도 없으면 알고리즘은 0으로 나눠버릴거다. 

 

이러한 모든 상황을 명확히 컴퓨터에게 알려줘야한다. 위의 상황은 저자가 '자료 구조' 장에서 자세하게 다룬다고하니 요정도로 넘어가겠습니다~ 

+ Recent posts