본문 바로가기
Java/Java Basic

[Java Basic] 9. 배열 3 - 문자열 배열과 String 타입

by Rosmary 2022. 7. 1.
728x90
반응형

 

 

 

지금까지 Java 배열과 관련된 2 개의 포스팅에서, 필자가 예시로 정수형 배열만 사용했는데, 문자형 타입 역시 배열로 지정할 수 있다. 문자형 배열의 경우 정수형 배열과 차이점이 몇 가지 있는데, 이번 포스팅에서는 Java의 문자열 배열과 이와 관련있는 String 타입에 대해 포스팅을 진행해보려 한다.

 

 

1. 문자형 배열 및 String 타입 생성

 

문자열 배열 역시 정수형 배열과 동일한 방식으로 생성하면 된다. 배열의 생성은 이 포스팅을 참고하자.

 

 

다음은 String, 문자열 타입의 생성에 대해 알아보자. String 타입 역시 배열과 마찬가지로 참조형 변수이므로, 변수 생성 시 배열과 유사한 포맷으로 진행하면 된다. 단, 문자열 리터럴 값은 반드시 쌍따옴표로 둘러쌓인 상태로 초기화를 진행해야 한다.

 

 

 

for 문으로 문자형 배열 값을 하나씩 출력해서 printf로 나열해보면, 마치 문자열(String) 변수가 출력되는 것과 동일한 결과가 나타나는 것을 확인할 수 있다. 사실 Java의 String은 참조형 변수로 동일한 참조형 변수인 배열(문자형)과 상호 호환이 가능하다.

 

 

2. 문자형 배열 / String 타입 전환

 

따라서 문자형 배열과 문자열 변수값은 String 클래스를 통해 변환이 가능하다.

 

*  문자형 배열 -> 문자열:  String 문자열변수명 = new String (문자형 배열명);

*  문자열 -> 문자형 배열:  char [] 문자형 배열명 = 문자열 변수명.toCharArray();

 

 

String 타입은 문자를 쭉 늘어놓은 것이므로, char 배열과 동일하다. 그리고 Java에서 문자열을 다룰 때 문자형 배열을 사용하지 않고 참조형인 String 타입을 사용하는 이유는, String 타입이 문자형 배열에 문자열 작업에 유용한 기능을 많이 넣어두었기 때문이다. 가령, 두 문자를 합친다고 하면 문자형 배열은 새 배열을 만들어 기존의 두 문자열 배열을 for 문이나 System.arraycopy() 매서드를 사용해야 하나, String은 단순이 '+' 연산자로 이 작업을 진행할 수 있다.

 

 

참고로, 문자형 배열의 경우 정수형 배열과 달리, 배열명을 System.out.println()으로 직접 출력하더라도 배열의 메모리 주소가 반환되는 것이 아니라 문자열이 반환된다.

 

 

단, 이는 문자형 배열명을 단독으로 출력하는 경우에만 해당하며, 문자형 배열과 String 배열에 대해 '+' 연산을 진행할 경우 문자형 배열의 주소와 String 리터럴 값이 연산된다.

 

 

 

 

3. String 타입과 메서드

 

다시 언급하지만, String 타입은 일종의 문자형 배열이다. 따라서 String 변수 리터럴 값의 문자 길이, 특정 문자의 위치나, 다른 문자열과의 동일 여부 비교 등 배열에서 진행할 수 있는 작업 대부분에 대해 매서드(함수)를 지원한다. 누차 말하지만, 이 내용은 Java의 클래스와 매서드에 대한 이해가 필요하다. 아직 클래스와 매서드에 대한 포스팅을 진행하지 않았기 때문에 우선은 String 사용 시, 이러한 기능도 있다는 것을 알아두면 된다.

 

 

(1) 문자열 길이 확인

조금 긴 단어를 문자열 변수로 생성해보려 한다. 필자는 이 String 변수를 char로 변환하여 길이를 구하는 것과 매서드로 길이를 출력하는 방법 두 가지를 진행해보려 한다.

 

 

 

배열과 동일하게, 문자열에서도 길이를 구하는 매서드를 제공한다. 바로 String.length() 메서드이며, String 부분에 String 변수명을 작성하면 해당 변수의 문자 길이를 반환받을 수 있다. 배열의 길이를 구할 때 사용하는 length는 뒤에 소괄호가 붙지 않는데, 이는 배열 클래스 내에서 길이를 구하는 length는 클래스 변수로 정의되어 있는 반면 문자열은 클래스의 메서드(함수)로 정의되어 있기 때문이다. 

 

 

