더보기

기수법 진수변환 보수 고정소수점 부동소수점 아스키코드 유니코드

 


01장 CPU
02장 운영체제 - 프로세스와 스레드
03장 운영체제 - 메모리
04장 프로그래밍 언어, 컴파일러
05장 변수, 정수, 실수, 문자열
06장 함수
07장 객체지향
08장 클래스
09장 자료구조 1
10장 자료구조 2
11장 알고리즘
12장 네트워크
13장 데이터베이스


 

 

 

 

 

1. 변수

  • 변수 : 데이터를 저장할 수 있는 메모리 공간
  • 저장되는 데이터 : 숫자, 문자, 객체(class), 메모리 주소(포인터 변수), 함수

💡 이번 페이지는 데이터들을 변수에 어떻게 저장하는지에 대해서 설명합니다.

변수에 값이 담겨 있는 모습

 

 

 

 

 

 

2. 정수

2-1. 기수법

  • 기수법 : 수를 시각적으로 나타내는 방법
  • 기수법의 종류
    • 10진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    • 2진수 : 0, 1
    • 16진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

2-2. 진수 변환

1) 2진수 → 10진수

  • 11001이라는 2진수를 10진수로 변환하는 예시
    • 2진수의 각 자릿수 제곱을 계산한 숫자를 전부 더한다.
    • 정답 : 16 + 8 + 1 = 25

 

2) 10진수 → 2진수

2-3. 보수

1) 보수

  • n진수에는 n-1의 보수, n의 보수가 존재
    • 10진수 n의 9의 보수 : n의 모든 자릿수를 9으로 만들 수 있는 숫자
    • 10진수 n의 10의 보수 : 거기에 1을 더한 것

  • 예시
    • 10진수 26의 9의 보수 : 73
    • 10진수 26의 10의 보수 : 74
    • 2진수 1010의 1의 보수 : 0101
    • 2진수 1010의 2의 보수 : 0110

2) 보수를 사용하는 이유

  • 컴퓨터가 뺄셈 연산을 간단하게 하기 위함
    • 음수를 2진수 2의 보수로 표현하고, 보수를 사용해서 뺄셈을 덧셈 연산으로 처리한다.

 

 

 

 

 

 

 

3. 실수

3-1. 실수의 진수 변환

  • 10진수 실수 → 2진수 실수
    • 7.75 = 4 + 2 + 1 + 0.5 + 0.25 = 111.11

3-2. 고정 소수점 (fixed-point)

  • 특징 : 비효율적이지만 계산하기 쉬움 (요즘 잘 안 씀)
  • 부호(sign) 부분 : 0 양수, 1 음수

 

3-3. 부동 소수점 (floating-point)

  • 특.징 : 둥.둥 떠다.니는 소.수점... (비트를 좀 더 효율적으로 쓸 수 있어서 요즘 많이 씀)
  • 종류
    • Single Precision(32bit) : Float
    • Double Precision(64bit) : Double

  • 지수 부분 (exponent)
    • 음수를 표현하기 위해서 보수 기법 대신(뺄셈을 사용하지 않기 때문) bias 표현법을 사용
    • exp - bias = 실제 지수

bias 표현법 예제 (지수부가 8bit인 부동 소수점을 사용할 경우)

  • 가수 부분 (manissa) : 길면 자르고, 남으면 0으로 채움

 

 

 

 

 

 

 

4. 문자와 문자열

3-1. 문자 인코딩

  • 문자를 숫자로 표현하는 것

3-2. 아스키 코드

  • 아스키 코드 : 7비트(0~127) 숫자에 문자를 하나씩 대응한 것
    • 자료형 char에 저장할 수 있음 (1Byte = 8Bit = 0~255)
  • 아스키 코드표

 

3-3. 유니코드

  • 유니코드 : 16bit(0~65535) 범위에 문자를 하나씩 대응해 놓은 것.
  • 기존 아스키 코드는 유지
  • 유니코드 코드표

https://hanseul-lee.github.io/2020/08/27/20-08-27-code/

  • 유니코드 평면
    • 유니코드로 부족해서 도입
    • 기본 다국어 평면(BMP)을 포함해 평면이 17개 있으므로, 모든 문자를 표현하려면 최소 3Byte의 자료형이 필요
  • UTF(Unicode Transformation Format)를 이용한 유니코드 인코딩
    • UTF : 유니코드 문자를 인코딩하는 방식으로, 몇 Bit를 사용하여
    • 종류
      • UTF-8
        • 문자 하나를 표현할 때 최소 8bit가 필요
          • 0000~007F (8bit로 표현)
          • 0080~07FF (16bit로 표현)
          • 0800~FFFF (32bit로 표현)
        • BMP는 2Byte로 표현 가능하지만, 구분자를 표현하기 위해 3Byte까지 늘어남비트는 순서대로 x로 표시된 비트에 들어감 (아래 예제사진)
        • 가변형 인코딩 방식
        • 아스키 코드와 호환됨
      • UTF-16
        • 문자 하나를 표현할 때 최소 16bit가 필요
        • 마찬가지로, 가변형 인코딩 방식
        • 자료형 wchar은 UTF-16을 이용하여 인코딩 (2Byte = 16Bit)
      • UTF-32
        • 문자 하나를 표현할 때 최소 32bit가 필요
        • 저장공간의 낭비가 심함

