웹 기본 이해

 

웹과 인터넷 차이

인터넷(Internet)

: 네트워크 인프라 구조. 전 세계의 컴퓨터와 네트워크를 연결하는 시스템의 통합

 

웹(WEB)

: 인터넷 상에서 정보를 제공하거나 접근할 수 있는 서비스 (월드 와이드 웹 : World Wide Web)

인터넷(Internet) 웹(WEB)
컴퓨터가 서로 연결되어 통신을 주고받는
컴퓨터끼리의 네트워크
그 인터넷상에 정보가 얽혀있는
무형의 정보 네트워크

 

 

 

웹의 기본 동작 원리  (중요도 🌟)

클라이언트 - 서버 모델

: 클라이언트(사용자 컴퓨터)와 서버(웹 사이트를 호스팅하는 컴퓨터) 간의 상호작용

클라이언트는 서버에 요청을 보내고, 서버는 요청에 따라 데이터를 응답

 

HTTP 요청 - 응답

: 클라이언트가 웹페이지를 요청하면, 서버는 요청을 처리하고 HTML 문서를 반환, 클라이언트는 이를 해석하여 화면에 표시

 

 

 


브라우저와 서버  (중요도 🌟 🌟🌟)

: 브라우저는 웹 서버로부터 HTML, CSS, JavaScript 파일을 요청하고 응답받아 이를 피싱(해석)하는 단계

 

 

🦄브라우저의 작동원리

HTML 파싱
  • HTML 파일을 받아들인 브라우저는 이를 파싱하여 DOM(Document Object Model) 트리를 구축합
  • DOM 트리는 HTML 문서의 구조를 계층적으로 표현한 객체 모델로, 각 HTML 요소가 하나의 객체로 표현
  • HTML 문서를 위에서 아래로 순차적으로 읽어 내려가며, HTML 태그들을 각각의 DOM 노드로 변환하고, 이 노드들이 부모-자식 관계를 통해 트리 구조로 연결
CSS 파싱
  • CSS 파일을 받아들인 브라우저는 이를 파싱하여 CSSOM(CSS Object Model) 트리를 구축
  • CSSOM 트리는 스타일 규칙들을 객체 모델로 변환한 것으로, 각 규칙이 적용될 HTML 요소와 연결
  • 이 과정에서 CSS 규칙의 상속과 우선순위(계단형) 등이 계산
JavaScript 파싱
  • JavaScript 파일이 포함된 경우, 브라우저는 이를 해석하여 실행
  • JavaScript는 DOM이나 CSSOM 트리에 접근하여 동적으로 HTML 요소를 추가, 제거하거나 스타일을 변경 가능
  • JavaScript는 비동기적으로 실행될 수 있으며, 때로는 DOM이 완전히 로드된 후에 실행

 

 

💡페이지 렌더링
: 모든 과정이 끝난 후, 브라우저는 최종적인 웹 페이지를 사용자에게 화면으로 보여짐
사용자가 페이지와 상호작용하거나, JavaScript에 의해 콘텐츠가 변경되면, 브라우저는 이 과정을 반복하여 화면을 업데이트함

 

 

 

 


프로토콜  (중요도🌟🌟)

  HTTP 프로토콜 HTTPS 프로토콜
개념 - 월드 와이드 웹(WWW)에서 웹 페이지를 주고받기 위해 사용

- 클라이언트(주로 웹 브라우저)가 서버에 요청을 보내면, 서버는 그 요청에 맞는 데이터를 클라이언트에 응답으로 보내주는 방식으로 작동
- HTTP에 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security)라는 암호화 프로토콜을 결합한 것

- HTTPS를 통해 주고받는 데이터는 암호화되어, 중간에 누군가가 데이터를 가로채더라도 내용을 읽을 수 없도록 보호
특징
  • 비암호화된 데이터 전송: HTTP는 데이터를 평문(암호화되지 않은 형태)으로 전송하기 때문에, 중간에 누군가가 네트워크 트래픽을 감청할 경우 데이터가 쉽게 유출될 수 있음

  • 속도: 암호화 과정이 없기 때문에 HTTPS보다 약간 더 빠를 수 있으나 보안이 취약하다는 큰 단점을 가짐

  • 포트: 기본적으로 80번 포트를 사용
  • 데이터 암호화: 모든 데이터가 전송되기 전에 암호화되어, 데이터의 기밀성을 유지
    이로 인해 제 3자가 데이터 내용을 쉽게 볼 수 없으며, 데이터가 안전하게 전송
  • 데이터 무결성: 데이터가 전송되는 도중 변경되거나 손상되지 않았는지를 확인하는 기능을 제공
    이를 통해 클라이언트는 서버로부터 받은 데이터가 원본과 일치하는지 확인 가능
  • 서버 인증: HTTPS는 SSL/TLS 인증서를 사용하여 서버의 신원을 확인
    이는 사용자가 방문하는 웹 사이트가 실제로 그 웹 사이트임을 보장
    이를 위해 신뢰할 수 있는 인증 기관(CA, Certificate Authority)에서 발급한 인증서를 사용
  • 포트: 기본적으로 443번 포트를 사용
예시 http://www.example.com https://www.example.com

 


HTTPS의 중요성   (중요도 🌟 🌟)

