TIL

TIL_20220822

번잔중 2022. 8. 22. 23:30

오늘 할 일

  • 코드스테이츠 2일차
    • 컴퓨터와 프로그래밍의 이해
      • 컴퓨터의 구성 요소에 대해서 설명할 수 있다.
      • 프로그램을 실행하면 컴퓨터 내부에서 어떤 일이 일어나는지 이해할 수 있다.
      • 프로그래밍과 관련된 개념들을 설명할 수 있다.
        • 프로그램, 프로그래밍, 프로그래밍 언어, 컴파일, 빌드, 통합개발환경
      • 웹 클라이언트
      • 웹 서버
    • Mac OS 개발환경 세팅
      • JDK
      • IntelliJ
      • JetBrains ToolBox
    • IntelliJ
  • 알고리즘 문제 하나 풀기
  • 배운 내용 복습하기(설명이 가능할 정도로!)

오늘 배운 것

  • 컴퓨터와 프로그래밍의 이해
    • 컴퓨터는 사용자가 입력한 데이터를 정해진 규칙에 따라 처리해서 생긴 처리물을 저장장치에 보관하고 사용자가 볼 수 있도록 출력하는 연산 장치이다.
    • 컴퓨터 == 소프트웨어 + 하드웨어
      • 소프트웨어는 물리적인 형태가 존재하는 것이 아니다. 하드웨어가 어떻게 동작해야 하는지에 대해 규정해놓은 명령어의 집합이다. 시스템 소프트웨어와 응용 소프트웨어가 있다.
        • 시스템 소프트웨어: 응용 소프트웨어가 실행될 수 있는 플랫폼 역할을 하고, 하드웨어와 직접적으로 소통하며 하드웨어 장치들이 제대로 동작할 수 있도록 한다.
        • 응용 소프트웨어: 시스템 소프트웨어를 제외한 나머지 소프트웨어라고 한다. 애플리케이션, 프로그램 등으로 불리고 상당히 다양하다.
      • 하드웨어는 물리적으로 형태가 존재하는 장치이다. 
        • 중앙처리장치(Cetnral Processing Unit): 프로그램의 실행과 데이터 처리를 담당한다. 프로세서라고도 하며 제어장치, 레지스터, 연산장치로 이루어져 있다.
          • 제어장치: CPU의 모든 동작과 흐름, 운영체제와 소통하며 컴퓨터의 자원을 관리한다.
          • 연산장치: 프로그램에서 작성된 명령어를 수행한다. 코드를 실질적으로 실행시키는 장치이다.
          • 레지스터: CPU 내부에서 동작하는 작고 빠른 기억장치이다. 연산장치의 동작에 필요한 데이터들을 임시적으로 보관하며 제공한다.
        • 기억장치: CPU의 동작에 필요한 데이터를 장기적으로 또는 단기적으로 보관한다. 여기서 장기적으로 보관하는 장치를 보조기억장치, 단기적으로 보관하는 장치를 주기억장치라고 한다.
          • 보조기억장치
            • 컴퓨터에 필요한 모든 정보(데이터)를 반영구적으로 저장한다.
            • 큰 용량의 데이터를 저장할 수 있지만 데이터를 읽고 쓰는 속도가 느리다.
            • CPU의 연산속도는 굉장히 빠른편이기 때문에 보조기억장치와 직접적으로 소통하지 않는다.
            • Ex. SSD(Solid State Drive), HDD(Hard Disk Drive)
          • 주기억장치
            • 컴퓨터를 수행하는 동안 필요한 모든 정보를 저장한다. (휘발성)
            • 큰 용량의 데이터를 저정할 수는 없지만 데이터를 읽고 쓰는 속도가 빠르다.
            • CPU의 연산속도를 따라잡을 수 있을 정도로 빠르기 때문에 직접적으로 소통한다.
            • Ex. RAM(Random Access Memory), ROM(Read Only Memory)
          • 캐시 메모리(Cache Memory): 기억장치의 한 종류이다. CPU가 사용한 데이터와 관련된 데이터 중 재사용 가능성이 높은 데이터를 주기억장치로부터 미리 가져와서 대기시켜놓는 역할을 한다.
          • 기억장치의 계층구조: 용량 속도 가격에 따라 분류된다. CPU -> cache memory(static RAM) -> 주기억장치(dynamic RAM) -> 보조기억장치 순을 기준으로 용량은 점점 커지고 비용과 속도는 낮아지고 느려진다.
        • 입력장치 (Input Device): 입력장치는 사용자로부터 컴퓨터 내부로 데이터를 입력 받는 장치이다. 키보드, 마우스, 마이크, 트랙패드 등이 입력장치에 속한다.
        • 출력장치 (Output Device): 입력장치와 반대로, 출력장치는 컴퓨터 내부로부터 사용자에게 사람이 감각할 수 있는 형태로 데이터를 출력해주는 장치다. 모니터, 스피커, 프린터 등이 출력장치에 해당한다.
        • 시스템 버스 (System Bus): 시스템 버스는 CPU를 포함한 각 하드웨어 장치 간의 통로다. 즉, 각 하드웨어 장치를 물리적으로 연결한 전선을 의미하기 때문에 시스템 버스 또한 하드웨어에 포함된다.
          • 데이터 버스: 하드웨어 간에 데이터를 전달하는 통로입니다.
          • 주소 버스: 데이터가 어디에 도착해야 하는지에 대한 정보를 전달하는 통로입니다.
          • 제어 버스: CPU의 제어장치가 생성한 제어 신호를 다른 장치로 전달하는 통로입니다.
      • 컴퓨터의 동작
        • Ex. 계산기
        • 계산기를 켠다 -> 운영체제보조기억장치에 저장되어 있던 계산기를 주기억장치RAM에 적재한다. 이를 로딩이라고 한다.
        • 로딩이 끝나면 계산기가 화면에 출력되어 있다. 이렇게 실행중인 프로그램프로세스라고 한다. (작업관리자를 열면 ‘프로세스’라는 항목이 있는데, 이 프로세스가 바로 메모리에 로드되어 실행 중인 프로그램들을 나타낸 것이다.)
        • 키보드 및 마우스 같은 입력장치를 통해 계산기에 데이터를 입력할 수 있다. → 1 + 1이라는 데이터를 입력하고 엔터를 누른다고 가정하면, CPU는 1 + 1을 계산기 프로그램의 소스 코드에 작성된대로 해석하고, 소스 코드에 작성된 명령어들을 적용하여 계산을 시작한다.
        • 잡한 연산이 아니므로 순식간에 계산이 이루어진다. 계산이 완료되면 계산 결과는 주기억장치에 저장되며, 모니터를 통해 여러분에게 보인다.
    • 프로그래밍: 프로그래밍이란 프로그램을 만드는 과정으로서, 특정 목적을 달성하기 위해 설계된 알고리즘을 프로그래밍 언어를 사용하여 코드로 작성하는 과정을 의미한다.
      • 프로그램: 프로그램은 프로그래밍의 결과로 만들어진 것이다. 즉, 프로그램은 어떠한 목적을 달성하기 위한 컴퓨터 명령문의 집합체라고 할 수 있다.
      • 프로그래밍 언어: 사람이 컴퓨터에게 문제 해결을 주문하려면 컴퓨터가 이해할 수 있는 언어로 설명해주어야 한다. 하지만 기본적으로 컴퓨터는 기계어를 사용한다. 영어나 한국어는 컴퓨터가 알아들을 수 없고, 기계어는 사람이 알아보기 어렵다. 말하자면 사람의 언어 - 컴퓨터의 언어(기계어)가 이어질 수 있도록 하는 매개체가 필요한데, 그것을 프로그래밍 언어라고 한다.
      • 기계어와 같이 컴퓨터에게 가까운 언어일수록 저수준 언어라고 하며, 반대로 Java 및 C언어와 같이 사람과 가까운 언어일수록 고수준 언어라고 한다.
      • 컴파일: 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어 코드로 번역하는 과정을 컴파일(Compile)이라고 한다. 컴파일이 완료된 코드는 이제 컴퓨터가 이해할 수 있다.
      • 빌드: 빌드는 작성한 소스 코드를 실행할 수 있는 산출물로 변환시키는 과정을 의미한다. 프로그램이 실행되려면 .exe또는 .msi 확장자를 가진 실행 파일(산출물)로 만들어주는 빌드 과정이 필요하기 때문이다. 빌드가 완료되어야 소스 코드가 비로소 실행시킬 수 있는 하나의 프로그램으로 완성된다.
      • 통합개발환경 (Integrated Development Environment, IDE): IDE는 코드를 작성할 때 사용하는 프로그램으로, 프로그래밍에 필요한 모든 작업을 하나의 프로그램 안에서 처리할 수 있도록 만들어진 프로그램이다. IDE를 사용하면 단순히 코드를 작성하고 편집하는 것뿐만 아니라, 디버깅, 빌드 등의 작업을 하나의 IDE 안에서 할 수 있다. Visual Studio Code, IntelliJ, Eclipse 등이 대표적인 IDE에 해당한다.
  •  웹 클라이언트와 웹 서버
    • 2 티어 아키텍처(2 Tier Architecture; 클라이언트 - 서버): 리소스가 존재하는 곳(서버)과 리소스를 사용하는 앱(클라이언트)을 분리시킨 것을 2 티어 아키텍처 또는 클라이언트 - 서버 아키텍처라고 한다. 클라이언트 - 서버 관계에서 클라이언트와 서버는 요청과 응답을 주고 받는 관계이다. 요청이 선행되고 그 후에 응답이 온다. 
    • 3 티어 아키텍처(3 Tier Architecture; 클라이언트 - 서버 - 데이터베이스): 일반적으로 서버는 리소스를 전달해 주는 역할만 담당한다. 리소스를 저장하는 공간을 별도로 마련해 두는데 이 공간을 "데이터베이스"라고 부른다. 데이터베이스는 창고와 같은 역할을 한다. 클라이언트 - 서버 아키텍처에 데이터베이스가 추가된 형태를 3 티어 아키텍처라고 한다.
    • 프론트엔드: 클라이언트처럼 사용자가 직접 눈으로 보고, UI를 클릭 또는 터치하는 등의 상호작용을 할 수 있는 앱을 주로 개발하면 프론트엔드 개발자라고 한다.
    • 백엔드: 반면 사용자 눈에 보이지 않지만, 상품 정보를 API로 노출한다든지, 로그인/로그아웃, 권한 관리 등의 사용자 인증을 주로 다루는 개발자는 백엔드 개발자라고 한다. (서버가 단순히 전달만 하는 게 아니다!) 백엔드 개발자는 데이터베이스 등의 시스템 설계까지 도맡아서 하는 경우도 많다.
    • 클라이언트와 서버의 종류
      • 클라이언트 
        • 보통 플랫폼에 따라 구분된다.
          • 브라우저를 통해 주로 이용하는 웹(Web) 플랫폼에서의 클라이언트는 웹사이트 또는 웹 앱이라고 부른다.
          • iOS나 안드로이드와 같은 스마트폰/태블릿 플랫폼, 그리고 윈도우와 같은 데스크탑 플랫폼에서 이용하는 앱 역시 클라이언트가 될 수 있다.
      • 서버
        • 무엇을 하느냐에 따라 종류가 달라진다.
          • 파일 서버는 파일을 제공하는 앱
          • 웹 서버는 웹사이트에서 필요로 하는 정보들을 제공하는 앱(이후 주로 우리가 만들게 될 서버)
          • 메일 서버는 메일을 주고받을 수 있도록 도와주는 앱
          • 데이터베이스도 데이터 제공자로서 일하므로 일종의 서버라고 볼 수 있다.
  • Mac 개발환경 세팅(JDK, IntelliJ, JetBrain ToolBox)
  • IntelliJ에서 자주 사용하는 단축키 15가지
 

