자료구조
- 참조 자료형으로 문자를 여러 개 담을 수 있는 구조
- 비트 단위로 저장하므로 문자를 직접 저장할 수 없다, 따라서 정수의 형태로 문자와 짝지어진 수를 저장
- 000000 → 'A'
- 000001 → 'B'
- 코드 체계가 달라 발생하는 혼동을 막기 위해 생긴 것이 ASCII 코드
- ASCII 코드는 제어 문자들과 공백을 비롯한 출력 가능 문자들로 이루어져있다.
- 코드문을 전부 외워야 하는 것이 아니라, 할당하여 정수를 확인해도 된다.
→ int a = 'A'
로 확인은 가능하다. 
- 확장 아스키 코드로 좀 더 다양한 문자를 남길 수 있지만, 표준이 아니기 때문에 별도의 기기나 확장자로 변경하게 되면 사용이 불가능 할 수도 있다.
- 인텔리제이에서는 이모지 또한 표시가 되지만, 이클립스에서는 불가능한 것을 생각하면 될 것 같다.
- 아스키코드로 처리가 되지 않는 자국의 체계 코드를 마련하였다.
- 다만, 정보 해석이 어렵기 때문에, 다국어 처리를 위해 만든 표준. → 유니코드
- 유니코드는 Character Set으로 분류가 된다.
- 바이트 순서에 대해 표준화하지 못해서, 파일의 유니코드를 확인 후 외부 인코딩이 필요하다.
- UTF : Unicode Transformation Format
- 메모리 배치 예

- value는 실제 문자를 담고 있는 배열의 주소를 참조하게 만들어 놓았다.
문자열
- 일련의 문자를 담을 수 있는 자료구조
- Java에서는 String class로 구현되어 있다. (가변길이 문자열)
- 문자열 선언 방법
- 리터럴 표기 방식 :
String a = "Hello"
- new 연산자 사용 방식 :
String b = new String("Hello")
- 리터럴 표기 방식을 사용하게 되면, 힙 메모리 내부에서 문자열 상수풀에 저장하게 되고, 그것을 꺼내오는 것이기 때문에 동일한 문자라면 같은 주소값을 사용
==
은 주소값 비교 연산자
- 문자열의 값을 비교하는 경우는 반드시
equals
메소드를 사용해야 한다.
public class String_문자열 {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str1 == str2); //true
System.out.println(str3 == str4); //false
System.out.println(str3.equals(str4)); //true
}
}
- 대표 메소드
replace("A", "a")
: 문자열 치환 A를 찾아 a로 만들어준다.
split("B")
: B를9 기준 값으로 문자열을 나눠준다.
substring(4)
: 4번 앞까지 자른 문자열
문자열 뒤집기
- 새로운 배열을 만들어 뒤부터 사용하는 방법
- 자기 문자열을 사용하는 경우, swap을 위한 임시 변수를 만들어서 반복 수행
- StringBuffer 클래스의 reverse() 메소드를 이요하면 된다.
public class String_문자열 {
public static void main(String[] args) {
// 문자열 재배치
// String 자체로 문자열 읽기는 가능하지만, 특정 위치에 있는 문자 쓰기는 안 된다.
String str = new String("algorithm");
char[] chararr = new char[str.length()];
//1. 새로운 배열을 만들어 뒤부터 사용하는 방법
// 정방향 담기
for(int i = 0; i < str.length(); i++) {
chararr[i] = str.charAt(i);
}
// 역방향 담기
char[] nextArr = new char[chararr.length];
for(int i = 0; i < chararr.length; i++) {
nextArr[(chararr.length -1) - i] = chararr[i];
}
// 2. 자기 문자열을 사용하는 경우, swap을 위한 임시 변수를 만들어서 반복 수행
char[] chararr2 = str.toCharArray();
String nextStr = "";
for(int i = chararr2.length - 1; i >= 0; i--) {
nextStr += chararr2[i];
}
System.out.println(nextStr); // mhtirogla
// 2-1
for(int i = 0; i < chararr2.length/2; i++) {
char tmp = chararr2[i];
chararr2[i] = chararr2[(chararr2.length - 1) -i];
chararr2[(chararr2.length - 1) - i] = tmp;
System.out.println(chararr2); // mhtirogla
}
}
}
문자열 사용
- 숫자로만 이루어진 문자열을 정수로 변경
public class atoi_itoa {
public static void main(String[] args) {
String strnum = "1234";
int num = Integer.parseInt(strnum);
int result = atoi(strnum);
System.out.println(result);
}
static int atoi (String str) {
int num = 0;
for(int i = 0; i<str.length(); i++) {
// 문자가 정수로 표현할 수 있는 것인지 확인
if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
// num에 *10 을 하여서, 순차적으로 값을 하나씩 채워서 넣어주는 것.
num = (num * 10) + (str.charAt(i) - '0');
} else {
System.out.println("제대로 된 입력이 들어오지 않았습니다.");
}
}
return num;
}
}
- 정수를 문자열로 변경
public class atoi_itoa {
public static void main(String[] args) {
// 숫자를 문자로 변경하는 것
int intvar = 324;
String strvar = String.valueOf(intvar);
String strvar2 = intvar+ "";
String strvar3 = itoa(intvar);
System.out.println(strvar);
System.out.println(strvar2);
System.out.println(strvar3);
}
static String itoa(int intvar) {
String str = "";
while(intvar != 0) {
int temp = intvar % 10;
str = temp + str;
intvar /= 10;
}
return str;
}
패턴 매칭
A. 고지식한 알고리즘
- 본문 문자열을 처음부터 끝까지 차례대로 순회하면서 패턴 내의 문자들을 일일이 비교하는 방식으로 동작

- O(n*m) 만큼 걸리게 된다.
public class patternmatching {
public static void main(String[] args) {
String text = "this is a book";
String patter = "is";
System.out.println(brueforce(text, patter));
}
static int brueforce(String text, String pattern)
{
int ti = 0;
int pi = 0;
while(ti < text.length() && pi < pattern.length()) {
if (text.charAt(ti) != pattern.charAt(pi)) {
ti -= pi;
pi = -1;
}
ti++;
pi++;
}
if(pi == pattern.length()) {
return ti - pi;
} else {
return 0;
}
}
}
B. 보이어 무어 알고리즘
- 오른쪽에서 왼쪽으로 비교
- 패턴에 오른쪽 끝에 있는 문자가 불일치하고, 이 문자가 패턴 내에 존재하지 않는 경우, 패턴 길이만큼 이동한다.

- 불일치 문자가 중복되는 경우에 대해서도 생각을 해봐야 한다.