# 문자열 데이터 타입
# - 타입 : 문자열
# - 클래스 : str
# - 순서 있는 데이터 타입
# - immutable 데이터 타입 : 미동의 데이터 타입

# 밑의 4가지 경우 모두 문자열 타입!
s1 = "abc"
s2 = 'abc'
s3 = '''abc'''
s4 = """ abc """

print(s1)
print(type(s1))
print(s2)
print(type(s2))
print(s3)
print(type(s3))
print(s4)
print(type(s4))

# 엔터를 문자열 중간에 치면 어떨까
# 1. 엔터를 무시한다
s1_space = "ab" \\
           "c"
s2_space = 'ab' \\
           'c'
# 엔터 중간에 쓰려면 '\\n'를 사용한다.
# s1_space = 'ab\\n' \\
#            'c'

# 2. 엔터를 받아들인다. 출력 결과물이 내가 기입한 대로 행동한다(띄어쓰기, 탭 등)
s3_space = '''a
bc'''
s4_space = """ a
bc """
print(s1_space)
print(s2_space)
print(s3_space)
print(s4_space)
# 문자열은 복합(시퀀스)데이터 타입이다
# 순서 있는 데이터 타입이다(index, slicing 사용)
# 배열 연산자를 사용할 수 있다 : +, *, %
# 문자열 객체의 멤버 함수를 사용할 수 있다.
# 배열은 수정 불가능한 Immutable 타입이다.

#  순서 있는 데이터 타입의 경우 indwx와 slicing을 사용할 수 있다.
# index
s1 = 'abcdefghi'
print(s1[0])
print(s1[1])

# index below 0 is possible.
print(s1[-1])    # == s1[8], i
print(s1[-2])    # == s1[7], f

# slicing : [시작:끝:증가치]
# 배열의 요소를 부분추출 시 사용한다
print(s1[0:4:1])    # abcd -> 0>= && <4, 1씩 증가하면 요소들에 접근
print(s1[1:4])    # bcd -> 증가치의 default값은 1이다.
print(s1[:5:2])    # ace -> 시작 index의 default는 0이다.
print(s1[1:])    # bcdefghi -> 끝 index의 default는 마지막 index이다
print(s1[-1:-4:-1])    # ihg -> minus index도 사용 가능하다.

# 배열과 연산자
# + : strcat
s1 = s1 + 'korea'
print(s1)

# * : 배열을 반복해준다
s1 = s1*2
print(s1)

# % : 정해진 타입의 데이터들을 가지고 문자열을 만든다
a = 10
b = 3.14
s = 'abc'
s2 = 'a=%10d b=%.2f c=%s'%(a, b, s)    # C의 printf와 비슷하다
print(s2)
d = {'name': 'John', 'age': 20}
print( 'name: %(name)s, age: %(age)d'%d)    # dictionary 자료형에도 쓸 수 있다.

# 문자열 객체의 멤버함수
# split() : " "를 기준으로 문자열을 나누기
s3 = "abcd efg"
s3 = s3.split()    
print(s3)

# strip() : 문자열의 좌우에 있는 whitespace를 제거해준다
# whitespace : 공백, 개행\\n, 탭\\t
s4 = "    abcd efg    "
s4 = s4.strip()
print(s4)

# 배열은 수정할 수 없는 Immutable Data type이다.
s = 'abc'
print(s[0])
# s[0] = 'A'    # 안 된다. 배열은 Immutable Type이기 때문이다.