캠퍼스 시삽 과제 3-1) String
String
우리가 C언어를 처음 배울 떄 문자열을 사용하기 위해
Char형식을 배열로 선언해서 사용했었다.
char str[] = "Hello World!!";
이 것이 결국 String의 모태?라 할 수 있다.
String은 이 배열을 매번 선언하는 것의 번거로움읗
없애고자 만들어진 클래스인 것이다.
결국 String클래스는 문자열이라는 것을 추상화 한 자료형이다.
우리가 보통 String을 사용 할 때 다른 변수처럼
string str = "Hello World!!";
라고 사용을 했다.
이 string은 String클래스의 별칭으로써 변수처럼도 사용이 가능하지만
기본이 클래스이기 때문에
String str = new String(new char[]{'가','나','다'});
라는 식으로도 생성이 가능하다.
결국 첫번째 방식으로 사용 할 수 있기떄문에
값 타입(Value Type)으로 착각할 수도 있겠지만
char[]와 같은 문자열이기 때문에 참조타입이다.
하지만 String은 기존의 사용자가 생각하는 문자열을 받기위해
문자열 처리를 위한 기능들이 들어있다.
기존의 참조타입의 ==은 참조하는 값을 비교하는 것 이었지만
String의 == 은 참조가 아닌 값 자체를 비교한다.
이 것은 String 클래스 내부적ㅇ로 == 연산자를 오버로딩하여
값 자체를 비교하도록 만들었기 떄문이다.
*String과 SringBuilder
String은 immutable 객체, 즉 변경이 불가능한 객체이다.
사용자의 눈에는 기존의 string에 새 값을 넣으면
바뀌어서 저장이 되기 때문에 기존의 값이 변경되는 것처럼 보이나
실제로는 새로운 값이 입력되면 메모리의 공간을 할당받고
기존의 값에 되있던 참조를 바꾸는 것 이다.
결국 먼저있던 값을 지우고 새 값이 써지는 것이 아니라
기존의 값은 가비지가 되어 버리고, 새 메모리에 할당되는 것이다.
str이라는 string형태의 변수를 선언하고
기존의 str을 복사하는 test변수를 만들었다.
처음 출력문은 기존의 해쉬값 비교하는 것이다.
아래는 새로운 내용으로 교체된 str과 비교하는 문이다.
str에 "World!!"를 추가하여 다시 비교를 해 보았다.
이 결과로 새로운 내용이 추가되면서 해쉬값 바뀐것을 알 수 있다.
따라서 잦은 값의 변경이나 큰 값의 변경이라면 가비지가 남는
String보단 StringBuilder를 사용하는 편이 더 좋을 것 같다.
*해쉬 값
해쉬값은 해쉬함수와 결과로 만들어진 코드이다.
이 값은 서로 다른 입력값에 대해서는 서로 다른 해수결과를 준다.
또한 파일의 내용이 수정, 삭제, 추가되면 해쉬함수의
입력값이 바뀌기 때문에 출력값 또한 바뀌게 된다.
MD5, SHA등이 대표정이 예이다.
*String의 기능
1. 배열 인덱스로 출력
String은 결국 char[]과 비슷한 문자열이므로
이런 식으로 사용이 가능하다.
이렇게 해당 인덱스를 사용하며 특정 부분만 출력이 가능하다.
2. 문자열 삽입
우리는 +=을 사용하여 기존 문자열 뒤에 문자을 붙여 사용한다.
하지만 String에는 insert라는 기능을 제공한다.
해당 함수는 Insert(위치, 내용); 형식으로 사용한다.
기존 "World"라는 문자열에 World라는 문자열 길이만큼 뒤에 "!!"을 붙이고
0, 즉 처음에 "Hello "라는 문자열을 붙이는 것이다.
3. 연결기능
String클래스는 Concat는 연결기능을 제공한다.
4. 대소문자 변환
C#은 대소문자를 구분하는 언어이기 때문에
영어의 경우 대소문자가 중요하다.
이렇 때 사용하는 것이 ToUpper()과 ToLower()이다.
5. 공백 지우기
Trim은 공백을 지우는 기능을 제공한다.
TrimStart() 앞의 공백을, TrimEnd()은 뒤의 공백을 지운다.
Trim()은 앞뒤의 공백을 지운다.
6. 특정 문자열을 찾아서 문자열 자르기
전체 문자열에서 특정 문자열을 찾아서 자르는, 즉 파싱의 기능이다.
String클래스에서는 파싱기능도 제공하고 있다.
1) IndexOf() , LastIndexOf()
해당 함수는 원하는 문자열의 위치를 찾는 함수이다.
str문자열에서 !!을 검색해보겠다.
IndexOf()와 LastIndexOf()는 같은 기능이나 시작점이 다르다.
IndexOf()는 특정 문자열을 앞에서부터,
LastIndexOf()는 특정 문자열을 뒤에서부터 검색한다.
(Home을 검색하고 같은 값이 나와서 당황했었더라는.... ㅡㅅㅡ;;)
IndexOf()와 LastIndexOf() 둘 다 "!!"를 검색하였으나
IndexOf()는 앞에서부터 검색하여 앞에있는 "!!"의 위치인
12를 반환하는 결과를 보여주고 있고
LastIndexOf()는 뒤에서부터 검색하여 뒤에있는 "!!"의 위치인
44를 반환하여 주는 결과를 볼 수있다.
* 값을 찾지 못하면 -1을 반환한다.
2) 특정위치의 문자열만 추출
특정위치의 문자열만 추출하는 기능이 있는데 바로 Substring()함수이다.
이 기능을 사용하면
(처음 인덱스, 마지막 인덱스) 또는 (처음인덱스) 의 인자값을 준다.
처음은 해당 범위의 문자열만,
뒤의 인자값은 해당 인덱스 이후의 모든 문자열을 반환한다.
3) 특정위치의 문자열 제거하기
특정위치의 문자열을 출력하는 기능처럼 제거하는 기능도 제거한다.
4) 문자열 포맷 지정하기
여러 다른 포맷의 값을을 문자열로 만들때 사용하는 기능이다.
5) 특정 문자열을 다른 문자열로 대체하기
문자열을 사용하다 보면 중간의 특정 단어를 교체해야 하는 일이 발생한다.
그럴떄 사용하는 것이 바로 Replace이다.
Replace(목표 단어, 대체 할 단어) 로 사용하면 된다.
6) 문자열 자르기
파싱등을 하다 보면 문자열을 잘라야 하는 경우가 생긴다.
이럴떄 유용한 함수가 바로 Split이다.
string 배열을 선언 후 Split(대상 문자열, 자를 단어) 로 사용하면 된다.
위에처럼 사용하면 '\r\n"부분이 잘리고 뒷 부분은 다음 배열에 저장된다.