Sister Nosilv story

컴퓨터개론 Computer basics 총정리

by 노실언니

컴퓨터개론Course

  📺컴퓨터개론📺 - 🎖수료증

*Link : 📺인강  📝정리노트


 

프로그래밍전체과정

Programming Language 문법을 완벽하게 암기하는 것보다 훨씬 중요한 것들이 많다.

0. [궁극목적] 뜻세우기 : 왜 만드는지, 누구를 위한 것인지, 무엇이 목표인지

1. [분석→결정] 사용자, 동일시장 경쟁품, 나의 강/약점, 산업/시장/기술 Trend분석 → GoStop결정

2. [세부목표] 개발시간, 접근방식, 속도, 효율, 개발편의성, 비용 등 설정

3. [목표달성수단 결정] 세부목표에 맞는 PL : 자료형, 추상화단계, Compiler/Interpreter, Library, FW 결정

4. [코드구조구상]

5. 좋은 코드작성→REAL구현

6. Test & 수정/배포 & 유지보수

 

- 코드를 작성하기 전의 과정도 코드를 작성하는 시간만큼이나 중요하고, 오래 걸린다.

이 시간을 스킵하면, 코딩하는 과정에서 헤메서 오래 걸린다. ≒ 수학문제푸는 것과 같네

- 처음 프로그래밍을 배울 때, 문법을 외우는 것에 급급하게 되는데 항상 숲'도' 보려고 노력해야한다.

어떤 PL을 사용하더라도 쓰이는 중요한 FOUNDATION

 

생명과학1을 시작하면 처음으로 외워야 하는 개념인'생물의 특성'은 사실 전범위를 아우르는 목차이다.

1단원 첫번째 개념 → 전단원 GUIDE

컴퓨터개론에서 처음 마주하는 '프로그래밍 전반적인 과정'은 컴퓨터사이언스에서 중요한 소프트웨어공학을 아우르는 목차인 것 "같다".

 

 

PL개념

어떤 PL을 선택하든 상관없이, 무조건 알아야하는 PL에 관한 개념

*PL:Programming Language 프로그래밍 언어

⑴ 자료형

자료형 Data type

[자료형?]

def. Data type [en.wiki]:컴파일러나 인터프리터에게 알려주는 '값의 의미' → 이에 따라, 값을 저장하는 방식이 결정된다.

 A data type or simply type is an attribute of data which tells the compiler or interpreter how the programmer intends to use the data. Most programming languages support basic data types of integer numbers (of varying sizes), floating-point numbers (which approximate real numbers), characters and Booleans. A data type constrains the values that an expression, such as a variable or a function, might take. This data type defines the operations that can be done on the data, the meaning of the data, and the way values of that type can be stored. A data type provides a set of values from which an expression (i.e. variable, function, etc.) may take its values.

미친 짓

 

⑵ 추상화

추상화 Abstraction 에 단계가 있다

Object : data, function 구성, Top-down방식 단점을 해결한 Bottom-Top격의 획기적 개념

객체지향언어는 개발자 입장에선 좋은데, 컴퓨터가 보기엔 추상적인 명령이라서

컴퓨터 본인이 알아서 해야할 일이 많아 효율이 떨어진다는 단점이 존재한다.

사실 잘 모르겠음! 객체는 안 사용해봐서 모르는 거라, 이 상태론 뭘 찾아봐도 이해 못할 것 같다.

* [객체]에 대한 추가 이야기

객체의 탄생배경 : Top-down식 개발방식의 단점해결과정에서,

- Top-Down : from the general to the specific [분해]

추상→구체화

- Bottom-Up : from the specific to the general [조각모음] *more difficult for human

구체→추상화(+ Object사용)

 

<Top-down단점>→해결책:Bottom-Up

- 단점1:전체를 완성하기 전까지 부분적 test불가능

- 단점2:일부 기능 수정시에도 전체 코드 점검필요

- 단점3:일부 오류발생시에도 전체에 치명적인 영향을 끼칠 수 있음

左 TOP-down : 프로그램을 통Data & Function단위로 <분해>하여 협업 및 제작을 했음

右 Bottom-Up : 쪼개놓은 함수와 데이터들을 객체에 <모음>

 

Object-oriented programming은 프로그램을 객체단위로 파악하는 패러다임이다.