💡SSL/TLS의 역할
SSL(Secure Sockets Layer) 및 TLS(Transport Layer Security)는 HTTP 프로토콜 위에서 동작
데이터 전송 시 보안을 강화하고, 데이터 무결성과 서버 인증을 제공

 

암호화와 인증

  • 데이터 무결성: 데이터가 전송되는 동안 변조되지 않았는지를 확인하는 기능을 제공. 이를 통해 수신자는 데이터가 원래 전송된 형태와 일치하는지 확인 가능
  • 서버 인증: 클라이언트(사용자)와 서버 간의 연결을 암호화하기 전에, 서버가 신뢰할 수 있는 인증 기관(CA)에 의해 인증되었음을 보장. 서버 인증은 사용자가 방문하는 웹 사이트가 실제로 신뢰할 수 있는 서버인지 확인하는 과정
  • 데이터 전송 시 보안 강화: SSL/TLS는 데이터가 네트워크를 통해 전송될 때 암호화하여 제 3자가 데이터를 읽거나 변조할 수 없도록 함. 암호화된 데이터는 중간에 있는 누군가가 쉽게 해독할 수 없으며, 이로 인해 데이터가 안전하게 전송

 

 

 


도메인과 IP주소 (중요도🌟🌟)

DNS 서버  (중요도 🌟 🌟)

: 도메인 이름을 IP 주소로 변환하는 시스템

사용자가 웹 브라우저에 도메인 이름을 입력하면, DNS 서버는 해당 도메인 이름에 대응하는 IP 주소를 찾아 반환하여, 사용자는 기억하기 쉬운 도메인 이름을 사용해 웹 사이트에 접근 가능

 

IP 주소

: 네트워크 상에서 장치를 식별하는 고유한 주소

데이터 패킷이 올바른 목적지로 전달될 수 있도록 하는 역할을 가지고, 모든 네트워크 장치(컴퓨터, 스마트폰, 서버 등)는 고유한 IP 주소를 가짐

 

IPv4 IPv6
32비트 주소 체계를 사용 약 43억 개의 고유한 주소 제공 가능.
주소는 4개의 10진수로 구분된 8비트 블록으로 표시
128비트 주소 체계를 사용하여 훨씬 더 많은 주소 제공.
주소는 8개의 128비트 블록으로 구성된 16진수로 표시
192.168.0.1 2001:0db8:85a3:0000:0000:8a2e:0370:7334

 

 

 


URL 구성요소

 

프로토콜(Protocol)
URL의 시작 부분에 위치하며, 웹 페이지와 서버 간의 통신 방식을 정의. 일반적으로 http 또는 https가 사용

도메인(Domain)
URL 중앙 부분에 위치하며, 웹 사이트의 고유한 주소를 나타냄. 도메인은 DNS를 통해 IP 주소로 변환됨

경로(Path)
도메인 뒤에 위치하며, 웹 사이트 내의 특정 리소스나 페이지를 식별 가능하고 서버 내에서 리소스의 위치를 지정

쿼리 문자열(Query)
URL의 마지막 부분에 위치하고, 웹 페이지에 전달할 추가 정보를 포함하며 ?로 시작하며, 매개변수와 값을 &로 구분

 

 

 


웹 페이지 구성 요소  (중요도 🌟🌟 🌟)

🌟HTML 역할 및 기본

HTML(Hyper Text Markup Language)
  • 웹 페이지의 구조를 정의하는 마크업 언어
  • HTML을 사용하여 웹 페이지의 내용과 구조를 정의
  • 텍스트, 이미지, 링크, 폼 등 다양한 요소를 포함
  • 웹 브라우저가 웹 페이지를 표시하는데 필요한 정보를 제공
태그(Tag)
  • HTML 문서는 태그로 구성
  • 열기 태그와 닫기 태그로 구성 <열기 태그></닫기 태그>
  • 웹 페이지의 콘텐츠를 구조화하는 데 사용
속성(Attribute)
  • HTML 태그추가적인 정보를 제공하기 위해 속성을 가짐
  • 태그의 기능을 조절하거나 내용을 수정하는데 사용

 

 


 

🌟CSS 역할 및 기본

CSS(Cascading Style Sheets)

  • 웹 페이지의 스타일을 정의하는 언어
  • CSS를 사용해 웹 페이지의 레이아웃, 색상, 폰트, 간격 등을 설정
  • HTML의 구조와 내용을 시각적으로 꾸미는 데 사용
인라인 스타일
  • HTML 요소 내에서 직접 스타일을 정의하는 방법
  • style 속성을 이용해 요소에 직접 CSS 스타일 적용

 

내부 스타일 시트
  • HTML 문서의 <head> 섹션 내에 <style> 태그를 이용해 정의된 스타일

 

외부 스타일 시트
  • 별도의 CSS 파일을 생성하여 웹 페이지에 링크하는 방법
  • 여러 HTML 문서에서 동일한 스타일을 적용할 때 사용

 

 

💡HTML, CSS 로는 정적 웹페이지 구현
JavaScript 로는 동적 웹페이지 구현 가능

 


 

🌟JavaScript 역할 및 기본

JavaScript란 .js

  • 웹 페이지의 동적 동작을 제어하는 프로그래밍 언어
  • 페이지의 내용이나 구조를 동적으로 변경하거나 사용자와의 상호작용을 처리

 

