본문 바로가기

TIl

String

컴퓨터에서의 문자표현

각 문자에 대해서 대응되는 숫자를 정해 놓고 이것을 메모리에 저장하는 방법이 사용될 것이다.

영어가 대소문자 합쳐서 52자 이므로 6비트(64가지)면 모두 표현할 수 있다.

⇒ 이를 코드체계라고 한다.

⇒ 글자를 나타내는 숫자를 집어넣는다고 생각하면 된다.

문자의 표현

네트워크가 발전되기 전 미국의 각 지역 별로 코드체계를 정해 놓고 사용했지만
네트워크(인터넷)이 발전하면서 서로 간의 정보를 주고 받을 때 정보를 달리 해석한다는 문제가 생겼다.

⇒ 표준안을 만들기로 함

1976년, 미국에서 ASCII(아스키)라는 문자 인코딩 표준이 제정되었다.

ASCII. American Standard Code for Informaion Interchange

7-bit 인코딩으로 128문자를 표현하며 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어져 있다.

  • parity bit (1 bit): 나머지 1 bit를 오류검출할 때 사용
  • 1100 001 + [] 의 마지막에
  • 짝수 패리티 : 1의 개수를 짝수로 만들어서 보낸다.
  • 홀수 패리티

Null이 아스키코드0

확장 아스키

  • 표준 문자 이외의 악센트 문자, 도형 문자, 특수 문자. 특수 기호 등 부가적인 문자를 128개 추가할 수 있게 하는 부호이다.
  • 표준 아스키는 7-bit를 사용 but 확장 아스키는 8-bit 모두 사용함으로 추가적인 문자를 표현
  • 컴퓨터 생산자와 소프트웨어 개발자가 여러 가지 다양한 문자에 할당할 수 있도록 하고 있다.이렇게 할당된 확장 부호는 표준 아스키와 같이 서로 다른 프로그램이나 컴퓨터 사이에 교환되지 못한다.

⇒ 표준 아스키는 마이크로컴퓨터 하드웨어 및 소프트웨어 사이에서 세계적으로 통용

But 확장 아스키는 추가적인 프로그램이나 컴퓨터 또는 프린터의 설계 필요

  • 오늘날 대부분의 컴퓨터는 문자를 읽고 쓰는데 ASCII형식을 사용한다.
  • 그런데 발전하면서, 각 나라의 자국의 문자를 표현하기 위하여 코드체계를 만들어서 사용하게 되었다.
    • 우리나라도 아주 오래된 이야기지만 한글 코드체계를 만들어 사용했고,
      조합형, 완성형 두 종류를 가지고 있었다.
  • 인터넷이 전 세계로 발전하면서, ASCII를 만들었을 때의 문제와 같은 문제가 국가간에 정보를 주고 받을 때 발생했다.
  • 자국의 코드체계를 타 국가가 가지고 있지 않으면 정보를 잘못 해석할 수 밖에 없었다.
  • 윈도우는 유니코드로 만듬
  • ⇒ 다국어 처리를 위해 표준을 마련했다. 이를 유니코드라고 한다.

유니코드도 다시 Character Set으로 분류된다.

  • UCS-2(Universal Character Set 2)
  • UCS-4(Universal Character Set 4)
  • 유니코드를 저장하는 변수의 크기를 정의하지만, 바이트 순서에 대해서 표준화하지 못함
  • 파일을 인식 시 이 파일이 UCS-2, UCS-4인지 인식하고 각 경우를 구분해서 모두 다르게 구현해야 하는 문제 발생

⇒ 유니코드의 적당한 외부 인코딩이 필요해짐

big-endian, little-endian

endian : 주소값에 저장하는 순서

만약 0030 이라는 주소값이 있을때

big-endian : 앞쪽에 해당하는 높은 자리수 (00)을 빠른 주소지에 할당, 뒤쪽에 해당하는 낮은 자리 수 (03)을 그 다음 주소지에 할당

little-endian : 03, 00 순으로 저장

주소값 | 저장 순서

big-endian

1000 | 00

1001 | 30

little-endian

1000 | 30

1001 | 00

유니코드 인코딩 UTF : Unicode Transformation Format

  • UTF-8 (in web) 가변 길이를 택함 :1byte만 있어도 저장이 가능하다MIN : 8bit, MAX : 32bit (1 Byte * 4)
  • UTF-16 (in windows, java) 가변길이를 택함MIN : 16bit, MAX : 32bit (2 Byte * 2)
  • UTF-32 (in unix)MIN : 32bit, MAX : 32bit (4 Byte * 1)

파이썬 인코딩

  • 2.x 버전 - ASCII → #-*-coding: utf-8 -*- (첫 줄에 명시)
  • 3.x 버전 - 유니코드 UTF-8 → 생략 가능해짐
  • 다른 인코딩 방식으로 처리시 첫 줄에 작성하는 위 항목에 원하는 인코딩 방식을 지정해주면 됨

문자열

