[Java] 자바 #15 String과 문자열 함수(replace, substring, charAt 등등..)

문자열 ,String

문자의 집합

참조형

자바에서 문자열 데이터를 조작/제어하기 위한 기능들 제공.



문자열의 길이

- 문자열을 구성하는 숫자의 수

- 한글, 영어, 특수문자 등등 상관없이 자바 문자당 1개로 취급함

- int length()


String txt1 = "abcdefg";

String txt2 = "안녕하세요";

System.out.println(txt1.length()); //txt1의 길이출력 : 7

System.out.println(txt2.length()); //txt2의 길이출력 : 5


문자열 추출

- char charAt(int index)

- 문자열내의 특정 위치에 있는 문자 1개를 추출

- index는 제로베이스 구조. 0부터 시작.


String txt1="가나다라마바사아자"; //length : 9

char c = txt1.charAt(0); >> '가'


공백제거

- String trim()

- 원본문자열에 공백을 제거하고 난 뒤 "공백 제거된 문자열"을 반환 / 원본은 안바뀐다.

- 문자열의 "시작과 끝"의 연속된 공백문자를 제거.


String txt1 = "   하나   둘   셋  넷";

System.out.printf("[%s]\n",txt1);  

출력 >> [   하나   둘   셋  넷]


System.out.printf("[%s]\n",txt1.trim()); 

출력 >> [하나   둘   셋  넷]


중간의 공백은 안없어 지는데요?? >> trim() 메소드는 양쪽 끝에있는 공백만을 제거합니다. 즉, charAt(0)부터 문자를 받아 처음 등장하는 문자가 ' '(공백문자)라면 이를 제거하고 'a'같은 특정 문자가 나올때까지 공백을 제거하는 방식이라고 생각하시길 바랍니다.



문자열 검색기능

- 사용빈도 높음.

- 문자열내에서 원하는 문자(문자열)을 검색 => 발견된 위치(index) 반환

- int indexOf(char c) [오버]

- int indexOf(String str)         [로딩]

- int indexOf(char c,int fromindex) [오버]

- int indexOf(String str, int fromindex) [로딩]


- int lastIndexOf(char c) [오버]

- int lastIndexOf(String str) [로딩]

- int lastIndexOf(char c,int fromindex) [오버]

- int lastIndexOf(String str, int fromindex) [로딩]


ex ) 직접 타이핑 하시면서 돌려보시기 바랍니다. (***)


String str = "안녕하세요. 홍길동입니다.";


int result1 = str.indexOf('홍');

System.out.println(result1); //7 -> '홍'이라는 문자가 있는 곳.


result1=str.indexOf("홍길동");

System.out.println(result1); //7 -> 시작글자 '홍'의 위치를 반환함.


result1=str.indexOf("아길동");

System.out.println(result1); //-1 -> 없는 문자, 문자열


indexOf / lastIndexOf  둘의 차이는 뭐죠??

>> indexOf는 검색방향이 (왼쪽) ------> (오른쪽) 으로 흐릅니다. 

>> 반면에 lastIndexOf는 역방향으로 (왼쪽) <--------(오른쪽)으로 검색을 진행하는 방식입니다.


중요한 특징!!

만약 다음의 경우는 어떻게 될까요??


String str = "안녕하세요. 홍길동입니다. 그냥 길동이라 불러주세요";

str.lastIndexOf("길동") >> 얘는 "그냥 길동이" 여기에있는 길동을 찾는겁니다.

str.indexOf("길동")     >> 얘는 "홍길동"에 있는 길동을 찾는 겁니다.


그럼 indexOf("길동")으로 "그냥 길동이라" 이부분에 있는 길동은 찾을 수 없는 건가요?? >>> 네 못찾습니다. 왜냐하면 "홍길동"에 있는 길동이가 이미 걸러버리기 때문에 앞에있는 "길동"의 위치를 반환하고 종료해버립니다. 그래서 뒤에 시작 index를 지정해서 찾아야 합니다 . 이렇게 말이죠


str.indexOf("길동",str.indexOf("길동")+1); 



대소문자 변환

- String toUpperCase() -> 대문자로 변환

- String toLowerCase() -> 소문자로 변환

String txt1= "Hello Hong";

System.out.println(txt1.toUpperCase()); //HELLO HONG

System.out.println(txt1.toLowerCase()); //hello hong


패턴 검색

- boolean startsWith(String txt)  -가독성이 높음, 활용도가 떨어짐.

- boolean endsWith(String txt)


String name ="홍길동";

System.out.println(name.endsWith("동"));   // 안에 있는 String이 "동"으로 끝나는가. (true)

이름이 홍씨인지?

System.out.println(name.startsWith("홍")); //안에있는 String이 "홍"으로 시작하는가 (true)


해당파일이 이미지입니까? -> 확장자보기

String file = "dog.jpg"; //이미지 : gif, jpg, png


if(file.endsWith("gif") || file.endsWith("jpeg") || file.endsWith("jpg") || file.endsWith("png"))

System.out.println("이미지");

else

System.out.println("이미지아님");



문자열 추출(2)

- char charAt(int index) 과의 차이점은 char(문자1개)이냐 String(문자열)이냐의 차이이다.

- String subString(int start, int end) start숫자는 포함, end숫자는 미포함

- String subString(int start) -> 시작위치에서 끝까지.

- indexOf와 많이 사용


String txt1 = "안녕하세요. 홍길동입니다.";

System.out.println(txt1.substring(3,8));

System.out.println(txt1.substring(3,4)); // '세'(X) "세"(O)

- 성별구분하기. 

String jumin = "940405-1139405"; 


<charAt으로 하기>

System.out.println(jumin.charAt(7) == '1' ? "남자" :"여자");


<substring으로하기>

System.out.println(jumin.substring(7,8).equals("1")?"남자":"여자");


- 몇년생??

System.out.println("19"+jumin.substring(0,2));



문자열 치환

- 대상 문자열에서 특정 문자열을 찾아서 다른 문자열 바꾸기

- String replace(String old , String new)

- old를 new로 치환하는 것.!!!!


String txt1= "안녕하세요. 홍길동님";

System.out.println(txt1.replace("홍길동","변해랏"));


<특징>

System.out.println(txt1.replace("하하하","변해랏")); // "하하하"는 없는데도 컴파일이 되고 출력이됨 -> 원본 그대로 반환.


ex ) 게시판 예제

String content="글내용입니다. 어쩌구 저쩌구~~바보야";

//금지어!!

String word = "바보";

//바보라는말을 함

if(content.indexOf("바보")>-1){

//금지어 발견

System.out.println("금지어 발견, 글쓰기 중단");

}else{

System.out.println("글쓰기 진행");

}

//금지어 사용 X -> 글쓰기진행 O -> 금지어가 **으로 바뀜

System.out.println(content.replace("바보","**"));
















댓글

Designed by JB FACTORY