기본 문법

  • 변수 선언, 함수 정의, 조건문, 반복문 등
  • 변수는 let, const를 이용해 선언
  • 함수는 function 키워드를 사용

<script> 태그
  • JavaScript 코드를 HTML 문서에 포함시키기 위해 <script> 태그를 사용
  • <script> 태그는 HTML 문서의 <head> 태그 내부나 <body>태그 내부에 배치 가능
  • 외부 JavaScript 파일을 링크하는 것도 가능
내부 스크립트
외부 스크립트

 

 

JavaScript를 선언하는 script 태그의 위치로 적절한 곳은?
==> 문서의 <body> 태그 끝에 위치

🔸이유
빠른 페이지 로딩
: HTML 콘텐츠가 먼저 로드되므로 페이지가 빠르게 보임 JavaScript는 콘텐츠가 모두 로드된 후에 실행되므로 렌더링이 차단되지 않음

최적의 사용자 경험
: 페이지 콘텐츠가 먼저 보이기 때문에 사용자에게 빠르게 콘텐츠를 제공 가능

'특강' 카테고리의 다른 글

프론트엔드 통신 특강  (1) 2024.09.10
웹 심화 이해  (0) 2024.08.14
기술면접_CS, SQL 내용정리  (0) 2024.08.08
CS 특강(소프트웨어 설계)  (0) 2024.07.26
CS 특강(컴퓨터 구조와 운영체계)  (0) 2024.07.25

 

 

 

 

자료구조

✨자료구조에서는 데이터랑 연산이 꼭 필요함

 

 


 

선형 자료구조(Linear Data Structure)

: 데이터 요소를 순서대로 정렬

 

✨ 개별 요소에 접근하는 작업에는 선형 자료구조가 더 효율적.

선형 자료구조에서는 첫 번째 요소가 마지막 요소까지 백트래킹(Backtracking)없이 순회할 수 있지만, 비선형 자료구조에서는 종종 되돌아가야 함.

 

 

배열(Array)

배열의 가장 큰 특징은 인덱스 (추가, 삭제, 삽입, 수정)

 

✨특징

- 선형 자료구조(1차원 자료구조)
- 모든 요소는 동일한 데이터 타입을 가짐

- 정적 자료구조 : 크기가 고정되어 있는 자료구조
- 각 요소는 하나의 인덱스에 매핑
고정된 크기를 가짐
- 연속된 메모리 블럭에 할당(메모리 한 칸의 크기가 모두 동일함)
- 정렬되어있기 때문에, 빅오 속도를 더 빠르게 할 수 있음 (O(log n) -> 이분탐색
- 기본적으로 시간복잡도 O(1)

 

 

✨시간복잡도 연산

삽입/수정/삭제 ==>  O(n)

 

 


연결 리스트(Linked list)

연결리스트는 인덱스가 없음. 첫 번째 노드의 값을 읽어서 다음 노드의 주소를 찾아야 됨

메모리 안에 랜덤하게 배정하여 노드가 그 주소를 가지고 있음.

 

✨특징

- 선형 자료구조(1차원 자료구조)
- 모든 요소는 동일한 데이터 타입을 가짐

- 동적 자료구조 : 크기가 바뀔 수 있는 자료구조
- 첫 번째 노드의 주소만 알고 있음
- 가변 크기를 가질 수 있음
비연속된 메모리 블럭에 할당
- 연결리스트는 불연속이라 빅오가 더 빨라질 방법은 없음

 

 

파이썬은 배열과 연결리스트 특징을 모두 가지고 있음
그래서 동적 배열이라고 부름.(Dynamic Array)

 

 

 


비선형 자료구조(Nonlinear Data Structure)

: 데이터를 비연속적으로 연결

 

트리(Tree)와 그래프(Graph)


트리는 계층 구조가 있는 가계도, 조직도에 주로 쓰임
그래프는 SNS와 같이 한 사람의 영향력을 네트워크처럼 표현

트리를 연산할 때 필요한 것 : 추가, 삭제, 수정, 정렬, 탐색(계층 아래까지 갔다가 다음 계층으로 이동해서 아래로 팜)
그거를 DFS(깊이 우선 탐색), BFS(너비 우선 탐색) -> 탐색하는 알고리즘

트리랑 그래프 자료구조에서 대표적인 알고리즘이 dfs, bfs 임

 

 

 


Search or Retrieve

 

Search : 검색하다

get an index from an element


- 보통 특정 원소(요소)의 위치(인덱스)를 찾는 과정.
- 위치(인덱스)를 알고 있지 않음
- 찾는 것


선형 탐색 : 정렬되지 있지 않은 배열에서 for문으로 하나씩 돌면서 인덱스 값 도출
이진 탐색(이분 탐색) : 정렬된 배열에서 가능, 이분 즉 반씩 범위를 좁혀가며 인덱스 값 도출

 

 

분할 정복 기법 (이 안에 이진 탐색이 들어감)

: 큰 문제를 작은 문제들로 쪼개서 작은 문제들을 해결하는 것으로 큰 문제를 해결하는 기법, 3가지


- divide : 큰 문제를 작은 문제로 쪼갬
- conquer : 작은 문제들에서 결론을 도출해내는 과정 (재귀로 띄고 있는 경우가 많다)
- combine(optional) : 있을수도 있고, 없을 수도 있음

대표적인 분할 정복 예시 (토너먼트): 이분 탐색, 병합 정렬, 퀵 소트

 


### 알고리즘 공부하려면 토익처럼, ⓐ문자열(회문, 파문) ⓑ배열 순회

 


Retrive : 검색하다(가져오다)

get an element from an index


- 특정 인덱스나 위치에서 해당하는 원소(요소)를 가져오는 과정
- 이미 인덱스나 위치를 알고 있음.
- 가져오는 것

 

객체지향 4가지 특징: 추상화, 상속, 다형성, 캡슐화

상속을 왜 사용하는가 : 

 

만약 상속을 사용하지 않는다면, 비슷한 기능을 구현할 때마다 동일한 코드를 작성해야 하기 때문에, 
상속을 사용해서 클래스의 기능을 재사용하고, 확장할 수 있습니다.

🐬Feedback
다형성과 캡슐화에 대한 설명이 조금 부족함. 이 부분은 추가적인 공부가 필요함.
객체지향에 대해 설명할 때, 절차지향과 비교하면서 설명해도 좋음.
캡슐화는 금융관련 코딩에만 쓰이지 않기 때문에 한정적인 표현은 좋지 않음. 어디에 사용하는 것이 적합하다고 설명하는 게 좋음.

HTTP / HTTPS 차이

 

HTTP(80)
서버랑 클라이언트가 웹상에서 정보를 주고 받을 수 있도록 해주는 프로토콜을 의미, http는 암호화를 하지 않는 프로토콜, http는 평문으로 되어있어서 탈취의 가능성이 있음


HTTPS(443)
- 보안성이 취약한 문제를 극복하기 위해 암호화를 하는 http프로토콜
HTTP 요청과 응답을 암호화하고 해당 요청과 응답에 디지털 서명을 한다

 

🐬Feedback
어떤 용어를 말할 때, 정확한 약자가 생각나지 않을 경우 면접에선 그 용어를 사용하지 않는 것이 좋음.

 


UDP / TCP 차이

UDP(UserDatagramProtocol)
- 비연결형 데이터그램 방식의 프로토콜로 신뢰성을 보장하지 않음
- TCP에 비해 구조가 단순하고 빠름
ex)스트리밍, 게임 같은것에 주로 사용, 데이터가 손실되더라도 속도가 더 중요한 경우 udp를 사용함