Top 15 IntelliJ IDEA Shortcuts | The IntelliJ IDEA Blog

IntelliJ IDEA has keyboard shortcuts for most of its commands related to editing, navigation, refactoring, debugging, and pretty much everything else we might want to do regularly. Learning and practi

blog.jetbrains.com

  • 알고리즘 문제 하나 풀기
    • 프로그래머스 Lv.1 수준의 쉬운 문제를 풀었다.
    • 파이썬에서 유용하게 사용되고 있는 replace 함수를 이용해서 문자를 숫자로 바꿔서 출력하는 문제를 풀었다.
    • 비슷한 문제를 추천하자면 백준 2941번 - 크로아티아 알파벳 문제를 추천한다. (9월 1일 추가)
 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

  • 배운 내용 복습하기(설명이 가능할 정도로!)
    • 컴퓨터 소프트웨어와 하드웨어, 프로그래밍, 웹 클라이언트와 웹 서버에 대해 학습했다.
    • 하드웨어 장치와 역할에 대해 공부한 것이 오래 되어서 머릿 속에 잘 입력되지 않는다.
    • 복습으로 하드웨어를 제외한 나머지를 가볍게 읽고 하드웨어를 조금 더 꼼꼼하게 읽어보는 것을 학습전략으로 선택했다.

