기본형 vs. 참조형

Java의 자료형은 크게 기본형(Primitive types)과 참조형(Reference types)으로 분류할 수 있다.

기본형으로 int, char, float, double, short, long, byte가 있고, 참조형은 모든 클래스형이다.  사실 래퍼(wrapper) 클래스가 라이브러리로 준비되어 있어 모든 기본형을 클래스형으로 표현할 수 있다. 예를 들어, int는 Integer, char는 Character 등의 클래스 형이 있다.  기본형과 래퍼 참조형 사이에 박싱(boxing)과 언박싱(unboxing)으로 상호 변환할 수 있다.

기본형으로 변수를 선언하면 (예를 들어, int x와 같이) x라 이름을 붙인 저장 공간에 123이나 456과 같은 정수를 저장한다. 참조형으로 변수를 선언하면 (예를 들어, String s) s라 이름을 붙인 저장 공간에 실제 문자열의 주소를 저장한다. s = "123"을 실행하면 "123"이라는 문자열 객체는 어딘가에 저장되어 있고 그 저장된 주소를 s에 대입한다.

C++의 참조형과 Java의 참조형은 차이가 있다. Java의 참조형은 C++의 포인터형과 C++의 참조형의 중간 쯤으로 볼 수 있다. Java와 C++언어의 참조형을 사용하는 유사해 보이는 예를 살펴보고, 그 결과의 차이를 비교해보자.

Java 코드 예:

        String x = "xyz";
        C.m( x );
        System.out.println ( x );

        class C {
                static public void m( String y ) {  y = "123";  }
        }

 

C++ 코드 예:

        string xyz = "xyz";
        string& x = xyz;
        m( x );
        cout << x;

        class C {
        public:
              static void m(string&);
        }
        
        void C::m ( string& y ) { y = "123"; }

Java 예의 결과는 xyz이지만, C++ 예의 결과는 123이다.

[질문] 유사해 보이는 두 프로그램의 결과가 다른 이유를 설명하시오.
[질문] C++ 코드에서 string xyz = "xyz" 문장을 없애고 string&x = xyz를 Java 코드와 더 유사하게 string& x = "xyz"로 바꾸면 어떤 문제가 발생할까?

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *