- 작성� : 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배� 공간� 확보해 초기화 한다..