비트는 순서대로 x로 표시된 비트에 들어감

 

3-4. 프로그래밍 언어 문자열

 

 

 


01장 CPU
02장 운영체제 - 프로세스와 스레드
03장 운영체제 - 메모리
04장 프로그래밍 언어, 컴파일러
05장 변수, 정수, 실수, 문자열
06장 함수
07장 객체지향
08장 클래스
09장 자료구조 1
10장 자료구조 2
11장 알고리즘
12장 네트워크
13장 데이터베이스


 

 

 

 

 

1. 언어 종류


1-1. 언어의 종류

예시 언어 실행 방식 특징
컴파일러 언어 C, C++ 소스코드 → 기계어 → ✅ → 실행 1. 각 OS에 맞는 기계어로 코딩해 주어야 함
컴파일러 언어 C#, JAVA 소스코드 → 바이트 코드 → ✅ →실행 (가상 머신에서) 1. 실행 전 바이트 코드가 컴파일됨
인터프리터 언어 JavaScript, Python 소스코드 → ✅ → 바이트 코드 → 실행 (가상 머신에서) 1. 한 줄씩 실행됨
2. 실행 후에 바이트 코드가 컴파일됨
3. 따라서, 느림 

✅  : 유저가 실행을 클릭한 순간 (유저가 실행을 클릭하기 전까지의 단계를 프로그래머가 코딩하고 컴파일 해야 함)

  • 인터프리터 언어
    • 여기서 나오는 VM은 해당 언어를 이용할 때 설치하는 그 언어의 VM을 일컫는다.
    • (그림1) 소스 코드가 바이트 코드(VM이 이해할 수 있는 인스트럭션)로 번역되면, VM이 OS가 이해할 수 있는 인스트럭션으로 번역해 준다.
    • (그림2) OS 안에 위치한 VM에서 코드가 실행되는 구조
    • 인터프리터 언어는 하나의 코드로 여러 OS에서 동작한다는 장점이 있다. (플랫폼에 대한 독립성)

 

(그림1) 소스 코드가 바이트 코드(VM이 이해할 수 있는 인스트럭션)로 번역되면, VM이 OS가 이해할 수 있는 인스트럭션으로 번역해 준다

 

(그림2) OS 안에 위치한 VM에서 코드가 실행되는 구조

 

 

1-2. JIT(Just-in-Time) 컴파일러

  • 인터프리터 언어의 단점을 보완하기 위해 도입된 컴파일러
  • 유저가 실행 버튼을 누르면 바이트 코드를 컴파일해서 기계어로 번역한 후 실행 (속도 향상)
    • 소스 코드 → ✅ → 바이트 코드 → 기계어 → 실행 (가상 머신에서)

 

 

 

 

 

 

2. 컴파일


2-1. 컴파일 과정

2-2. 컴파일러 과정

컴파일러 과정 설명 예제로 사용할 소스 코드

def func(a, b):
	return a + b

 

① Scanner(Lexer, Lexical Analyzer)

  • 소스 코드를 분석해서 Token(요소) 생성
NAME    'def'
NAME    'func'
OP      '('
NAME    'a'
OP      ','
NAME    'b'
OP      ')'
OP      ':'
NEWLINE '\\n'
INDENT  '\\t'
NAME    'return'
NAME    'a'
OP      '+'
NAME    'b'

 

② Parser(Syntax Analyzer)

  • Token을 분석해서 Parse tree 생성

 

③ Code Generator

  • Parse tree를 분석해서 어셈블리어 생성

 

 

 

 

 

 

 

 

3. 언어와 문법


이것은 그 중에서도 Parser를 위한 이론이고, 컴공과 오토마타 과목에 포함된다.

3-1. 정의

  • 언어 : 유한한 종류의 문자로 이루어진 유한한 길이의 문자열의 집합
  • {a, ab, cab, baa ... }
  • 문법 : 문자들로부터 문장을 만드는 규칙
  • 문법 표기법
    • 문법 도표 : 초보자가 쉽게 이해할 수 있도록 문법을 도식화하는 방법
    • BNF 표기법
      • 프로그래밍 언어의 형식적 정의를 위해 가장 널리 사용되는 방법으로, 언어 생성 규칙들의 집합
      • 언어의 문장들은 BNF의 규칙을 적용해가며 생성되는데, 시작 기호(start symbol)라 불리는 비단말 기호에서 시작된다. 이러한 문장 생성 과정을 유도(derivation)라고 한다.
      • 문법과 유도 예시 
      • # 유도 E → E+T ------ ①에 의해 E를 E+T로 대치 → T+T ------ ①에 의해 E를 T로 대치 → F+F ------ ②에 의해 T를 F로 대치 → id+**id ----** ③에 의해 F를 id로 대치
      • # 문법 <E> → <E+T> / <T> ------ ① <T> → <F> --------------- ② <F> → id ---------------- ③
      • BNF 표기법 사전
        • 비단말 기호(non-terminal symbol) : '<>'로 묶인 기호들
        • 단말 기호(terminal symbol) : 'id' 부분처럼 직접 나타낼 수 있는 기호
      • 참고 사이트 : https://blog.shar.kr/969