(2) 문자 위치 확인

 

이번에는 문자열 내에서 특정 문자의 위치를 찾는 매서드를 사용해보려 한다. 필자는 Rindfleisch의 c라는 문자 위치를 반환받아보려 한다. 위의 예시와 마찬가지로 for 문과 매서드를 사용하는 코드 모두 작성한다.

 

 

문자열에서 특정 문자의 위치를 반환하는 매서드는 String.indexOf()이며, 인자로 문자형 값을 사용한다. 이 매서드는 인자의 문자형의 문자열 내 위치를 정수로 반환한다. 만약 값이 문자열 내에 존재하지 않는 경우 -1 값을 반환한다. 참고로 이 매서드는 인자로 지정된 문자의 대소문자를 구분하기 때문에 아래의 예시에서는 -1 값이 반환된다.

 

 

 

 

(3) 문자열 특정 위치의 문자 반환

 

이번에는 반대로 문자열 내 특정 자리에 위치한 문자를 반환받아보려 한다. 이 때 사용하는 매서드는 String.charAt() 이며, 인자로는 정수형 값을 사용한다. 참고로 정수형 값은 문자열 내 자릿수를 의미하지만, 배열과 동일하게 0이 첫 번째 자리를 의미한다. 필자는 아래의 예시에서 문자열의 5번째 문자를 반환받기 때문에 인자를 4로 정의했다.

 

 

다른 매서드와 마찬가지로, charAt() 역시 "문자열 -> 문자형 배열 변환 -> index값에 위치한 문자 반환" 과정을 매서드 내에 정의해 놓은 것이다. 따라서 문자열의 길이를 초과하는 정수값이 인자에 들어가는 경우, 배열과 마찬가지로 에러가 발생한다.

 

배열에서 보던 IndexOutOfBoundsException 에러를 확인할 수 있다.

 

 

 

(4) 문자열의 비교

 

서로 다른 두 문자열을 비교하는 작업 역시 String 매서드로 제공한다. 위의 예시와 마찬가지로 for 문과 매서드 두 작업 모두 코딩해보려 한다.

 

 

String은 String.equals라는 매서드로 다른 문자열과의 비교 결과를 boolean 값으로 반환할 수 있다. 매서드 인자는 비교할 문자열을 사용하며, String 부분은 비교 대상 문자열 변수명을 입력하면 된다. 참고로 equals는 문자열 내 문자의 대소문자까지 비교하기 때문에 한 글자라고 대소문자가 다른 경우 false 값이 반환된다. 만약 대소문자를 무시하고 내용만으로 비교하고 싶다면 equalsIgnoreCase() 매서드를 사용하면 된다.

 

 

 

서로 다른 문자열 변수가 동일한 값을 가지는 지 비교하는 방법 외에, 두 문자열 중 어떤 문자열이 사전적으로 우선하는지도 비교할 수 있다. 예를 들어 "apple"과 "banana" 중 사전에 먼저 등장하는 단어는 apple이다. 이러한 문자열의 대소비교 역시 String의 매서드인 compareTo() 로 결과를 나타낼 수 있다.

 

 

 

String.compareTo() 매서드는 비교할 문자열을 인자로 사용하며, String 변수명이 인자보다 큰 값을 가지는 경우 - 사전 상 뒤에 위치하는 경우 - 1을 반환하며, 반대의 경우 -1을 반환한다. 동일한 문자열인 경우 0 값을 반환한다. equals 매서드와 마찬가지로 대소문자를 무시하고 비교하는 compareToIgnoreCase() 라는 매서드도 제공한다. 

 

 

 

 

 


 

 

String 타입의 경우, 필자가 위에서 예시로 든 것 외에 concat이나 isEmpty(), isBlank() 등, String 사용 시 자주 사용하는 기능이 매서드로 정의되어 있다. Eclipse에서는 String 배열명에 점을 찍으면 사용 가능한 매서드와 해당 매서드에 대한 설명이 나타나니, 영어 공부도 할 겸 어떤 기능이 있는지 확인해 보면 좋을 듯 하다.

 

 

 

 

다음 포스팅에서는 Java 배열의 마지막 포스팅. 다중 배열에 대해 알아보려 한다.

 

 

Fin.

 

 

 

 

반응형

댓글