Object-oriented language는 이 패러다임을 실현할 수 있는 기능을 지원하는 언어이다.

'객체'보다 더 모르겠는 것이 '추상'이었다. (지금은 객체를 더 모름)

수업 중에 "추상화는 복잡한 걸 숨기고, 일부만 보여주는 것이다. 3단계가 있으며 변수/함수/객체이다." 라고 배울 때, 넘눠무너ㅝ무너무너무너-무 와닿지않았다. 물론 그렇게 알고 넘어가라하면 걍 넘어갈 수 있었지만, 너무너뭐누머너무너무 안 와닿아서 궁금할 정도였다.

왜냐면 나에게 <추상적>은 그냥 <관념적인, 이해가 안되는, 난해한, 형용불가능한, 흐리멍텅한>느낌인데,

컴퓨터과학에서 말하는 <추상화>는 복잡한 것을 숨겨서 값이나 명령의 의미를 <명확>하게 해주는 것이었기 때문이다.

( 3000 보다, 변수를 사용해서 burger_price=3000 이라고 하면 값의 의미가 명확해지니까?)

내가 아는 두루뭉실 추상과 컴퓨터과학이 말하는 명쾌한 추상은 의미가 너무 상반됐다.

황 • 적 • 청 - 추상화의 아버지, 칸딘스키 (출처: 미술대사전(인명편)) - 내게 <추상>이란 건 이런 느낌!

그래서 처음엔 영어로 만들어진 개념이 한국으로 넘어오면서 만들어진 "번역오류인가?" 했다. → 결론적으론 아님(내가 추상에 대해 잘 몰랐음)

사전을 찾아보았다.

- Abstraction : 1. 관념, 추상적 개념 2.(…에만) 마음이 쏠려 있음, 정신이 딴 데 팔려 있음 3. 추출

- 추상 : 대상으로서의 소여 전체(=그 자체)로부터 특정성질이나 공통징표를 분리하고, 골라내는(=추출하는) 정신작용. → '상'을 '추'출하는 것

예를 들면, 빨간 넥타이로부터 ‘빨강’ 혹은 ‘형(形)’만을 추출하는 것, 또 빨간 우체통, 잘 익은 토마토 등에서 공통적인 ‘빨강’을 골라내고, 적(赤) ·청(靑) ·황(黃)으로부터 ‘색(色)’을 빼내는 것은 추상이다.

- 추상하다 [심리] : 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하다.

- 추상화 [컴퓨터과학] : 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것.

 

나는 '추상' 자체의 뜻을 잘못알고있던거다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

추상이 말하는 <추출>을 읽고 머릿 속에 딱 떠오른 것은 #Tag(해시태그) 였다.

추상 = 상을 <추출> = 방대한 양의 지식뭉텅이에 붙이는 간략한 이름표 격인 Tag/단권화노트 등...

나는 글을 읽으면, 핵심어를 건져서 #단어1 #단어2 이런 식으로 정리를 해둔다.

글에서 중요한 키워드만 <추출>하는 것이다.

그러면, 나는 추출해낸 키워드들을 가지고 머릿속에서 다시 글로 풀어내며 remind한다.

그렇지만 글을 읽은 사람이 아닌 타인들에게는 두루뭉실, 뭔말인지 모를 애매모호한 단어의 나열일 뿐이다.

추상 = 추출해요, 상을

 

나는 글을 추상화 했고,
글을 읽지 않은 타인은 추상적이란 느낌을,
글을 읽은 타인은 명확하다는 느낌을 받는다.
이렇게 상반된 두 느낌이 공존하는 것이다.

 

그니까 미술의 미자언니도 모르는 나에게 그림 추상화(畵)는 난해하고 이해안가는 흐리멍텅한 그림이지만,

화가를 잘 알고 그림의 스토리를 잘 아는 사람에게는 어떤 개념을 함축시켜놓은 액기스의 느낌으로 크게 와닿을 것이다.

문학으로 치면 '시'도 일종의 추상화가 아닐까?

애초에 눈 앞에 보이지 않는 감정이나 생각들의 특징들을 추출해서,

글이든, 노래든, 그림이든, 뭐로든 명확하게 사람이 느낄수있게 만든 그 모든 예술도 추상화가 아닌가 하는 깨달음을 얻었다.

진짜 맞는 말을 하는 건지 모르겠지만?!?!?!