느낀점

  • 과거 학교에서 배웠던 컴퓨터구조나 웹서비스컴퓨팅 같은 수업이 떠오르는 하루였습니다. 그때는 참 즐겁게 배웠고 시간이 지나도 기억날거라 생각했는데, 꾸준히 하지 않으면 말로 설명할 수 있을 만큼 알지는 못하는 것 같습니다.
  • 첫 수업때 배운 메타 인지를 위해 아는 것과 모르는 것을 구분하려고 노력했습니다. 조금 어렵긴 하지만 그래도 한 발자국씩 나가는 것이 중요하다고 생각합니다.
  • 1일 1커밋 스터디에 들어가고 첫 회의를 진행했습니다. 총대매고 수고해주시는 스터디장님 대단하심... 앞으로는 알고리즘 위주로 스터디 내에서 같이 진행하거나 할 것 같습니다. 알고리즘 고수를 향하여 가쥬아

내일 할 일

  • 코드스테이츠 3일차
    • HTML
      • HTML이 무엇인지, 기본 구조, 문법을 설명
      • 요소
        • div
        • span
        • ul
        • ol
        • li
        • input
      • 시맨틱 태그
      • 웹 문서의 구조와 내용 작성하기
    • CSS
      • 사용 목적을 이해하고, 기본적인 문법과 구조를 설명
      • HTML에 CSS를 적용
      • 직접 HTML 안에 CSS를 정의하는 것을 권장하지 않는 이유
      • 텍스트를 꾸미기
      • 기본적인 CSS 박스 모델을 이해하고 설명
      • MDN, W3C School 등의 레퍼런스 사이트를 이용해 CSS 속성을 검색하고 사용하기
    • 알고리즘 문제 하나 풀기

'TIL' 카테고리의 다른 글

TIL_20220827  (0) 2022.08.27
TIL_20220825  (0) 2022.08.25
TIL_20220821  (0) 2022.08.21
TIL_20220820  (0) 2022.08.20
TIL_20220819  (0) 2022.08.19