파이썬의 자료형과 문자열이 다른 언어와 특히 차이가 존재함

자바에서의 String 클래스에 대한 메모리 배체 예

java.lang.String 클래스에는 기본적인 객체 메타 데이터 외에도 4가지 필드가 포함됨

hash 값(hash), 문자열의 길이(count), 문자열 데이터의 시작점(offset), 그리고 실제 문자열 배열에 대한 참조(value)이다.

import sys a= '' b = 'h' # 메모리를 얼마큼 쓰고있는지 확인하는 메서드 print(sys.getsizeof(a)) # 49 print(sys.getsizeof(b)) # 50 기본적으로 49바이트를 쓰고 하나가 있으니까 +1 바이트 쓴다

항상 49는 아니다!! 80까지 늘어나는 가변형임, string은 49일 뿐

C언어에서의 문자열 처리

  • 문자열은 문자들의 배열 형태로 구현된 응용 자료형
  • 문자배열에 문자열을 저장할 때는 항상 마지막에 끝을 표시하는 널문자(\0)를 넣어줘야 한다.char ary[] = {'a','b','c','\0' // 또는 char ary[] = "abc";
  • 크기 정보를 위해서 \0 까지의 숫자를 센다.
  • 문자열 처리에 필요한 연산을 함수 형태로 제공한다.strlen(), strcpy(), strcmp(), ...

Java (객체 지향 언어) 에서의 문자열 처리

  • 문자열 데이터르 저장, 처리해주는 클래스를 제공한다.
  • String클래스를 사용한다.String str="abc"; //또는 String str = new String("abc")
  • 문자열 처리에 필요한 연산을 연산자, 메소드 형태로 제공한다.
    • +,length(), replace(), split(), substring(),…⇒ 보다 풍부한 연산을 제공한다.

Python에서의 문자열 처리

  • char 차입 없음
  • 텍스트 데이터의 취급방법이 통일되어 있음 ( 문자열과 문자를 구분하지 않는다.)
  • 문자열 기호
  • ‘ ’ ,” ”,’’’,”””
  • 문자열은 시퀀스 자료형으로 분류되고, 시퀀스 자료형에서 사용할 수 있는 인덱싱, 슬라이싱 연산들을 사용할 수 있음
  • 문자열 클래스에서 제공되는 메소드
    • replace(), split(), isalpha(), find()
  • immutable 변경 불가능

C 와 Java의 String 처리의 기본적인 차이점

  • c는 아스키 코드로 저장한다
// C char* name = "홍길동"; int count = strlne(name); printf("%d",count); // 6이 출력됨, 한글자당 2
  • Java는 유니코드(UTF16, 2byte)로 저장한다.
//Java String name = "홍길동"; System.out,println(name.length()); // 3출력, 실제 글자수
  • 파이썬은 유니코드(UTF8)로 저장
# Python name = "홍길동" print(len(name)) # 3출력, 실제 글자수

문자열 뒤집기

  1. 자기 문자열에서 뒤집는 방법
  2. 새로운 빈 문자열을 만들어 소스의 뒤에서부터 읽어서 target에 쓰는 방법
  • 자기 문자열을 이용할 경우 swap을 위한 임시 변수가 필요, 반복 수행을 문자열 길이의 반만을 수행해야 한다.

파이썬에서 a,b = b,a 으로 바꿀 수 있다. 하지만 메모리에서는 4번의 절차를 걸치게 된다. (위의 예시와는 별개)

c 를 만들고 a-> c, b-> a, c-> b 총 4번의 절차

문자열 비교

c 에서는 strcmp() 함수, Java에서는 equals() 메소드를 제공

파이썬에서는 == 연산자와 is 연산자를 제공한다.

  • == 연산자는 내부적으로 특수 메서드 __eq__() 를 호출

문자열 숫자를 정수로 변환하기

c 에서는 atoi() 함수를 제공한다. 역 함수로는 itoa()가 있다.

java에서는 숫자 클래스의 parse 메소드를 제공한다.

파이썬에서는 숫자와 문자변환 함수(int(), float() 등등)

파이썬에서 itoa() 함수 구현해보기

def itoa(a):   s = ''   while a >0:     s = chr(a%10 + ord('0')) + s     a //= 10   return s  ans = itoa(123) print(ans) # 123 s

파이썬에서 atoi() 함수 구현해보기

def atoi(arr):
	v = 0
	for i in range(n):
		v = v*10 +arr[i]
	return v
		

arr = [1,2,3]
n = len(arr)
result = ator(arr)
print(result,type(result)) #123 <class 'int'>

Tip

ord() : 어떤 문자의 아스키 코드 값을 알려주는 메서드

 

'TIl' 카테고리의 다른 글

Stack, recursive F(), Memoization  (1) 2024.02.07
패턴 매칭  (1) 2024.02.06
알고리즘 풀이  (0) 2024.02.02
이진탐색, 선택정렬  (0) 2024.02.02
2차원 배열 , 부분집합  (0) 2024.01.31