자바 String 클래스 | 자바 입문강좌 37

자바 String 클래스

String 클래스는 java.lang 패키지에서 문자열을 다루는 핵심 클래스입니다. java.lang 패키지는 자바 프로그래밍 언어 설계의 가장 기초적인 클래스를 담아놓은 패키지입니다.

여기서는 패키지와 import 에 대하여 아직 다루지 않은 것 같습니다만, java.lang 패키지는 import 하지 않아도 기본으로 사용가능한 패키지이기도 합니다.

잡설 IT산업

여기서 잠깐 프로그래밍 언어를 설계하는 사람들에 대하여 잠깐 잡설을 하고 넘어가겠습니다. 자바 입문강좌가 벌써 37번 까지 작성되었네요. 그동안 너무 딱딱한 내용만 작성해왔더니 좀 웹사이트가 지루해진 것 같습니다. 가끔은 IT관련 잡담도 좀 하고 그래야하는데…

프로그래밍 언어의 설계는 컴퓨터 과학 분야에서는 시스템 엔지니어의 영역입니다. OS나 프로그래밍 언어 같이 시스템 아키텍쳐의 개발을 하는 것은 일반 응용 프로그래밍 개발자들은 도전하기 어려운 영역입니다.

이렇게 자바 초급을 배우고 중급을 배워도 그 안에 시스템을 설계하기 위한 약간의 힌트를 볼 수 있을 뿐이지 응용 프로그래밍을 이해하는 수준에서 시스템을 설계하는 것은 불가능합니다.

일반적으로 OS나 프로그래밍 언어를 개발할 수 있는 사람들은 컴퓨터 과학에 정통해야할 뿐만 아니라 천재의 영역에 있다고 믿고 있습니다.

컴퓨터 소프트웨어의 미래가 희망적인 것은 빌게이츠, 리누스 토발즈, 귀도 반 로썸, 비야네 스트롭스트룹, 데니스 리치 등의 컴퓨터 과학자들이 아직도 처음의 분야와는 다르지만 활약하고 있습니다. 이들이 OS와 컴튜터 프로그래밍 언어를 창조한 사람들입니다.

IT업계 밖에서는 스티브 잡스 같은 마케팅 천재들의 인기가 더 많지만 기술을 공부하는 사람들은 저들이 IT역사속에 세운 공로에 대해서 인정할 수 있습니다. 빌게이츠는 MS사의 오랜 독점으로 욕을 많이 먹긴 했지만 한편으론 MS가 망그러먹은 윈도우즈 시리즈가 있었기에 애플 컴퓨터의 존재감이 더 빛나게 되지 않았나 싶기도 합니다;;

그들은 세계에서 널리 알려질 정도로 특별한 케이스지만 오픈소스 커뮤니티에서는 수많은 무명의 공헌자(contributor)들이 있습니다. 아무 금전적 이득이 없음에도 프레임워크와 언어를 개발하고 깃허브에 사람들과 코드를 공유하기 시작했습니다. 불과 10년전만 해도 수백만원짜리 소프트웨어들이 지금은 커뮤니티 버전은 무료로 푸는게 많습니다. 게임계에서는 유니티, 언리얼엔진부터 파이썬 개발도구, 비주얼 스튜디오 코드같은 훌륭한 IDE도 지금은 무료입니다.

정말 수많은 사람들이 돈도 받지 않고 시작한 프로젝트들 때문에 현재의 IT생태계가 돌아가고 있다는 사실은 매우 놀랍습니다. 이런 무명의 공헌자들 때문에 IT업계가 매년 폭발적인 성장을 하는 원동력이 되고 있습니다. 게다가 유튜브의 발전 이후 최고의 IT강의를 누구나 무료로 들을 수 있게 되었습니다. (영어를 잘하는게 필요합니다만 이제는 한글 강의도 많습니다)

예전에는 수백만원을 들고 찾아가서 들어야 했던 강의를 무료로 나누어 주고 있습니다. 이것도 알게 모르게 IT의 발전을 촉발시키죠. 돈이 없는 사람들도 유튜브와 인터넷으로 얼마든지 배우고 산업현장에 투입되서 좋은 프로그램을 만들어 낼 수 있습니다.

자 다시 String 주제로 돌아와서 java.lang 패키지에는 프로그래밍 언어 설계자의 철학이 들어있습니다. 물론 여기서 프로그래밍 인문학을 하려는 것은 아닙니다. 기술적인 이해가 첫번째지요. 그러나 자바 개발자들이 응용프로그래머들에게 가장 첫번째로 사용할 수 있는 자원으로 java.lang 패키지를 준 것은 이것을 사용해서 객체지향 프로그래밍을 시작해라~ 라는 메시지와도 같습니다.

