문자열

zee-chive·2024년 8월 1일
0

APS

목록 보기
4/23

자료구조

  • 참조 자료형으로 문자를 여러 개 담을 수 있는 구조
  • 비트 단위로 저장하므로 문자를 직접 저장할 수 없다, 따라서 정수의 형태로 문자와 짝지어진 수를 저장
    • 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번 앞까지 자른 문자열



문자열 뒤집기

  1. 새로운 배열을 만들어 뒤부터 사용하는 방법
  2. 자기 문자열을 사용하는 경우, swap을 위한 임시 변수를 만들어서 반복 수행
  3. 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
		}
	}
}



문자열 사용

  1. 숫자로만 이루어진 문자열을 정수로 변경
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;
	}
}
  1. 정수를 문자열로 변경
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. 보이어 무어 알고리즘

  • 오른쪽에서 왼쪽으로 비교
  • 패턴에 오른쪽 끝에 있는 문자가 불일치하고, 이 문자가 패턴 내에 존재하지 않는 경우, 패턴 길이만큼 이동한다.
  • 불일치 문자가 중복되는 경우에 대해서도 생각을 해봐야 한다.
profile
누가 봐도 읽기 쉬운 글이 최고의 글이다.

0개의 댓글

관련 채용 정보