앞에서 간단히 C++ String과 Java String을 알아봤다.
이제 각설하고, 두 String의 구현법 및 내부 구현 함수들을 보며 뭐가 다른지 파악해보자.
(Java에서는 메소드로 읽는게 정석이나, 편의를 위해 전부 함수로 칭하도록 하겠다)
(빠지거나 잘못된것이 있다면 덧글로 지적바랍니다.)
(C++의 경우 : C++17까지 / Java의 경우 : Java 8+ 까지 를 기준으로 작성하였습니다.)
1. 절대값
일단 이 방식이 매우 안좋은 방식인건 알지만, 단순히 각 String의 함수 개수를 세어보기로 했다.
1) C++
https://en.cppreference.com/w/cpp/string/basic_string
기준, Operator 연산을 제외하고 31개 (+a)의 함수가 존재한다.
2) Java
https://docs.oracle.com/javase/8/docs/api/
기준, 중복을 제외하고 40개 (+a) 메소드가 존재한다.
2. 문자열 접근
특정 위치의 문자열에 접근할 수 있는 함수들이다.
1) C++
(1) front / back : 각 String의 맨 앞 / 맨 뒤 값을 리턴해준다.
(2) begin / end : Iterator로, 각각 String의 맨 앞 / 맨 뒤 '위치'에 접근가능하게 해준다.
(3) data : 맨 앞의 '포인터 값'을 리턴해준다.
(4) at / '[ ]' : 특정 위치의 값을 리턴해준다.
2) Java
(1) charAt : 특정 위치의 값을 리턴해준다.
의외로 이거 하나밖에 안보이는것같지만....
3. 문자열 삽입
문자열에 값을 삽입하는 함수들이다. 생성 및 수정 제외.
1) C++
(1) push_back / pop_back : 문자열의 맨 뒤/맨 앞에 문자를 추가한다.
push_back와 append, '+=' 는 모두 같은 결과를 보여준다.
2) Java
(1) concat(string) : 호출한 String의 뒤에 concat에 인자로 삽입된 문자열을 덧붙인다.
4. 문자열 관리
문자열의 특정 값을 수정하거나, Case를 변경해주는 등의 함수들이다.
1) C++
(1) replace() : 특정 위치의 값을 변경해준다. (C++11부터 가능)
(2) swap(string) : 두 String의 값을 변환해준다.
2) Java
(1) replace(A, B) : A 문자열을 B 문자열로 일괄 변환한다.
(2) toLower/UpperCase() : 각각 전체 문자열을 소문자/대문자로 변환한다.
(3) trim() : 문자열 앞 뒤의 '공백'을 제거한다.
(4) valueOf(Type) : 인자로 주어진 값을 문자열로 변환한다. 모든 기본형(PrimitiveType)에 대응.
5. 문자열 추출
특정 문자열을 자르는 함수들이다.
1) C++
(1) copy(char* arr, size_t length, size_t index) : arr에 index부터 length까지의 문자열을 복사해준다.
(2) substr(size_t index, size_t length(기본값 : Underflow -> INT_MAX)) : 문자열을 index부터 length만큼 리턴한다.
(3) find_last_of() : 인자로 받은 문자열이 '마지막으로 나타난 위치' 이후를 리턴해준다.
2) Java
(1) split(string) : 인자로 들어온 정규 표현식에 따라 문자열을 나누어 리턴
(2) substring(int(, int)) : 인자로 들어온 인덱스부터 새로운 문자열로 리턴
6. 문자열 비교
문자열을 찾거나, 비교에 사용되는 함수들이다
1) C++
(1) find(string) : 인자로 받은 문자열이 '어디에 있는지'를 찾아준다.
2) Java
+ 가 붙은 함수는 'Case'를 구분하지 않는 함수가 존재하는 경우이다.
(1) indexOF(string) : 인자로 받은 문자열이 '어디에 있는지'를 찾아준다.
(2) contains(char) : 인자로 받은 문자열이 존재하는지 아닌지를 찾아준다.
(3) compareTo(string)+ : 인자로 받은 문자열과의 사전식 비교를 실시한다.
(4) equals(string)+ : 인자로 받은 문자열과 동일한 문자열인지 비교한다.
(5) LastIndexOf(string) : 인자로 받은 문자열이 '마지막으로 나타난 위치'를 찾아준다.
(6) matches(string) : 정규 표현식인지 아닌지 체크.
7. 기타 기본사항
1) C++
(1) C++ string은 char* 문자열 배열로 이루어져 있어, 각 항목이 1바이트로 처리된다.
ASCII가 아닌 타 문자 (CP949 등)에 대해서는, 내부적으로 항목 2개를 1개로 치환해서 비교하게 되어, 단순 순차접근을 실시하게 될 시 "깨진 값"을 얻게 된다.
2) Java
(1) Java에서는 char 형 또한 2바이트로 이루어져 있어, UTF-16 데이터를 한 묶음으로 처리가 가능하다.
C++ 에서처럼 순차접근 했다고 깨지는 불상사는 안 일어난다 (...)
뭔가 단순 비교를 했을때, Java의 경우 변환, 비교 함수 등이 많이 갖춰져 있었고, C++의 경우엔 의외로 삽입쪽이 Java보다 풍성하게 되었음을 알 수 있었다.
실제로는 7번 항목의 문자열 처리방식때문에 문자열을 많이 다룰시 C++보다는 Java를 선택하게 되고, 요즘은 단순 문자열 비교 등에 경우엔 Python 등 다른 생산성 높은 언어로 옮겨가는 추세로 보인다.
간단히 레퍼런스 자료만 보며 작성한것이므로, 다른 점이나 문제가 있다면 알려주시면 반영하겠습니다.
'프로그래밍' 카테고리의 다른 글
내가 급해서 쓰는 컴퓨터공학 이론 간단 요약 (0) | 2020.06.18 |
---|---|
C++ String vs Java String 비교 : 2. Java String에 대한 간략한 설명. (0) | 2020.04.29 |
C++ String vs Java String 비교 : 1. C++ String에 대한 간략한 설명. (0) | 2020.04.29 |
Epsilon Delta (0) | 2020.04.19 |
기록해둘것 (0) | 2020.01.10 |