이번 글은 저번 글에 이어 String class에서 자주 쓰이는 메소드(함수)들을 소개하겠다.
//3. 문자열에서 특정 위치의 char 얻어오기
char ch = str.charAt(0);
System.out.println(ch);
//System.out.println(str.charAt(5)); // error 인덱스번호 벗어남
for (int i = 0; i < 5; i++) {
System.out.println(str.charAt(i));
}
이번에 소개할 메소드(함수)는 charAt()이다.
눈치가 빠른 사람이라면 이 메소드의 리턴 타입을 바로 인지했을 것이다. 보다시피 char형이다.
String은 내부적으로 문자열을 문자형 배열로 저장한다.
바로 이전 글에서 str을 "Hello"라고 저장했기 때문에 주석에서처럼 charAt(5)는 인덱스 번호가 벗어나 에러가 발생한다.
위 그림처럼 문자열이 저장되고 배열의 인덱스는 언제나 0번부터 시작이기 때문에
문자열이 5글자라면 charAt()은 배열의 길이 - 1까지만 사용해야 한다.
//Scanner는 char 입력 기능이 없었음.
//java에서는 문자열로 입력받아서 그 첫 글자를 얻어오는 방식 사용
char c;
Scanner sc = new Scanner(System.in);
String s2 = sc.next();
c = s2.charAt(0);
//c = sc.next().charAt(0); // Method 체이닝
이 내용은 전에 썼던 아래 글에서 나중에 언급하기로 했던 내용인데 이제서야 소개할 수 있게 되었다.
https://bonustrack02.tistory.com/5
위 코드를 설명하면 아까 charAt()의 리턴 타입은 char형이라고 했었다.
그래서 char형 변수로 입력을 받는데 무조건 charAt(0)을 받아오니 어떤 문자열을 입력해도 그 첫 글자가 나온다.
이어서 아래 주석문은 C언어만 공부해온 사람이라면 정말 이해가 안될 수 있다.
하지만, 우리가 알고 있는 지식만으로도 해석이 가능하다.
sc.next()의 리턴 타입은 무엇인가? String이다.
그렇다면 charAt()은 어떤 자료형에서 사용하는가? String이다.
sc.next().charAt()은 달리 보면 String.charAt()으로 볼 수 있다.
여기서도 간혹 연산자의 우선 순위따위는 고려하지 않느냐고 할 사람도 있을 것이다.
이것도 곰곰이 생각해보면 "c = "이후에 sc.next().charAt()에서의 연산자는 다 같은 .연산자를 사용하고 있다.
따라서 우리가 기본적으로 알고 있는 컴퓨터 언어의 실행 순서에 따라 위에서 아래로 좌에서 우로 차례대로 실행된다.
//4. 문자열 안에 특정 글자가 몇 번째에 있는 지 알려주는 메소드
int index = str.indexOf('e');
System.out.println(index);
System.out.println(str.indexOf('l'));
System.out.println(str.lastIndexOf('l'));
System.out.println(str.indexOf('K')); //못 찾으면 -1을 리턴
//4-1. 특정 문자열의 index도 검색 가능
System.out.println(str.indexOf("el"));
//4-2. 특정 문자가, 원하는 위치 이후에 있는지 검색 가능
System.out.println(str.indexOf('e', 2)); //배열의 2번방부터 검색
여기서 소개할 메소드(함수)는 indexOf()이다.
가장 기본적인 사용 방법으로는 문자열 안에 특정 문자가 있는지 알고 싶을 때 사용하는 방법이다.
여기서 한 번 더 눈치 빠른 사람이라면 이 메소드(함수)의 리턴 타입을 바로 알아챘으리라 믿는다.
이 메소드는 그 문자가 문자열에서 몇 번째 인덱스에 위치하는지 정수형을 리턴해준다.
아까부터 str은 "Hello"로 사용 중인데 4번째 줄의 lastIndexOf()라는 메소드가 있다.
이 메소드는 내가 왜 사용했을까? 그냥 indexOf('l')을 하면 대체 몇 번째 인덱스를 리턴해야 할까?
그냥 단순히 0번부터 검색해서 2를 리턴할 것이다.
하지만, 내가 만약 역순으로 검색을 하고 싶다면? 이 때 lastIndexOf('l')를 사용하면 끝에서부터 검색을 시작해 3을 리턴할 것이다.
이번엔 없는 문자를 검색했다면 어떤 리턴 값을 줘야 할까? 가장 간단히 -1을 준다. 배열의 인덱스 번호에는 음수가 없기 때문이다.
indexOf()는 특정 문자열의 인덱스도 검색 가능하다.
여기서도 의문점이 생긴다. 대체 indexOf("el")은 어떤 값을 리턴해야 할까?
답은 생각보다 단순하다. 0번 인덱스부터 검사를 시작해 일치하는 문자열의 첫 문자에 해당하는 인덱스를 반환한다.
또, indexOf()는 특정 문자가 원하는 위치 이후에 있는지 검사도 가능하다.
물론 indexOf()안에 정수형으로 파라미터를 더 줄 때 이 숫자는 인덱스 번호를 의미하기 때문에
str의 경우에는 최대 4까지만 써야한다. 5라는 인덱스는 str에 없으니까.
//5. 특정 문자열이 포함되어 있는지 여부를 boolean으로 리턴
String s3 = "Hello World! Hello Android! Nice World!";
boolean b = s3.contains("World");
System.out.println(b);
//6. 문자열 결합 - 원본 String은 불변
String s4 = s3.concat("nice android!"); //값들이 결합된 새로운 String 객체 생성
//원본이 바뀐것처럼 하려면
s3 = s3.concat("nice android!");
System.out.println(s3);
//사실, concat보다 문자열의 결합 연산자 +를 더 많이 사용
이번에는 contains() 메소드(함수)를 소개한다.
위 코드에서 s3.contains("World")를 했을 때 리턴은 어떻게 될까? 주석에도 써놨지만 boolean값을 주기 때문에 true나 false를 준다.
여기서의 실행값은 true가 될 것이다.
concat()이라는 메소드를 소개해볼 차례이다.
이 메소드는 concatenate라는 단어를 줄인 것인데, '연결시키다'라는 뜻을 가지고 있다.
그래서 단어의 의미처럼 위의 코드처럼 s3.concat()을 한 리턴 값을 s4에 대입하게 되면
두 문자열을 결합한 새로운 s4라는 String 객체를 생성한 것이다.
이 상태에서 s3는 아직도 "Hello World! Hello Android! Nice World!"라는 문자열을 가지고 있다.
만약 정말 s3가 "Hello World! Hello Android! Nice World!nice android!" 라는 문자열이 되게 하고 싶다면
s3.concat()한 리턴 값을 다시 s3에 대입하는 방법을 사용해야 한다.
하지만, 충격적으로 이 메소드는 거의 사용하지 않고 다들 문자열 결합 연산자인 +를 더 많이 사용한다.
String에 관한 글을 두 개밖에 쓰지 않았는데 벌써 이 다음 내용을 빨리 소개하고 싶다.
결론은 아직도 소개할 String클래스의 메소드들이 많이 남았다는 얘기였다.
'Language > Java' 카테고리의 다른 글
자바의 배열(Array) (0) | 2022.02.23 |
---|---|
Java에서의 String 소개 - 3 (0) | 2022.02.15 |
Java에서의 String 소개 - 1 (0) | 2022.02.09 |
Java의 print와 scan (0) | 2022.02.03 |
짧은 객체지향 프로그래밍 소개 (0) | 2022.02.01 |