TCP(TransmissionControl Protocol)
- 연결형 가상회선 방식의 프로토콜로 신뢰성을 보장함
- UDP에 비해 구조가 복잡하고 느려요.
ex)보안이 필요할 때 사용(공인인증같은), 파일 전송/이메일 전송 일반적인 데이터는 손실이 안돼서 tcp를 사용함



 


OSI 7계층

1계층_물리 : 물리적 접속(허브, 리피터) (비트(bit) 단위)
2계층_데이터링크 : 링크의 접속(스위치, 브릿지, 랜카드) : 주소 할당 (MAC주소) (프레임(frame) 단위)
3계층_네트워크 : 데이터 교환(라우터, IP주소) (패킷 단위) 
4계층_전송 : 정확한 정보 교환(오류 검출 및 수정) (TCP, UDP, 포트번호) (TCP : segment 단위, UDP : Datagram 단위)

5계층_세션 : 응용 프로그램 간의 연결 관리(연결 및 연결 복구)
6계층_표현 : 데이터 번역(서로 다른 데이터 표현 방식 간 번역) (암호화, 복호화)
7계층_응용 : 응용프로그램 서비스 제공(각종 응용 프로그램) (HTTP, FTP, SMTP, DNS)

🐬Feedback

슬랙을 OSI계층으로 표현하라는 질문. (Case : 슬랙 메시지를 보내는 상황)


1계층_물리 :
메시지를 발송하기 위해 인터넷이 필요함. 무선 통신 매체를 통신해서 데이터를 전송하기 위한 신호로 바꿈.

2계층_데이터링크 :
물리 계층에서 어플리케이션(추상화)계층까지 가기 위한 계

3계층_네트워크 :
전송된 메시지를 패킷으로 쪼개어 패킷에 담아 전송한다. 또, 패킷의 송신지와 수신지 주소들을 포함하는 필드를 가진다. 최적의 데이터 경로를 설정해준다.
(ex. 내배캠 민준 튜터님, 최고 ==>  내배캠 / 민준 / 튜터님, / 최고)

4계층_전송 :
TCP/UDP 중 어떤 것으로 보낼지 설정. 패킷의 전송이 유효한지, 전송에 실패된 패킷을 재전송 하는 등 신뢰성 있는 통신을 보장함. 메시지를 전송하여 도착함.

5계층_세션 :
슬랙은 켰지만, 로그인이 안 돼있거나 화면을 켜지 않으면 메시지를 볼 수 없음. 즉 메시지를 보기 위해 어떠한 세션을 연결해줌.

6계층_표현 :
암호화인지, 아닌지 구분함.

7계층_응용 :
슬랙(어플리케이션) 그 자체

 

 


배열(Array)과 연결리스트(Linked list) 차이

배열이랑 연결리스트  공통점 : 선형구조(1차원적)

 


배열은 정적자료구조연속된 메모리 주소를 할당받기 때문에 인덱스를 가지게 됨. 인덱스를 가지고 있기 때문에 접근과 탐색에 용이함. 수정이 어려움


