String : java에서 문자열을 담을 때 사용하는 변수, 큰따옴표(" ") 안에 내용을 입력하여 사용한다.
기존에 알고있던 String에 대한 개념이다. int는 정수, float는 실수, char는 문자, boolean은 논리 등 변수를 선언하기 위해 앞에 붙는 데이터 타입처럼 String 또한 문자열에 대한 데이터 타입처럼 취급되어 사용된다. 하지만 실제 이클립스에 입력을 하게 되면 혼자만 데이터 타입이 조금 다르다는 것을 알 수 있다.
이렇듯 입력하게 되면 표시되는 색상이 혼자만 다른데, 이는 바로 String은 객체(클래스)에 속하기 때문이다.
함축된 표현 방식을 쓰기 전 모양새를 살펴보면 마치 인스턴스를 생성하여 참조변수에 주소값을 담던 방식과 비슷하다. 비슷할 뿐 아니라 실제로도 그렇게 동작하기 때문인데 그렇다면 하나 의문점이 생길 것이다. 바로 참조변수는 해당 객체가 생성될 때 부여받은 주소값을 저장한다는 부분이다. 이를테면 한 클래스를 인스턴스화 시켜 참조변수에 해당 주소값을 담았다 치자. 그리고 그 값을 콘솔창에 불러오게 되면 @표시가 붙은 뒤로 영어와 숫자의 조합으로 이루어진 주소가 나타나게 될 것이다. 즉, 참조변수 자체로는 해당 객체가 가지고 있는 특정 값을 표시한다거나 할 수 없다는 얘기다.
하지만 이렇게 String 변수를 콘솔창에 불러내보면 text라는 변수에는 마치 문자열이 담긴 것 마냥 출력이 되는 것을 확인할 수 있다. 사실 깊게 들어가기에는 아직 배움이 얕아 정확하게 설명을 해낼 순 없지만, 일단 String은 객체가 맞긴 하나 해당 참조변수는 자동적으로 String의 매개변수에 담긴 데이터 값을 참조하여 일반 변수처럼 동작한다는 것이다.
즉, String 타입을 가진 변수는 참조변수라 할 수 있으며 그로 인해 함수를 호출하여 사용할 수 있다. String은 일단 문자열을 파라미터로 받는다. 여기서 charAt이란, 하나의 문자가 여러개 이어져 만들어진 문자열 중에 한 글자를 하나의 인덱스로 보고 해당 위치로 찾아가 반환하는 함수이다. 위에서는 0번째 인덱스를 출력하라 명령했고 그 결과 '안'이라는 글자가 나왔다. length는 배열 객체에서도 자주 사용하다 싶이, 객체가 가진 길이를 뜻한다. charAt으로 한 글자씩 가져오는 것이 가능했다는 것은 글자 하나하나를 인덱스로 볼 수 있다는 의미다. 그래서 "안녕하세요"의 길이 5를 반환한 것이다.
그렇다면 이제 문제의 비교연산자 구문을 확인해보자. 첫번째는 equals() 함수를 사용했고 두번째는 다른 변수의 값을 비교하는 것처럼 비교연산자를 사용하였다. 하지만 같은 문자열을 제시했음에도 두 개의 값이 다른데 그 이유가 바로 String이 일반 변수가 아니라는 뜻이 된다.
Call by value, 일반 변수는 기본적으로 어떤 메서드에 사용되거나 호출이 될 때 변수에 들어있는 값을 그대로 꺼내어 가져오게 된다. 정수, 실수, 논리, 문자가 그러하게 동작하기 때문에 비교연산자를 사용하여 제어문을 쓰거나 반복문을 쓰는 것이 가능한데 String은 그렇지 않다. 일단 객체기 때문이다. 출력할 때 데이터 값을 참조하여 나타내는 참조변수, 즉 해당 변수에 담긴 값은 "안녕하세요" 라는 문자열이 아니라 정확히는 그 문자열이 담긴 주소를 나타내는 것이 된다. 그렇기 때문에 비교연산자로 문자열을 비교하게 되면 주소와 문자열을 비교하는 것이 되기 때문에 대부분의 논리값은 false가 나오게 될 것이다.
(간혹 true가 뜨기도 한다지만 추천하는 방법이 아니다)
그렇다면 문자열을 비교할 방법은 없는 것일까? 그건 아니다. 위에 방법대로 equals 함수를 통해 비교하는 건 가능하다. 이는 해당 객체 안에 존재하는 "안녕하세요" 라는 값을 꺼내어 직접 문자열을 대조하기 때문에 비교가 가능하게 되는 것이다. 그래서 함수를 통해 콘솔창에 불러냈을 때는 true값이 뜨게 되고, 비교연산자를 썼을 경우에는 false가 나오게 된 것이다. 이렇듯 객체 내에서 값을 바꾸거나 참조하는 경우는 Call by reference 라고 한다. 모든 객체가 이러한 방식으로 동작하지만 String은 어딘가 예외인 것처럼 돌아가는 것이 어렵기도 하면서 이해가 되는 것 같기도 하다….
그렇다면 이제 진짜 String의 정체(?)와 사용방법에 대해 알게 되었으니 응용을 해보도록 하자.
'아이티에듀넷' 카테고리의 다른 글
2024-09-13 :: 038 객체의 다형성 (0) | 2024.09.13 |
---|---|
2024-09-12 :: 037 객체의 상속 (0) | 2024.09.12 |
2024-09-10 :: 035 생성자 (0) | 2024.09.10 |
2024-09-09 :: 034 객체 (0) | 2024.09.09 |
2024-09-06 :: 033 반복문과 배열 변수 (1) | 2024.09.06 |