logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Algorithm] 문자열(String)

    이미지 보기

    [Algorithm] 문자열(String)

    문자열에 대해 알아보자.

    • 22.02.16 작성

    • 읽는 데 7

    TOC

    컴퓨터에서의 문자표현

    저장방식

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

    문자의 표현

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

    ASCII

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

    확장 ASCII

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

    유니코드

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

    유니코드 Character Set

    • 유니코드를 저장하는 변수의 크기
    • 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언어)로 구분

    length controlled 메모리 배치(java)

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

    delimited 메모리 배치(C언어)

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

    C와 Java의 String 처리의 차이

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

    Null과 None

    • 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))

    atoi() 함수 만들어보기

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

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다