연결리스트는 동적자료구조, 연속된 메모리 주소를 할당 받지 않고, 노드 안에 다음 노드의 주소를 가지고 있음.데이터 추가/삭제가 자유로움

🐬Feedback
어렵다라는 표현이 조금 애매할 수 있음. (왜 어렵나요? 라는 역질문 받을 수 있음) 다른 거에 비해 속도가 더 빠르다, 용이하다
데이터 추가/삭제_시간복잡도: 배열이 O(n), 연결리스트 O(1) 
일반적으로 시간복잡도는 배열 O(1), 연결리스트 O(n)

 


SQL과 NoSQL 차이

SQL: DBMS를 조작하기 위한 프로그래밍 언어
(DDL, DML, DCL, TCL)
스키마 :  DB의 구조와 제약 조건에 관한 전반적인 명세를 정의한 메타데이터의 집합

 

SQL 데이터베이스 관계형 데이터베이스,  NoSQL 데이터베이스는 비관계형 데이터베이스


SQL 

: 행과 테이블과 같은 구조화된 데이터를 관리할 수 있도록 하는 기존 접근 방식의 프로그래밍 언어


NoSQL(Not Only SQL) 

: 유연한 비관계형 접근 방식을 제공하여 구조화되지 않은 데이터 또는 동적 데이터를 처리

🐬Feedback

SQL , NoSQL 둘다 채팅서비스를 구현할 수 있음. 근데 어떤 걸로 만들 것인지 본인이 설득하는 게 필요함.

 

 


조인과 서브쿼리 차이

조인은 두 개 이상의 테이블을 결합하는 데 사용서브쿼리는 쿼리 내에서 다른 쿼리를 실행하는 데 사용. 

 

조인

: 일반적으로 더 효율적이며 데이터를 조회하는 더 직관적인 방법. 

 

서브쿼리 

: 복잡한 쿼리를 작성하는 데 사용할 수 있지만 성능이 저하될 수 있음.

 

 


자료구조

 

스택은 LIFO, 큐는 FIFO

 

스택

: 재귀함수를 구현할 수 있고, DFS탐색에 사용됨. 


: BFS탐색에 사용되어 작업이 순차적으로 진행될 때 사용됨.


트리와 그래프

 

트리

: 그래프 중 하나이지만 특수한 목적이 있는 자료구조. 사이클이 없고 루트노드 혹은 부모-자식 관계가 존재함. (계층이 존재함)

 

그래프

:노드와 노드 간을 연결하여 방향 혹은 무방향 그래프가 있고, 사이클이 존재할 수 있음. (네트워크로 존재함)


소프트웨어 개발 표준문서

 

SRS(Software Requiremetns Standards)

: 소프트웨어가 만족해야하는 요구사항을 상세하게 명세한 문서,

 

SDS(Software Design Standards)

: 소프트웨어의 전반적인 설계에 대해 상세하게 명세한 문서

 

SCS(Software Code Standards)

: 소프트웨어를 코딩하기 위해 사용되는 프로그래밍 언어, 방법, 룰, 그리고 툴을 정의한 문서

 


📁추가 내용

 

✨Keyword
클라이언트, 서버, RESTful, OSI 7계층, TCP/IP 4계층별 설명, 보안, DBMS(데이터베이스 관리 시스템)
클러스터링, 병렬컴퓨팅, 프로토콜, HTTP, HTTPS, HTML

 

 

클라이언트-서버

클라이언트

: 네트워크를 통해 서버에 요청을 하고 서비스를 제공받는 주체

(ex. 모바일에서 음식 배달 서비스 요청, 데스크탑에서 게임 웹사이트에서 게임 다운로드 버튼 클릭)

 

서버

: 네트워크를 통해 클라이언트의 요청을 받고 서비스를 제공하는 주체는 모두 서버


서버 종류:

- 클라우드 서버

- 웹 서버

- 데이터베이스 서버

- 어플리케이션 서버

- 프록시 서버


클러스터링-병렬컴퓨팅

 

클러스터링

: 네트워크에 접속된 다수의 컴퓨터들을 통합하여 하나의 거대한 병렬 컴퓨팅 환경을 구축하는 기법

(꼭 하나의 작업만을 위한 것은 아님)

 

병렬 컴퓨팅 

: 하나의 큰 문제를 여러 컴퓨터가 나누어 해결하는 방법, 2개 이상의 CPU가 각자 맡은 역할을 수행하는 개념

(꼭 같은 시스템을 사용하는 것은 아님)

 


Domain-DNS

 

Domain(도메인)

: 네트워크 상에서 호스트를 가리키는 이름

(ex. www.google.com,  www.naver.com)

 

DNS(Domain Name System)

: 컴퓨터가 읽기 편한 구조인 IP주소를 도메인 이름으로 바꿔주는 시스템을 의미

(원래 192.xxx.xxx.xxx ==> www.naver.com, www.google.com 이런 도메인 이름으로 바꿔주는 시스템)

 


RESTful

: HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 아키텍처를 지향하는 웹서비스

 

'특강' 카테고리의 다른 글

웹 심화 이해  (0) 2024.08.14
웹 기본 이해  (0) 2024.08.12
CS 특강(소프트웨어 설계)  (0) 2024.07.26
CS 특강(컴퓨터 구조와 운영체계)  (0) 2024.07.25
Git 기초_git 초기 설정  (0) 2024.07.12

