• 메모리는 숫자만을 저장할 수 있다.
  • 픽셀로 글자 모양 그대로 저장하는 비트맵이 있지만 이는 메모리 낭비가 크다.
  • 각 문자에 대해서 대응되는 숫자를 정해놓고 이것을 메모리에 저장!!
  • 영어 대소문자 52 -> 6비트(64가지)로 모두 표현할 수 있다. 이를 코드체계라고 한다.

  • 지역별로 코드체계가 달랐다.
  • 그런데 네트워크가 발전하면서 서로 소통, 이때 정보를 다르게 해석하는 경우가 생겼다.
  • 그래서 ASCII라는 문자 인코딩 표준이 제정되었다.

  • 7bits 인코딩
  • 33개의 출력 불가능한 제어 문자
  • 95개의 출력 가능 문자(공백 32 특수문자 숫자 기호1 대문자 기호2 소문자 기호3)

  • 표준 아스키 7bits, 확장 아스키 8bits
  • 8bits 또는 8-bit로 표현
  • 표준 문자 이외에 부가적인 문자 128개 추가 가능
  • 표준 아스키는 세계적으로 통용, 확장 아스키는 사용 하드웨어, 국가 등에 따라 유연하게 지정 가능
  • 표준 아스키는 불변의 법칙, 확장 아스키는 유연한 규칙 같은 느낌

  • 오늘날 대부분 ASCII 형식을 사용해 문자를 읽고 쓴다.
  • 각 국가별로 문자를 표현하기 위한 코드체계 필요
  • 유니코드 : 국가간의 정보 교환, 다국어 처리를 위해 표준을 마련한 것

  • 유니코드를 저장하는 변수의 크기
  • UCS-2(Universal Character Set 2) : 2byte
  • UCS-4(Universal Character Set 4) : 4byte
  • 바이트 순서에 대한 표준화 실패
  • 파일 인식 시 UCS 타입을 인식하고 경우에 따라 다르게 구현해야 되는 것
  • 적당한 외부 인코딩이 필요하게 되었다.

UTF-8

  • in web
  • MIN : 8bit, MAX: 32bit(1Byte*4)

UTF-16

  • in window, java
  • MIN : 16bit, MAX: 32bit(2Byte*2)

UTF-32

  • in unix
  • MIN : 32bit, MAX: 32bit(4Byte*1)

  • 2.x버전 - ASCII : #-*- coding: utf-8 -*- 첫 줄에 명시
  • 3.x버전 - 유니코드 UTF-8 생략 가능
  • 다른 인코딩 방식 처리 시 첫 줄에 인코딩 방식 작성

  • 문자열은 고정길이(fixed length)와 가변길이(variable length)로 구분
  • 가변길이는 length controlled(java, python)과 delimited(C언어)로 구분

  • 기본적인 객체 메타 데이터 외에도 몇 가지 정보가 더 있다.
    • hash값
    • 문자열 길이(count)
    • 문자열 데이터의 시작점(offset)
    • 실제 문자열 배열에 대한 참조(value)

  • C언어는 메타 데이터만 저장할 수 있다.
  • 마지막에 끝을 표시하는 null문자(\0)를 넣어줘야 한다.
char ary[]={'a', 'b', 'c', '\0'}; // 또는 char ary[]="abc";
  • 문자열 처리에 필요한 연산을 함수 형태로 제공
  • strlen(), strcpy(), strcmp(),...

  • C는 아스키 코드로 저장
  • java는 유니코드(UTF16, 2byte)로 저장
  • Python은 유니코드(UTF8)로 저장

  • None : 무(無)의 상태. 정의되지 않았다.
  • Null : 없음으로 정의된 상태. 숫자로 표현하면 0으로 표현

  • C : strcomp()
  • java : equals()
  • Python : is와 ==
s1 = 'abc'
s2 = 'abc'
s3 = s1
s4 = s1[:2] + 'c'

모두 abc의 값은 결과값이다. 그렇다면 이들을 비교하면 어떻게 될까.


print(s1 == s2)  # True
print(s1 is s2)  # True
print(s1 == s4)  # False
print(s1 is s4)  # False
  • 파이썬에서 ==연산은 메모리 참조가 같은지를 묻는 것.
  • 파이썬에서 slicing을 하면 같은 결과더라도 참조가 다르다.
  • 출력은 같지만 참조가 다르기 때문에 비교하면 False가 나온다.

  • 인덱스를 기준으로 하여 잘라내거나 복제하는 작업

b = a[::]처럼 스스로를 복제하는 경우

  • 리스트는 메모리 참조가 다르다.
  • 문자열은 메모리 참조가 같다.

b = a[:?]+?처럼 일부를 복제하는 경우

  • 리스트와 문자열 모두 메모리 참조가 다르다.

  • C언어 : atoi(), itoa()
  • java : 숫자 class의 parse 메소드 / toString() 메소드
  • 파이썬 : 숫자와 문자변환 함수(int('123'), float('1.23'), str(123), repr(123))

def atoi(s):
  i = 0
  for x in s:
    i = i*10 + ord(x) - ord('0')
  return i