다시 오신 걸 환영해요 이번 강의에서는
문자열을 생성하는 방법에 대해 알아보겠습니다
특히 C#에서 문자열을 이용하는 방법에 대해서요
저는 문자열과 문자열을 번갈아 사용하는 경향이 있어요
하지만 문자열은 챠르 배열이라고 할 수 있죠
아주 중요한 개념이죠
우리 프로그램에서 단어와 텍스트를 활용해서 여러 가지를 할 수 있어요
c 자체는 문자열을 나타내는 데이터 타입이 없어요
아무것도 없어요 많은 언어는 개체나
데이터 유형 문자열을 지원하죠
문자열에 데이터 타입 c가 없기 때문에 문자열의
연산자를 사용할 수 없어요
그래서 결국 할 것은 표준 라이브러리를 사용할 것이고 여러 가지 문자열
함수들에 대해 이야기 할 거예요.
세 개의 강의에서 다양한 문자열 기능을 다룰 거예요
이렇게 하면 문자열을 조작해 문자열에 대한 정보를 얻을 수 있죠
하지만 현악기 오퍼레이터를 쓸 순 없어요 더하기나
빼기 현악기 같은 건 안 되죠
c에 있는 문자열은 char 형식의 배열에 저장되어 있죠.
배열이 뭔지는 알아요 차아 타입이 뭔지는 알죠
char 형식은 하나의 글자로 같은 이름에 여러 가지
요소를 저장할 수 있는 배열이에요.
그래서 문자열은 문자열 안에 있는 게 말이 되죠
문자열은 문자가 많으니까요
문자열의 문자는 인접 메모리 세포에 저장됩니다 세포당 한 글자죠
배열에 액세스하는 것처럼 거기도 액세스할 수 있어요
실제로 문자열을 선언하는 방법은 그냥 char 타입을 사용하고
괄호를 이용해 크기를 나타내면 됩니다 다른 타입의 일반
배열을 만들 때처럼요
Char를 누른 다음 이름이 뭐든 대괄호 안에
있는 문자 배열 크기요
C#에서 문자열을 선언하는 방법이죠
C#에서 문자열을 이렇게 선언할 땐 관련된
실제 데이터가 없어요 크기만 지정하면 되죠
그게 가장 간단해요
19글자까지 포함된 문자열을 수용할 수 있는 변수죠
이 널 문자를 기억하세요
문자열 크기를 20으로 하겠다고 하면 19자만 저장할 수
있다는 뜻이에요 null을 위해서는
추가 문자 하나가 필요하거든요
이걸 명심하세요 문자 배열을 20으로 선언하면
19자가 저장될 수 있어요
문자열을 저장하기 전에 사용하려는 배열의 크기를 지정할
때 문자열을 저장하려면
적어도 문자열의 문자수보다 하나 이상 커야 해요
컴파일러가 모든 문자열 상수의 끝에 Null 터미네이터를 자동으로 추가할 거예요
여러분이 정말 하셔야 할 일은 이런 문자열을
생성할 때 초기화 하는 거예요
그래서 배열을 초기화하는 것처럼 문자열 변수를 초기화할 수 있어요
이 괄호 안에 각 글자를 넣어요
정수 배열에서 요소들을 초기화하면 아주 유사해 보이죠
하지만 char 워드라고 하고 자유
곡선 괄호 안에 각각의 문자를 넣으면 문자
배열을 생성하죠
다른 배열 초기화와 같아요
사이즈를 입력하지 않는 동안 C 컴파일러는
자동적으로 배열의 요소 수를 계산하고 Null 터미네이터에 1을 추가하죠
괄호와 중괄호 사이에 있는 이니셜라이저의 개수에
근거하죠
이 문장은 정확히 7개의 글자를 저장할 거예요 h-e-l-l-o
느낌표요 그리고 null 터미네이터죠
오른쪽에 있는 이 다이어그램이 그걸 보여줘요
자동적으로 Null 터미네이터를 추가하죠 늘 따옴표 하나와
쉼표로 캐릭터 배열을 시작해야
한다면 정말 성가실 거예요
속기 표기법으로 할 수 있는 건 큰 따옴표를 붙이는 거예요
첫 번째 예제에서처럼 문자열을 명시적으로 명시할
수 있고 데이터를 적용하기 위해 문자열
함수를 사용하거나 컴파일러가
알아서 하도록 할 수 있죠
그걸 명시적으로 할 때의 문제는 null을 위한 추가 문자를 추가하는 걸 늘 기억해야
한다는 거죠
정말 해야 할 일은 컴파일러가 스스로 알아낼 수 있도록 하는 거죠
그러니 괄호 안에 사이즈를 위한 숫자는 넣지 마세요
왜냐하면 지정된 크기가 너무 작으면 컴파일러가 Null
캐릭터를 배열 끝에 맞출 수 없고 거기에 배치하지도 않으며 여러분께
그렇게 말하지도 않을 테니까요
그러니 프로그램에 버그가 있을 거예요 알지도 못하는 버그요
모범 사례는 문자열 리터럴을 사용하고 문자열을
초기화해서 컴파일러가 크기를 알아낼 수 있도록 하는 거죠
더 큰 크기로 만들거나 그런 걸 여기 넣으면 알아서 크기를 재요
그러니 크기를 지정하지 마세요 컴파일러에게 맡겨보죠
이렇게 하면 정확할 거라는 걸 확신할 수 있죠
괄호를 빈 괄호로 두고 할당 연산자를
사용하세요 큰 따옴표 안에는 그냥 넣으시면
되고요 괄호도 필요 없어요
이게 최선의 방법이에요 예를 들어볼게요
char 형식의 요소 배열의 일부를
문자열로 초기화할 수도 있고요.
정말 큰 크기를 만들었는데 캐릭터 두어 개만
할당해도 괜찮아요 일부 캐릭터만
초기화하는 거니까요 다른 캐릭터들은
텅 비게 되죠
컴파일러가 처음 5개의 요소를 초기화할 거예요
str 0에서 str 4로요 모든
문자열 상수와 문자열 sub 5는 null 문자를
포함하죠
공간은 여전히 배열의 40개 요소를 위해 할당되지만
그 중 5개만 사용됩니다 4개에 Null 문자를 더해서요
다시 말씀드리지만 모범 사례는 사이즈 내에서 숫자를 지정하는 게 아니라
큰따옴표를 이용해 문자열 리터럴을 할당하는 거죠
결국 보게 될 거예요
초기화하지 않고 크기로 캐릭터 배열을
만들었다면 날짜를 어떻게 넣을까요?
배열이라서 데이터를 할당할 수 없어요
만약 우리가 정수 배열을 가지고 있다면 그냥 숫자
5만 정수 배열로 할당할 수는 없잖아요
말이 안 되니까요 실제 요소를 지정해야 해요
지수를 정해야 해요
100개의 글자로 문자 배열을 선언한 다음에 s = hello라고
할 순 없어요 안 통할 거예요
다시 말하지만 s는 배열이에요 큰 따옴표 안에 있는 문자열이지만 메모리의 배열이죠
배정 연산을 실행할 경우 위의 것과 같은 하나의
배열의 다른 배열의 캐릭터에 할당할 수 없죠
데이터를 문자 배열에 할당하고 싶다면
그걸 선언하고 초기화한 다음에요 str copy라는
특별한 함수를 사용해야 해요
그 얘기는 다른 강의에서 하죠
이 시점까지 문자열을 생성할 때는 문자열 리터럴이 될 것입니다
큰 따옴표 안에 있을 것이고 수정할 필요도 없겠죠
그러니 이것도 유효해요 인덱스를 통해 이 문자나 배열의
각 요소에 접근해 각 문자를 명시할 수 있죠
S 하위 0, S 하위 1 그리고 작은따옴표에 작은 문자를 넣는 거죠
그렇게 할당할 수 있어요 하지만 문자열이 100 바이트라고 상상해 보세요
코드가 많이 필요할 거예요 그러면 안 되죠
여러분이 해야 할 일은 크기가 없다고 선언했을
때 초기화하는 겁니다 그런 다음 수정하고 싶다면
명시하세요 그걸 복사하는 거죠
문자열을 출력물로 디스플레이하는 한 여전히 printf 함수를 사용하죠
프로그램 어디에서든 문자열을 참조하고 싶으면 그 자체로
배열 이름을 쓰면 돼요
지수를 지정할 필요가 없죠
왜냐하면 배열 안의 지수가 단일 문자를 지정하거든요
전체 문자열을 원하면 그냥 배열 이름을 쓰세요
printf 함수를 이용해 출력을 표시하는
경우 다음을 하면 되죠 큰 따옴표 안에는 형식
지정자로 %s를 사용합니다 그런 다음 캐릭터 배열 이름이죠
액세스하고 싶을 땐 다른 배열처럼 취급하지 마세요 액세스하려면 실질 지수나 괄호
없이 이름만 입력하세요
% AS 형식 지정자는 null 종료 문자열을
출력하기 위한 거죠 아까 %d로 정수를 넣었었죠?
문자는 %d로 넣고요
문자열은 % s를 쓰는데 그건 문자 배열이죠
null로 종료된 문자열을 예상해요
하지만 문자열을 초기화할 때 사이즈가 없으면 Null 터미네이터가
자동으로 추가되거나 특정
사이즈를 생성하고 추가했거나 명시적으로 추가해도
상관없어요 null 종료만 되면 돼요
printf 함수는 %s 형식 지정자를 만난다고 가정합니다
상응하는 인수가 문자열이고 null 문자로 종료되는 거죠
그게 예상되는 거니까 그렇게 해야만 해요
문자열을 입력할 때는 Scanf 키보드를
통해 다른 데이터를 입력할 수 있죠
문자열 입력을 위해서도 같은 작업을 할 거예요
scanf 함수를 사용할 거예요. scanf 함수와 함께 같은
방식이 됩니다 다른 형식 지정자를 사용하는 것만 빼고요
문자열에 대해서는 %s를 입력으로 사용하죠
문자열을 입력하는 데 사용되죠
여기서 또 주목할 점은 &가 없다는 거죠 변수 이름에
대해서요 문자니까요 현 연산자 주소와 앰퍼만
입력하면 된다고 말씀드렸죠?
그 이유는 포인터를 얘기할 때 더 명확해지기 때문이죠
문자 배열이지만 char input은 포인터입니다.
두 번째 인수로 scanf는 포인터를 가지고요.
그래서 안 해도 된다는 거예요 정수와 2를 지정하면 그건 포인터가
아니죠 scanf를
이용해서 키보드에서 입력을 읽으려면 두 번째 인수는 주소를 전달해야
하는 포인터를 기대해요
scanf로 문자열을 작업하면,
scanf는 우주 공간까지만 읽혀요.
scanf를 하고 Jason is 강사라고
치면요.
입력에 저장되는 유일한 것은 Jason이죠. 일단 스페이스를 치면
나머지 문자열은 읽지 않거든요
전체 문자열을 읽을 수 있는 다른 함수들도 있어요
우리가 사용할 예제 중 일부는 아마 그럴 거예요 f get s 같은 것도 할 수 있어요
키보드에서 입력을 읽는 다른 방법이죠 띄어쓰기에 상관없이 전체
문자열을 읽어요
다른 것도 있어요 C11용 get__s라는
건데 나중에 더 얘기하죠 문자열에
대한 입력을 읽을 때 기억해야 할 것 중 하나예요
그 공간까지만 판독될 거예요
두 개의 문자열이 같은지 테스트하는 건 어때요?
지금까지 모든 변수를 테스트해서
동일한 값을 사용했어요
하지만 스트링은 안 돼요
동등 연산자에서 문자열은 문자열 배열이라고 했었죠 그래서 연산자를 사용할 수 없어요
이등등 오퍼레이터는 int나 더블, 플로트 혹은 문자에만
적용될 수 있죠
구조물이나 배열로는 작동이 안 돼요 두 배열을 비교하면 안 되죠
문자열로는 작동하지 않아요 두 개의 문자열이 같은지 결정하고 싶다면
두 개의 문자열을 문자별 문자열로 분명히 비교해야 해요
배열 인덱스의 각 요소를 인덱스별로
봐야 해요
하지만 그건 정말 큰 문제죠 정말 지루할 테니까요
표준 라이브러리에서 str 비교 함수를 이용해서
쉽게 할 수 있는 방법에 대해 이야기해 볼게요. 하지만 등호를
사용할 수는 없어요. 기억하세요.
다시 한 번 상기시켜 드리자면 제가 두어 번 말했는데요 다시 말씀드리고
싶어요 큰 따옴표 안의 문자열 x는 작은
따옴표 안의 x라는 문자열과 같지 않아요
작은따옴표 안의 X는 기본 유형이에요 char나 care이죠
큰따옴표 안의 X는 드라이브 유형으로 char 유형의 배열이죠
큰따옴표 안의 X는 두 글자로 이루어져 있습니다 x와 null
터미네이터입니다 null 문자를 염두에 두세요
여기 예제가 있어요
크기로 문자열을 선언하거나
같은 라인에서 초기화하는 방법이요
이게 최선의 방법이에요 문자열 리터럴을 사용할 거라면
여기 쓰여 있는 대로 할
거예요 문자 배열을 생성하고 크기는 지정하지 않죠
할당 연산자의 오른쪽에는 큰 따옴표가 있어요
컴파일러가 자동으로 올바른 문자열을 생성하고 null 터미네이터를 추가할 거예요
크기를 지정했는데 글자가 충분하지 않다면 그걸 저장하지 않을 거예요
char 데이터 타입을 이용해서 문자열
리터럴을 생성하세요. 그리고
빈 대괄호를 사용하세요.
이 프로그램은 문자를 배열로 셀 겁니다
본질적으로 문자열의 길이를 잴 거예요
지금 여기서 하는 건 count라는 이름의 두 문자열 배열 변수를 만들고
있어요 두 개의 다른 문자열이 배열돼 있죠 그리고
쉼표 그게 질문이죠
Char str 1은 b 다음에 교류 발전기를 쓸 거고
str은 애프터서비스를 쓸 거예요
여기 루프가 있어서 첫 번째 배열을 통과할 거예요
숫자 = 0에서 Null 터미네이터가 보일 때까지 계속요
이 경우엔 not =를 쓸 수 있어요 문자를 비교하고 있으니까요
Null 터미네이터라는 캐릭터요 캐릭터를 비교하는 건 문제없어요
while 루프는 Null 터미네이터가 보일 때까지 계속될 거예요
Null 터미네이터를 보면 튀어나올 거예요
카운트는 문자열의 문자 개수와 같을 거예요
스트링의 길이 때문이죠
두 스트링을 위해 하는 거죠 기본적으로 두 문자열 모두 올바른
길이를 갖는 걸 보시게 될 겁니다 각각의 걸 검토하고 있으니까요
b로 가느냐 안 가느냐는 18개의 글자로
나타나요
이런 건 절대 안 하셔도 됩니다 왜냐하면 str 길이와
문자열의 길이를 찾아주는 좋은 도우미 기능이 있거든요
다시 한 번 보여드리는 건 배열이라는 사실이죠
문자열의 길이를 비교하거나 찾고 싶다면 not =를
사용하고 null 터미네이터를 보면 돼요
도움이 됐으면 좋겠네요 문자열을 정의하고 초기화하는 방법이죠
고마워요