시간 복잡도와 공간 복잡도

 

복잡도란, 알고리즘의 성능, 효율성을 나타내는 척도를 말함

각 알고리즘이 주어진 특정 크기의 입력(n)을 기준으로 수행시간(연산) 혹은 사용공간이 얼마나 되는지 객관적으로 비교할 수 있는 기준을 제시함.

 

 

알고리즘을 평가할 때 주로 수행 시간과 메모리 사용량을 기준으로 두는데, 이 중 수행 시간에 해당하는 것이 시간 복잡도이고 메모리 사용량에 해당하는 것이 공간 복잡도이다.

 

 

시간 복잡도(Time Complexity)

특정 크기의 입력을 기준으로 할 때 필요한 연산의 횟수를 나타냄.

 

 

 

공간 복잡도(Space Complexity)

프로그램 실행과 완료에 얼마나 많은 공간(메모리)가 필요한지를 나타냄

 

 

시간 복잡도와 공간 복잡도는 반비례하는 경향이 있어, 보통 알고리즘의 성능을 판단할 때는 시간 복잡도를 위주로 판단함

 


어떻게 하면 더 효율적으로 해결할 수 있을까?

 

해결책을 비용으로 나눈 것을 퍼포먼스라고 하고, 이 퍼포먼스를 올리기 위함

 


Solution (대전제: No Solution, no performance)
알고리즘이고 뭐고 일단 문제를 해결할 수 있는 방법을 찾아야 한다.

퍼포먼스를 올리려면, 서버 비용을 낮춰야 됨

 


- Temporal Resource 시간 자원
CPU : 겁나 빠른 계산기(CPU가 열심히 계산해서 결과를 도출하는 게 시간과 연관이 있음)

 


- Spatial Resource 공간 자원
메모리를 얼만큼 쓰는가
주 저장장치(램=메모리), 보조 저장장치(SSD, USB)
램은 SSD에 비해 100배 이상 빠름

 

 


★Key point1: Performance of worst case is important(최악의 경우가 중요함)

CS에서의 비용이란?
공간 복잡도, 시간 복잡도 
공간의 기술이 좋아지면서, 공간 복잡도가 크게 중요하지 않게 됨.
(중요한 건 시간의 비용이다)

 

 

★Key point2: Performace of time is important(시간이 중요함)

내 프로그램이 최악일 때, f(n)이 어디로 향할까
worst case는 n이 엄청 커질 때임(n이 무한으로 갈 때)
최악의 경우가 어디까지 도달하냐


점근적 복잡도 : 알고리즘의 성능을 나타내는 척도
주로 입력(n)의 크기가 무한히 커질 때 알고리즘의 성능이 어떻게 변하는지를 분석
즉 알고리즘의 성능은 주어진 문제의 입력 크기에 따라 달라짐

 

입력이 n이라면 성능은 f(n)이라 할 수 있음
f(n)은 입력 크기 n에 대한 알고리즘의 시간(공간) 복잡도를 나타내는 함수

 

 

★Key point3: Performace is a function of input size(인풋 사이즈가 중요함)

우리의 목표는 알고리즘의 성능이 얼마나 좋은지 가늠하고 싶을 뿐(정확한 수치 도출이 아님)
즉, 비교를 통해 짐작을 하고 싶은 거

 

 

★Key point4: Some key functions are used for standards (여러 비교 대상의 기준이 필요함)

 

f(n)의 정확한 값이 필요한 게 아니라 어떤 값과 비교했을 때 더 빠른지, 느린지 비교가 하고 싶은 것.

즉, g(n) 설정해두면 g(n)가 f(n)을 비교하여 크기를 비교할 수 있음.


 


빅오 "표기법": 큰 동그라미 표기법

 

> 입력값이 커질 때 알고리즘의 실행 시간(시간 복잡도) 혹은 공간 요구사항(공간 복잡도)가 어떻게 증가하는지 '분류' 혹은 '비교'하는데 유용하게 사용되는 표기법
최고 차항만을 표기, 계수는 무시 (어차피 n은 무한대로 보내니까)

 


시간복잡도는 O(n^2) : 입력값(n)에 따른 알고리즘의 점근적 추이가 n^2 함수의 모양처럼 올라감
== 입력값(n)에 따른 알고리즘의 실행시간의 추이가 n^2처럼 생겼다

 

 

 


 


[★Key functions★]

 

O(1) 상수 시간 복잡도: 입력값이 아무리 커도 실행시간이 일정함 (가장 좋은 알고리즘)
>상수시간복잡도로 해시 테이블의 조회와 삽입 연산이 있음

 


O(log n)로그 시간 복잡도: 매우 큰 값에도 영향을 받지 않아서 큰 값을 다루는 학문에서 자주 쓰임 (이분 탐색)(점점 반으로 줄여서 찾음)
로그는 매우 큰 값에도 영향을 많이 받지 않음
+)배열에서 정렬이 된 경우라면 빅오는 O(log n)이 됨

 


O(n) 선형 시간 복잡도: 입력값만큼 비례해서 실행 시간에 영향을 받음(한 개의 for문 이에 해당)
> 정렬되지 않은 리스트에서 최댓값 또는 최솟값을 찾는 경우
> 배열(array) 기본적으로 O(n)

 


