본문 바로가기

언어공부/Java

자바 String 클래스, 문자열 리터럴(String리터럴), String클래스의 메소드 -equals()메소드, equalsIgnoreCase()메소드

자바 String클래스에 대해서 알아보자.

String클래스

자바에서는 문자열을 위한 클래스를 제공한다. 바로 String클래스로 문자열을 저장하고 이를 다루는데 필요한 메소드를 함께 제공한다. String클래스는 변경 불가능한 클래스이다. 일단 클래스가 final로 다른 클래스의 조상이 될 수 없다. 그리고 문자열을 저장하기 위해서 문자형 배열 참조변수 char[] value;를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장된다. 한번 생성된 String인스턴스가 갖고있는 문자열은 읽어올수만 있고, 변경할 수는 없다.

 

'+'연산자로 문자열을 결합하는 경우 인스턴스 내 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String인스턴스가 생성되는 것이다. 이처럼 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 되므로 가능한 결합횟수를 줄이는 것이 좋다.

 

문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스대신 StringBuffer클래스를 사용하는 것이 좋다. StringBuffer인스턴스에 저장된 문자열은 변경이 가능하므로 하나의 StringBuffer인스턴스 만으로도 문자열을 다루는 것이 가능하다.

 


문자열리터럴(String리터럴)

자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이 때 같은 내용의 문자열 리터럴은 한번만 저장된다. 문자열 리터럴도 String인스턴스이고, 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문이다.

 

ex) String s1="a"; String s2="a"; String s3="a"; 이면 같은내용의 문자열이기 때문에 한번만 저장되며, "a"라는 문자열을 담고있는 String인스턴스가 하나 생성된 후 참조변수 s1, s2, s3은 모두 이 String 인스턴스를 참조하게 되어 주소가 같다.

 

String클래스에서 오버라이딩 된 equals()메소드와 equalsIgnoreCase()메소드

1) boolean equals(Object obj)로 매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교한다. obj가 String이 아니거나 문자열이 다르면 false를 반환한다.

2) equalsIgnoreCase(String str)로 문자열과 String인스턴스의 문자열을 대소문자 구분없이 비교한다.

 

ex)

 

문자열리터럴인 str01과 String인스턴스 str02를 선언했다. ==는 주소값을 비교하며, str01=="abc"는 str01이 문자열 리터럴이기 때문에 같은 내용은 하나의 인스턴스(주소)를 공유하여 true가 나온다. 하지만 str01==str02는 str02가 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성되어  주소값이 달라 false가 나온다.

 

equals()메소드는 서로의 내용 값을 비교하게 되는데 둘다 abc이기 때문에 메소드로 비교하면 true가 출력된다. 하지만 대문자인 ABC로 비교하게 되면 false가 나온다. 대소문자 구분하지 않고 비교를 하려면 equalsIgnoreCase()메소드를 사용하지만 잘 사용되지는 않는다.

 

출력화면

 

ex)

 

기본타입을 ==로 비교하면 값만 비교하고, 참조타입을 ==로 비교하면 주소값을 비교한다.

 

출력화면