728x90
문자열
문자열의 분류
java 클래스에서 String 클래스에 대한 메모리 배치 예
- 그림에서 보이듯, java.lang.String 클래스에는 기본적인 메타 데이터 외에도 네 가지 필드들이 포함되어 있는데, hash값 (hash), 문자열의 길이 (count), 문자열 데이터의 시작점 (offset), 그리고 실제 문자열 배열에 대한 참조 (value) 이다
C언어에서 문자열 처리
- 문자열은 문자들의 배열 형태로 구현된 응용 자료형
- 문자배열에 문자열을 저장할 때는 항상 마지막에 끝을 표시하는 널문자(
\0
)을 넣어줘야 한다. char ary[] = {'a', 'b', 'c', '\0'}; // 또는 char aryp[="abc";
- 문자열 처리에 필요한 연산을 함수 형태로 제공한다
strlen(), strcpy(), strcmp(), ...
Java(객체지향 언어)에서의 문자열 처리
- 문자열 데이터를 저장, 처리해주는 클래스를 제공한다
- String 클래스를 사용한다
String str = "abc"; // 또는 String str = new String("abc");
- 문자열 처리에 필요한 연산을 연산자, 메소드 형태로 제공한다
+
,length()
,replace()
,split()
,substring()
, …
C와 Java의 String 처리의 기본적인 차이점
- C는 아스키 코드로 저장한다
- java는 유니코드 (UTF16, 2byte)로 저장한다
- 파이썬은 유니코드 (UTF8)로 저장
C
char * name = "홍길동";
int count = strlen(name);
printf("%d", count);
6 출력
Java
String name = "홍길동";
System.out.println(name.length());
Python
name = "홍길동"
print(len(name))
3 출력
3 출력
문자열 뒤집기
- 자기 문자열에서 뒤집는 방법이 있고 새로운 빈 문자열을 만들어 소스의 뒤에서부터 읽어서 타겟에 쓰는 방법이 있겠다
- 자기 문자열을 이용할 경우는 swap을 위한 임시 변수가 필요하며 반복 수행을 문자열 길이의 반만을 수행해야 한다
문자열 비교
- c:
strcmp()
함수 제공 - Java에서는
equals()
메소드 제공- 문자열 비교에서
==
연산은 메모리 참조가 같은지를 묻는 것
- 문자열 비교에서
- python에서는
==
연산자와is
연산자를 제공한다==
연산자는 내부적으로 특수 메서드__eq__()
를 호출
String s1 = "Hi";
String s2 = "Hello";
if(s1.equals(s2)==true) {
System.out.println("Equal");
} else if (s1.equals(s2)==false) {
System.out.println("Not Equal");
}
문자열 숫자를 정수형으로 반환
- c 언어에서는
atoi()
함수를 제공한다. 역 함수로는itoa()
가 있다. - java에서는 숫자 클래스의
parse
메소드를 제공한다역함수로는 toString() 메소드를 제공한다 - ex) Integer.parseInt(String)
- python에서는 숫자와 문자 변환 함수를 제공한다
- ex)
int(”123”)
,float(”3.14”)
,str(123)
,repr(123)
atoi()
int atoi(char[] charArr) {
int value = 0;
int digit;
for (int i=0; i<charArr.length; i++) {
if (charArr[i] >= '0' && charArr[i] <= '9')
digit = charArr[i] - '0';
else break;
value = (value*10) + digit;
}
return value;
}
문자열 매칭 알고리즘 비교
- 찾고자 하는 문자열 패턴의 길이 m, 총 문자열 길이 n
- 고지식한 패턴 알고리즘: 수행시간 O(mn)
- 카프-라빈 알고리즘: 수행시간 Θ(n)
- KMP 알고리즘: 수행시간 Θ(n)
- 보이어-무어 알고리즘
- 앞의 두 매칭 알고리즘들의 공통점은 텍스트 문자열의 문자를 적어도 한 번씩 훑는다는 것이다. 따라서 최선의 경우에도 Ω(n)
- 보이어-무어 알고리즘은 텍스트 문자를 다 보지 않아도 된다
- 발상의 전환: 패턴의 오른쪽부터 비교한다
- 최악의 경우 수행시간: O(mn)
- 입력에 따라 다르지만 일반적으로 Θ(n)보다 시간이 덜 든다
문자열 암호화
시저 암호(Caesar dipher)
- 줄리어스 시저가 사용했다고 하는 암호이다
- 시저는 기원전 100년 경에 로마에서 활약했던 장군이었다
- 시저 암호에서는 평문에서 사용되고 있는 알파벳을 일정한 문자 수만큼 [평행이동] 시킴으로써 암호화를 행한다
1만큼 평행했다는 카이사르 암호화의 예
- 1만큼 평행했을 때 1을 키값이라 한다
- 수신자 이외의 사람(키가 1이라는 사실을 모르는 사람)이 암호문을
- 다른 정보 없이도 원본 메시지를 맞힐 수 있을까?
- 다시 말해, 시저 암호를 해독할 수 없을까?
728x90
'Java > 클래스' 카테고리의 다른 글
Java StringBuilder (0) | 2023.08.17 |
---|