O(n log n): 병합 정렬을 비롯한 대부분의 효율 좋은 정렬 알고리즘이 이에 해당


-------------------------------------------------------- (▼inefficiency▼) ---------------------------------------------------------


O(n^2): 버블 정렬 같은 비효율적인 정렬 알고리즘 (중복 for문이 이에 해당)

 


O(2^n): 피보나치의 수를 재귀로 계산하는 알고리즘이 이에 해당

 


O(n!): 굉장히 효율이 안 좋은 알고리즘

 


★빅오를 구할 때는, 로직 한 줄씩 모두 이해해야 구할 수 있음(즉 코드를 이해해야 됨)

 

1. 네임스페이스(namespace, 이름공간) (중요도🌟🌟🌟)

: 변수가 객체를 바인딩할 때 그 둘 사이의 관계를 저장하고 있는 공간 (바인딩: 구체적인 값을 할당하는 것)

ex. a = 2
==> a라는 변수가 2라는 객체가 저장된 주소를 가지고 있고, 그러한 연결 관계가 저장된 공간이 바로 네임스페이스

 

프로그래밍 언어에서 특정한 객체(Object)를 이름(Name)에 따라 구분할 수 있는 범위를 의미. 파이썬 내부의 모든 것은 객체로 구성되며, 이들 각각은 특정 이름과의 매핑 관계를 갖게 되는데 이 매핑을 포함하고 있는 공간을 네임스페이스라고 한다.

 

 

네임스페이스가 필요한 이유

프로그래밍을 수행하다보면 모든 변수 이름과 함수 이름을 정하는 것이 중요한데 이때 중복되지 않게 설정해줘야 함.

따라서 네임스페이스라는 개념을 도입하여, 특정한 하나의 이름이 통용될 수 있는 범위를 제한함.

즉, 소속된 네임스페이스가 같은 이름이 다른 개체를 가리키도록 하는 것이 가능해짐.

dir 내장함수의 결괏값을 통해 알 수 있음
클래스 또는 인스턴스에 대한 네임스페이스를 확인하려면 __dict__속성을 확인

전역 네임 스패이스 : 모듈별로 존재하며, 모듈 전체에 통용되는 이름을 사용한다.
지역 네임 스페이스 : 함수 및 메소드 별로 존재하며, 함수 내의 지역 변수들이 소속된다.
빌트인 네임 스페이스 : 기본 내장 함수 및 기본 예외들의 이름을 저장하는 

 

 

 

2. 클래스 변수(class variable) (중요도🌟🌟)

클래스 변수 선언하는 방법 : 클래스 내부에 변수 설정
클래스 변수를 변경할 때는 항상 클래스명.클래스 변수 형식으로 변경

 

 

 

3. 인스턴스 변수(instance variable) (중요도🌟🌟)

: self.name과 같이 self가 붙어 있는 변수를 인스턴스 변수

 

 


4. 메서드

 : 특정 데이터 타입/클래스의 객체에 공통적으로 적용 가능한 함수 (클래스 안에 있는 모든 함수는 메서드)

 

🦄메소드 3가지

ⓐ인스턴스 메서드(instance method)
ⓑ클래스 메서드(@classmethod),
ⓒ정적 메서드(@staticmethod)

 

 

 

5. 인스턴스 메서드(instance method) (중요도🌟🌟)

 : 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하겠다는 의도가 담겨있음(클래스 내부에 정의되는 메소드의 기본)
인스턴스 변수 선언하는 방법 : self.name = name

인스턴스 메소드 호출 시, 첫번째 인자로 인스턴스 자기자신(self)이 자동으로 전달되도록 설계되어있음.
(이게 self.~ 넣는 이유임 self 자리에 인스턴스가 들어오는거)
self : 인스턴스 자기자신임 (self 쓰는 게 암묵적 규칙)

[인스턴스 메서드 호출방법]
- 해당 클래스 안에서는 self.메소드명
- 클래스 밖에서는 객체.메서드명

 

 

 

6. 매직메소드

: 매직메서드는 생성자, 인스턴스를 만들면 특정 상황에 자동으로 호출됨

__init__ :클래스의 인스턴스가 생성될 때, 자동으로 호출되는 함수
init : 초기화 준말인데(인스턴스 변수들의 초기값을 설정), 생성자 역할임. 
ex. Person() = Person.__init__(Person)

__del__ : 클래스의 인스턴스가 소멸될 때, 자동으로 호출되는 함수

 

 

 

7. 정적 메서드(static method) (중요도🌟🌟)

: 객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드. 함수 정의하고 위에 @staticmethod 붙이면 정적 메서드임을 나타냄.

정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수를 만들 때 사용. 즉, 인스턴스 상태를 변화시키지 않는 메서드를 만들 때 사용

(순수 함수란, 부수 효과가 없고 입력 값이 같으면 언제나 같은 출력값을 반환함.)

self로 호출 X, 정적 메서드 내부에서 클래스 변수(속성)에는 클래스명.클래스속성명으로 접근 가능

[정적 메서드 호출방법]
- 클래스명.정적메서드명 (주로 사용)
- 객체명.정적메서드명

 

 

 

8. 클래스메서드(class method) (중요도🌟🌟)

 

: self 대신 cls라고 씀. 함수 정의하고 위에 @classmethod 붙이면 이름 없어도 함수가 실행됨(데코레이텅 기능)