문법 도표

 

3-2. 종류

문법 언어  인식기
type 0 (무제약 문법) 재귀 열거 언어 튜링 기계 (turing machine)
type 1 (문맥인식 문법) 문맥인식 언어 선형한계 오토마타 (linear-bounded automata)
type 2 (문맥자유 문법) 문맥자유 언어 푸시다운 오토마타 (push-down automata)
type 3 (정규 문법) 정규 언어 유한 오토마타 (finite automata)

 

 

3-3. 정규 언어

  • 정규 언어 : 유한 오토마타로 인식 가능한 언어
  • 정규 표현식 : 정규 언어를 가장 잘 표현할 수 있는 방법

 

 

3-4. 오토마타

다시 한 번, Parser를 위한 이론
조금 더 자세히 공부해 보고 싶다면 참고 사이트, 참고 사이트2

 

3-2-1. 유한 오토마타

  • 유한 오토마타 : 유한한 상태를 갖고, 입력을 받아 입력에 따라 일정하게 상태를 전이(State 이동)하며, 출력(True, False)을 내놓는다.
  • 종류
    • DFA(Deterministic finite Automata) : State가 확실히 정해지는 오토마타
    • NFA(Non-Deterministic Finite Automata) : State가 확실히 정해지지 않고 가능한 State가 여러개가 되는 오토마타
  • NFA에서 가능한 State들의 집합을 State로 DFA로 변환할 수 있다. (NFA → DFA 변환)
  • 단점
    • 문법의 생성 규칙이 우선형 선택의 규칙과 좌선형 형태의 규칙으로 혼합되어 있다.
    • 그동안 처리했던 정보를 저장할 공간이 유한 오토마타에는 없다.

 

3-2-2. 푸시 다운 오토마타

a,0,10: a를 만났는데 스택에 0이 있으면 스택에서 0제거하고 10을 넣는다. b,1,&lambda;: b를 만났는데 스택에 1이 있으면 스택에서 1제거한다.

 

  • 푸시 다운 오토마타 : 무한한 크기의 Stack을 저장장치로 갖는 유한 오토마타

 

3-2-3. Parser

  • 우리가 프로그래밍한 소스코드도 언어이기 때문에, 오토마타 이론을 통해 소스 코드를 분석한다.
  • 푸시 다운 오토마타를 주로 사용한다.

 

Parser의 종류

  • LL 파서 : 하향식 파서 (Non-Teminal부터 시작)
  • LR 파서 : 상향식 파서 (Terminal부터 시작)

LL 파서 : 하향식 파서 (Non-Teminal부터 시작)

 

LR 파서 : 상향식 파서 (Terminal부터 시작

 

  • LR(1) 파서
    • 이동 축소 파싱(shift-reduce parsing) : Shift와 Reduce를 반복하여 파싱

 

Shift : 한 칸 이동 / Reduce : 규칙에 맞게 바꾸기

 

 

 

 

 

티스토리 에디터 너무 구리다 ㅜㅜ

숫자형

print(1+1) # 2 : 더하기
print(3-2) # 1 : 빼기
print(5*2) # 10 : 곱하기
print(6/3) # 2 : 나누기

print(2**3) # 2^3 = 3 : 제곱
print(5%3) # 2 : 나머지 구하기
print(5//3) # 1 : 몫 구하기 

print(1 > 3) # False
print(4 <= 4) # True
print(5 > 4 > 3) # True

print(3 == 3) # True : 똑같은지
print(1 != 3) # True : 다른지
print(not (1 != 3)) # 이중부정

print((3 > 0) and (3 < 5))
print((3 > 0) & (3 < 5))  # and

print((3 > 0) or (3 < 5))
print((3 > 0) | (3 < 5)) # or

+= : 계산한 값을 원래 값에 할당함

  • [ i += 1 ] = [ i = i+1 ]

 

print(abs(-5)) # 5 : 절댓값
print(pow(4, 2)) # 4^2 

print(max(5, 12)) # 12 : 최댓값
print(min(5, 12)) # 5 : 최솟값

print(round(3.14)) # 4 : 반올림

 

 

파이썬의 math 라이브러리 

from math import *

print(floor(4.99)) # 4 : 내림
print(ceil(3.14)) # 4 : 올림
print(sqrt(16)) # 4 : 제곱근

 

 

랜덤함수

from random import *

print(random()) # 0.0 ~ 1.0 미만의 임의의 값 생성

print(random() * 10) # 0.0 ~ 10.0 미만의 임의의 값 생성
print(int(random() * 10)) # 0 ~ 10 미만의 임의의 값 생성
print(int(random()* 10) + 1) # 1 ~ 10 이하의 임의의 값 생성

print(randrange(1, 45)) # 1 ~ 45 미만 범위의 임의의 값 생성
print(randint(1, 45)) # 1 ~ 45 이하 범위의 임의의 값 생성

+ Recent posts