C언어에서 문자열은 char 배열을 사용했었습니다. String 은 원래 기본자료형보다는 객체가 더 어울리는 자료형입니다. 자료형 <==> 객체 이게 헷갈리는데 좀 큰 의미에서 이해하면 객체 지향 프로그래밍에서 모든 것은 객체다. 그 정도로 요약할 수 있겠습니다. 기본 자료형도 Wrapper 클래스를 둔 것을 보면 숫자와 문자리터럴 까지 궁극적으로 모든 것은 객체여야 한다. 는 생각도 엿볼 수 있습니다.

String 클래스 예제

String 클래스는 문자열 관련 처리가 우선이죠. 여기서는 java.lang 패키지의 설계에 관련한 코드를 대강 보고 지나가겠습니다. String 클래스로 문자열을 다루는 함수들의 사용법은 별도의 포스팅에서 다루겠습니다.

package com.kay;

public class Main {

    public static void main(String[] args) {
        String greeting = "Hello World!";
        String hello = "Hello World!";

        System.out.println(greeting == hello);
        System.out.println(greeting.equals(hello));

        System.out.format("- hash code : %X\n", greeting.hashCode());
        System.out.format("- hash code : %X\n", hello.hashCode());

        System.out.format(" -  address : %X\n", System.identityHashCode(greeting));
        System.out.format(" -  address : %X\n", System.identityHashCode(hello));

        String sayHello = new String("Hello World!");
        String helloWorld = new String("Hello World!");

//        인스턴스 주소 비교
        System.out.println(sayHello == helloWorld);
//        문자열 값 비교
        System.out.println(sayHello.equals(helloWorld));

        System.out.println("- toString : " + sayHello);

        System.out.format("- hash code : %X\n", sayHello.hashCode());
        System.out.format("- hash code : %X\n", helloWorld.hashCode());

        System.out.format(" -  address : %X\n", System.identityHashCode(sayHello));
        System.out.format(" -  address : %X\n", System.identityHashCode(helloWorld));
    }
}

일단 java.lang. 패키지가 import 에 없지만 기본으로 컴파일러가 import 하는 겁니다. 자바에는 이렇게 소스코드에 보이지 않는데 컴파일러가 스스로 하는 일이 많습니다. 좋은 프로그래머가 되려면 뒤에서 컴파일러가 뭘하고 있는지도 관심을 가져야 합니다.

true
true
- hash code : C63CB61D
- hash code : C63CB61D
 -  address : 133314B
 -  address : 133314B
false
true
- toString : Hello World!
- hash code : C63CB61D
- hash code : C63CB61D
 -  address : 4EDDE6E5
 -  address : 70177ECD

String 클래스도 마찬가지로 Object 클래스를 상속합니다. hash code 를 돌려보면 알 수 있는 것은 Hello World! 를 hash 하면 항상 같은 값이 나온다는 것을 알 수 있습니다. String 클래스의 hashCode() 메소드는 이미 String 클래스 내부에서 오버라이드 되있습니다.

System.identityHashCode() 함수는 기본 HashCode 입니다. JVM이 관리하는 메모리 주소와 객체를 매칭시킵니다. HashCode 에 관한 디테일은 중급에서 다룰 사항으로 여기서는 더 깊이 다루지 않겠습니다.

어디까지나 java.lang 패키지의 세계를 소개하기 위함입니다. 실용적인 도움은 별로 안됩니다. 다만 hashCode 는 최근 블록체인의 인기가 높아짐에 따라 중요성이 높아지고 있으니까 관심이 있다면 관련 튜토리얼을 찾아서 공부하는 것을 추천합니다.

요약

약간 수박 겉핥기 식이지만 java.lang 패키지의 String 클래스에 대하여 대강 훑어봤습니다. 자바는 응용 프로그래머들이 이해할 수 있는 범위가 좀 한정적이라서 자료를 찾아봐도 딱 좋은 예시가 별로 없는 것 같네요. 자바 버전이 분리되면서 JDK 코드가 변한 것도 한몫을 하는 것 같구요. 이 튜토리얼을 하면서 현재는 OpenJDK 를 사용하고 있습니다.

여기서 부족한 설명들은 차후 String 각론에서 다뤄야할 듯 합니다.

외부참고문서

자바 String 클래스 둘러보기

java.lang (Java Platform SE 7 ) (oracle.com)

String (Java Platform SE 7 ) (oracle.com)

Leave a Comment