추상화는 복잡한 걸 숨기고, 일부만 보여주는 것이다. 3단계가 있으며 변수/함수/객체이다.

→ 추상화는 복잡한 것 중 핵심을 추출한 것이다. 3단계가 있으며 변수/함수/객체이다.

* 배울 때는, <숨기다>에 꽂히게 되던데, 숨기는 것에 꽂힐게아녔음ㅋㅋㅋㅋㅋㅋㅋㅋㅋ숨긴다고 생각하면 나가리야

👩프로그래머가 추상화를 하면,
🤖컴퓨터는 추상적이란 느낌을, → 그래서 컴퓨터 효율이 안 좋아지고
👩프로그래머는 명확하다는 느낌을 받는다. → 그래서 프로그래머에겐 편하고
이렇게 상반된 두 느낌이 공존하는 것이다. → 그래서 학생은 힘드네

 

PL분류

#Object Typing Level

좌측 그림에서 언어의 흐름은 반시계방향(3사분면 → 4사분면 → 1사분면)으로 흐른다. (출처:코드잇)

①자세한언어(객체지향×):Assembly C Fortran BASIC

②체계적언어(객체지향 & Static):Java Swift C++ GO Kotlin

③쉬운언어(Dynamic):Python Ruby Javascript etc.

절대적X 상대적O : 컴퓨터가 편한 저수준 언어 - 사람이 편한 고수준 언어 (출처:코드잇)

고수준VS저수준:사람편의VS컴퓨터편의:척하면 척!VS1부터 10까지 다 알려줘야함..

≒대뇌VS소뇌의 운동명령체계(?): 손잡자 VS 손마디의 n번째 뼈를 n도씩 회전시키는데, 힘을 n정도만 어쩌구저쩌구 주절주절

 


컴퓨터 사이언스의 기본기

해외는 Computer Science, Engineering으로 학과가 다르다는데,

나는 그냥 컴퓨터공학과(engineering)에서 HW, SW를 다 배웠다.

10년 만에 다시 와서 모든게 생소해서 그런가 그땐 몰랐던 컴퓨터사이언스, 컴퓨터엔지니어링 구분을 어찌해야하나 난감

 

SW공학-개발방식2

Def. Software engineering : 소프트웨어의 계획·개발·검사·보수·관리 등을 위한 기술과 그것을 연구하는 분야. SW의 규모가 크고 복잡해짐에 따라 공학적인 접근으로 구조화 프로그래밍을 도입한 것이다.

    <접근방식2>
  • 폭포수Waterfall [한큐]
  • 애자일Agile [덧칠]

개발방식 2가지 : Waterfall & Agile

 

효율적인 Tools

⑴ 이슈(버그)관리

체계적으로 관리할 수 있는 버그관리툴 → Jira asana Trello

 

⑵ 버전관리 - Git

Git의 방식 : Distributed revision control(분산버전관리시스템):Original에 수정사항을 덧붙여나가는 방식

+ Branch 기능 : 한 프로그램을 여러 환경, 기능별로 분화시킬 수 있다.

 

⑶통합개발환경IDE

개발자의 개발편의를 위한 툴

Ex. 파이썬Language의 IDE → 파이참PyCharm  →  multi-cursor : Ctrl 사용

 

⑷그 외 tool

Stackshare : tool → stack 개발자 혹은 개발팀에서 사용하는 다양한 툴(stack)

 

Trend

선택에 도움되는 관점 : ①多:활발한가? ②프로Pick:인정받는가? ③꽃길:미래유망한가?

①사용자가 많은 기술은 빠른 보완, 좋은 자료, 활발한 피드백이 기다리고 있다.

②전문가, 기업이 선택한 기술은 검증된 대세이다.

③현재와 미래는 다를 수 있다! 내 능력 밖인 산업의 흐름도 중요하다.

 + ENGLISH

 

 [Insight]

- RedMonk : SW개발산업 분석기업 - Programming Language Rankings RedMonk is an industry analyst firm focused on software developers. RedMonk covers trends in the software industry such as top-used programming languages.

- Stackshare : tech stack list. A tech stack is defined as the set of technologies an organization uses to build a web or mobile application. It is a combination of programming languages, frameworks, libraries, patterns, servers, UI/UX solutions, software, and tools used by its developers. Stackshare is a software discovery platform that lets you see all the best software tools and who's using them.

