U E D R , A S I H C RSS

Java/문서/참조

  • 작성ìž� : 01 남ìƒ�협
  • 찬조 : 99 류ìƒ�민

� 문서를 작성하게� 계기

채팅 UI를 짜려고 여러가지를 하다가 대화명� 입력하였� 경우� 그 대화명� 저장하려고 String 형태� 대화명� 전달��로 사용하려고 하였는� �지 않았다. 그래서 MSN� 통해서 �민� 형�게 그� 대해서 물어보았다. �민�형� MSN으로 몇십분� 걸�서 알려 주었다.(�사~) � 문서� 나와 있는 내용� 대해서 아시는 분들� 있겠지만, 저와 같� 잘 모르는 분� �한 있�거 같기� �움� �기를 바�면서 �민� 형� 알려준 내용� 간추려 보았다.

구체�� 내용

~cpp 
Java �서는 new 와 delete 가 없지만 그 대안으로 참조형� �용한다.
참조형� C++�서 int &a와 같� by-value가 아닌 by-reference로
값� �용할 수 있는 형� �한다.

�바는 기본 �료형과 참조 �료형으로 �게 분류�며

기본 �료형� byte, short, int, long, double, char, boolean
참조형� Class, Array, interface (예외 String� 기본 �료형으로 취급한다.
String� 기본 �료형만� �주 쓰기 때문� �래스 임�� 불구하고
기본�료형으로 쓰�다.)

기본 �료형� 스칼�(scalar) 형�다.
참조형� 백터(vector) 형.
간단히 비유하면 스칼�는 값, 백터는 화살표.

벡터는 call by-reference로 전달�다.
�런 reference�료형� Class, 배열(Array) interface�며
call by-reference로 메소드나 전달��로 넘어 간다.

 # 참고로 함수�는 �� �바�서는 맞지 않는다.
   함수는 C�서만 존재 하는것�며 �바나 기타 OOP언어�서는
   메소드�는 표현� �절하다.
   메소드는 한 �체� 종�� 기능��는 부가� �미를 가지고
   있기 때문�다.

Class A
{
    public int a = 1;
    public void setA( int A ) { a = A; }
}

...
A _a;
A _A
_a.setA(3);
하면 �까? 안�다.(관련 내용� 제본책 3-3� 나와 있�)
안�는 �유는 아까 언급한 바와 같� �래스는 vector값�기 때문�다.

A _a;

�서 _a는 vector 값�다. � 값� 한국�로 쉽게 표현하�면 방향값,화살표 �다.
그렇다면 현제 방향값� _a는 무엇� 가리키고 있�까?
대답� "현재는 아무것� 가리키고 있지 않다." �다.
Java�서는 vector를 초기화 시켜 주기때문�, �체가 없� 그냥 저렇게만 입력하면 null� 가리킨다.
그래서 위와 같� 경우

_a.setA(3);

ì�„ 호ìœí•˜ëŠ” 경우ì—�는 NullPointerExceptionì�´ë�¼ë©´ì„œ ì—�러 ê°�체를 ë°œìƒ�시킨다.
그래서

A _a = new A();  //vector값 _a�게 가리킬 �체를 부여

�와같� 구문� 넣어서, �체를 �성하고, _a�게 가리키게 하여야만 한다.
�와 대조�으로 스칼�(scalar) 값� 예를 들면

int a;
a = 1;

�건 성립한다. �유는 int는 기본 �료형으로서 스칼� 값�기 때문�다.
스칼�(scalar) 역시 한국�로 표현하면, 양값(?) ��고 해야하나, 방향성� 없는
그냥 양� 가리키는 용어�다.

�같� 스칼� 값들� 절대로 메소드� reference형태� 전달��로
넘겨줄 수 없다. �것� �바� 설계 ���다.
�바�서는 스칼� 값 즉 기본 �료형� 복사로(call by-value) 전달�고, return 값으로
해당 결과를 �체로 받는다. return 값� 스칼� 값��면 어쩔 수 없다.
해당 설계��� Java Design Pattern � 잘 나와 있다.

그리고 위�서 살�시 언급했� String형� 기본�료형과 비슷하게 스칼�형으로
취급하기 때문� call by-reference로 못넘긴다. 그래서 final로 선언할 수 있다.
(final�란 그냥 #define��고 ��해� 무방하다. Java 컴파�러가 해당 final들�
실제 값으로 1:1 바꾸어 버리는 작업� 해버린다.)

위�서 언급했지만 다시 �하�면 String� 스칼� 취급� 받는 �유는 다�과 같다.
Java�전� 태어난 �업용 언어들� 대다수 char까지를 하나� 기본 �료형으로 많� 차용했고
많� 언어�서 string형� 기본�료로 쓸려는 노력� 많� 해�었다. (�유는 많� 쓰�기 때문�다.)
�터넷� 보급�면서 java 설계�들� String� 기본�료형 취급� 해� 현재�
시스템들� 따�가 줄것�� 예�해서 그렇게 설계했다.

 # 참고 : 기본 �료형들� 시스템내�서 마구 복사�다.
          그리고 만약 200KB � 스트� 형�게 나중� 2byte 만� 할당하는 다�� 경우��

	  String a = 200KB �료
	  a = "a";(�단 개��으로 �렇게 하겠�)

	  �렇게 �면 기본 �료형으로 취급 받는 String� 통째로 200KB를 갈아 버린다.
	  문제는 200KB� 사소한  용향� 아닌 그게 2메가 짜리� 문서� 경우는 문제가 �다.
           여기서� �미는, String� imutable하게 취급 받기 때문�, 해당 �체� 저장소가 완전 초기화 �고
           새로 할당 받는다는 �미�다. 물론 초기화는 Garbage collector가 해주기 때문�, 차후 메모리가
           부족할때 파괴 �어 진다.
           �게 심�한 �유는, 기존 저장소를 그냥 유지한체로, String� 길�만 1로 하고, a[0]� a문�열�
           집어 넣� �후, 그대로 쓰면 �는�, String �체는 새로 공간� 할당 받는다는 �미�다.

	  그래서 mutable한 String처리를 위해서 Java 1.2�서 등장한것� StringBuffer �고 �것� vector값으로
           취급 받는다. �� � 문제를 String� mutable문제 �고 불리며 관련 �료�서 � 단어가 �주
	  등장한다. string is imutable. Stringbuffer is mutable
	  String� 한번 �료가 들어가면 바뀌지 않아서 주로 바뀌고 확장�는
	  문�열��료� 경우 StringBuffer 를 사용하는 걸 권장한다.

           mutable한 �체� 구현� 위해 StringBuffer� 메소드를 보면, �정 단위� char저장 장소를 지정하여
           그 내부�서 문�열� �체할수 있고, 그 저장 장소보다 � � 문�열� 입력� �다면, 해당 문�열 길��
           2배� 공간� 확보해 초기화 한다..

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:33
Processing time 0.0061 sec