인스턴스 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하지만 약간의 차이점이 있음.

[클래스 메서드 호출방법]
- 클래스명.클래스메서드명
- 객체명.클래스메서드명

 

 

🆚정적 메서드 VS 클래스 메서드
정적 메서드 클래스 메서드
인스턴스 변수를 호출할 수 없지만
인스턴스 메소드는 static 변수를 호출할 수 있음
클래스메서드는 인스턴스 변수에 접근할 수 없음
(클래스 단위로만 접근)
인스턴스 메소드를 호출할 수 없지만
인스턴스 메소드는 static 메소드를 호출할 수 있음
인스턴스 메소드를 호출할 수 있음
🔸인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘다 사용이 가능


✴️ 그러면 언제 static을 붙이면 좋은가?
==> 인스턴스 변수를 사용하지 않는 경우에 static 붙인다.

정적 메서드: 인스턴스, 클래스 변수를 전혀 다루지 않는 메서드  
->> 사용하는 이유는, 클래스 안의 메서드랑 비슷하다보니 같이 묶어두는거.
일반 함수처럼 동작하지만, 클래스의 이름 공간에 귀속됨(내 생각: 개발자가 보기 편하고 유지보수하기 편하려고)

 


📁추가 내용

 

🗝️데코레이터

: 함수나 메서드에 적용되어, 해당 함수나 메서드의 기능을 확장하거나 변경하는 역할

 


<데코레이터> (함수의 꽃)
"@"를 이용하여 데코레이터함. 함수를 꾸며서 새로운 기능을 부여함. 함수 또는 메서드 위에 위치함
기존 함수를 건드리지 않고, 함수에 기능을 추가할 수 있음.

ex. @property, @setter


📍함수도 인자로 넘길 수 있음.  💡인자 다 받고 싶을 때는 *args, **kargs

'파이썬 > 파이썬 심화' 카테고리의 다른 글

매직메소드 정리  (1) 2024.08.02
객체지향 프로그래밍  (0) 2024.07.30

 

📍 매직메소드 중 __str__ 메소드와 __repr__ 메소드의 공통점과 차이점

 

공통점

객체를 문자열로 반환함 : 객체가 어떤 타입을 가졌던 간에 그것을 문자열로 반환 

 


차이점

__str__ 메소드

: interface로서의 역할을 수행하기 위해 존재
서로 다른 타입을 가진 데이터끼리 상호작용할 때 문자열로 반환시킴으로서 상호간의 호환이 가능하도록 함
즉, 사용자에 좀 더 초점이 맞춰져있음
쉽게 말해 print() 함수를 떠올리면 된다.
사실 print() 함수는 단순히 출력만 하는 기능이 아닌, 터미널 창에 문자로 보이게 출력해주는 기능이다.
즉, a = 1 을 출력하면 a의 실제 타입은 int지만, 터미널에 보여지는 1은 사실 문자임
사용자가 보기 편하도록 문자로 모두 변환해서 출력하는 것임.
(bc) print는 내부적으로 str 메소드를 호출함.

__repr__ 메소드

: 객체를 문자열로 표현하기 위해 존재하는 메소드지만 개발자에 초점이 맞춰져있음.
__repr__의 반환 값은 eval 함수에 사용 가능하며 이를 활용하여 새로운 객체를 만들어 내는 것도 가능
(단, __str__ 메소드의 반환 값은 eval 함수에 사용할 수 없음)

 

 


🫧 오늘 배운 매직메소드 내용 정리

 

__dict__

: 객체의 속성을 딕셔너리로 반환함. 딕셔너리의 key 는 객체의 어트리뷰트이고 value 는 어트리뷰트의 값이다.


__dir__ 

모든 메서드와 어트리뷰트를 보여줌


__init__ 

: 생성자를 호출하여 클래스의 새 인스턴스를 생성할 때 실행됨 (클래스 만들 때, 가장 상단에 작성하는 듯함, 생성할 인스턴스의 속성을 나타내니까 이 클래스가 어떤 용도인지 바로 알 수 있을 것 같아서?)


__doc__ 

: 클래스나 함수 내부의 apostrophe(’)에 담긴 내용들을 나타내줌. (만약 파이썬에 이미 정의되어 있는 메소드를 doc로 호출할 경우, 파이썬에서 docstring으로 작성한 내용들이 나타남. 내 생각엔 이게 함수 사용설명서 같은 느낌임.)

 


📁추가 내용

id(_) 함수

매직메소드는 아니지만 오늘 수업에서 id() 함수를 사용하였는데, 이것은 객체의 ID를 가져오는 함수임
즉, ID를 통해 어떤 객체를 가리키는지 확인할 수 있음.
또, 클래스에도 id가 존재하는데 추후 부모클래스/자식클래스를 공부할 때, 클래스 종류가 많아지면, 생김새로는 구분하기 어려울 수 있기 때문에, 이떄 id()함수를 사용한다고  보스가 말씀하심.
id는 파이썬이 객체를 구별하기 위해서 부여하는 일련번호일 뿐, 숫자로서 의미는 없음

 

'파이썬 > 파이썬 심화' 카테고리의 다른 글

인스턴스, 클래스, 정적메서드  (0) 2024.08.05
객체지향 프로그래밍  (0) 2024.07.30

+ Recent posts