- Gartner : 대형리서치기업 - Top Strategic Technology Trends

- 우아한 형제들 깃헙

 

 [Learning]

- 생활코딩

- 코드잇

- 백준

 

좋은 코딩

잘 짜인 코드 구조 + 적절한 코멘트 + 네이밍 센스 → 가독성, 최적화, 협업&수정용이

 

Design pattern

각종 이슈들에 대한 권장해결법

 

Library & Framework

Library[능동적코딩] → 내가 사용할 수 있는 퍼즐조각

Framework[수동적코딩] → 짜여진 틀의 빵꾸를 메꾸는 것 + 수정은 힘들다.

 


Compiler/Interpreter

역할 <프로그래밍코드→실행가능한 코드/실행>

과정1.   👩🏻‍💼Coding→영어, 숫자, 기호가 뒤섞인(=programming Language) 코드=기계가 즉시 실현불가

과정2.  ✔️program→2진수/16진수로 구성된(=Machine Language) 코드=기계가 실행가능한 프로그램

과정3.   🤖Machine→실행

  Compiler Interpreter
메커니즘 개발언어실행가능언어→[End user] 개발언어→[End user]한줄씩 실행
개발속도 relatively Slow
- 수정시 전체 재컴파일 필요
- 개발언어도 느린 편
relatively Fast😄
- 수정해도 한줄한줄 즉시실행
- 개발언어도 개발자에게 더 편한 언어
실행속도 relatively Fast😄 relatively Slow
파일용량 실행가능언어 (> 개발언어) 개발언어😄
보안 개발코드 유출×😄 개발코드 유출○
개발언어 relatively low-level language
C C++
relatively high-level language
Python Ruby

 

OS

⑴ 역할

OS:사용자-HW-SW중재하는 SW

① 다양한 장치(하드웨어)들을 연결하더라도 제대로 호환되도록 중재

② 데이터를 어떤 저장장치에 저장/불러올 것인지 중재

③ 프로그램을 얼마만큼 처리할 것인지 중재

 

⑵ 종류

사용자설정변경⭕ : Window, Android ⟶ 유용하나 보안취약

사용자설정변경❌ : mac OS, iOS ⟶ 보안좋으나 불편

 

① 데스크톱/랩톱:Windows, macOS, Linux, etc.

② 모바일/탭:Android(Linux기반,JVM사용,Java+@), iOS(Unix기반,Swift+@)

③ 서버:안정속도효율←Ubuntu, Unix, centOS, etc.

④ 임베디드:안정←Vxworks, RT-Linux, etc.

 

⑶ 역사

Dennis Ritchie Unix → GNU → Linus Torvalds Linux

 

Application

⑴ Native VS Web application

Application:End user가 직접 사용하는 Software 응용프로그램 → Native & Web app

  Native App Web App
HW/OS활용 수월😄 제한적
사용자접근성 마켓설치필요 주소로 접근😄
인터넷 없어도 됨😄
수정시 마켓재배포 실시간반영😄

Web app의 활용

Single page : 페이지 전환이 없어 Native App같도록 함

Hybrid : Native App의 특정구간에 Web을 끼워둠

[탄생배경-문제점] 광고처럼 특정파트가 계속 수정되어야 하는 Native App의 경우, 재배포를 해야하는 번거로움 존재

[문제해결] Native App의 특정구간에 Web을 끼움

Progressive : Native, Web의 장점만 모은 Web App

Ⓝ 기기의 기능을 원활히 사용가능

Ⓝ 오프라인에서도 동작

Ⓦ 설치/수정배포에서 자유로움

⑵ 플랫폼파편화의 해결

섭리:모든 것은 그것의 플랫폼에 맞게 제작되어야 함

👎 문제:App도 그것의 플랫폼인 HW와 OS에 일일이 맞춰서 개발해야함

👍 해결:[쿠션생성] HW-OS-App에 한 겹의 플랫폼을 더 끼움→HW-OS-CrossPlatform-App

Cross Platform이 정한 표준만 지켜주면 됨 → Cross Platform의 표준에는 의존하여 제작해야함

Cross Platform → 가상머신(예:Java Virtual Machine) & 웹브라우저(예:Edge Chrome)

 

반응형

블로그의 정보

노력하는 실버티어

노실언니

활동하기