본문 바로가기
뒷북 정리 (국비 교육)/java

[Java] step20. String

by 규글 2022. 5. 11.

step20. String

- 01

		String name1 = "김구라";
		String name2 = "김구라";
		String name3 = new String("김구라");
		String name4 = new String("김구라");
		// " 로 만든 문자열의 참조값 비교
		boolean result1 = name1 == name2;
		// " 로 만든 문자열과 new로 만든 참조값 비교
		boolean result2 = name1 == name3;
		// new 로 만든 문자열의 참조값 비교
		boolean result3 = name3 == name4;
		
		boolean result4 = name1.equals(name2);
		boolean result5 = name1.equals(name3);
		boolean result6 = name3.equals(name4);

 위 예시에 대한 결과이다. 우선 큰 따옴표 " " 로 만든 string은 서로 같은 친구이다. 하지만 new를 이용해서 String 객체로 만든 친구와 큰 따옴표로 만든 친구는 서로 다르다. 하지만 new를 이용해서 String 객체로 만든 친구들끼리는 또 같다. 같은 내용인데도 불구하고 이렇게 비교 연산의 결과가 다르다. 내용은 같아도, 해당 String type variable이 가진 참조값이 다를 수 있기 때문이다. 큰 따옴표로 만든 친구는 같은 참조값을 가지지만, new 로 만든 것과는 다르고, 또 다른 new로 만든 것과도 다르다.

 그래서 string의 경우 동등 비교 연산자를 사용하면 안되고 대신에 method를 이용하는데, 그것이 바로 equals( ) method이다.

 

- 02

		String str = "abcde12345";
		// 4번째 index에 있는 문자 얻어오기
		char a = str.charAt(4);
		// 문자열 합치기
		String b = str.concat("fghij");
		// 문자열이 포함되어 있는지 여부 얻어내기
		boolean c =str.contains("123");
		// 해당 문자열이 몇 번째 index에 있는지 확인 (없으면 -1)
		int d = str.indexOf("김구라");
		// 문자열의 길이 얻어내기
		int e = str.length();
		String line = "김구라/해골/원숭이/주뎅이/덩어리";
		String[] f = line.split("/");
		
		String line2 = "김구라      해골    원숭이  주뎅이              덩어리";
		String[] g = line2.split("[ ]+ ");
		
		String line3 = "김구라abcd    ef해골   as    bd4 원숭이    주뎅이    mdfks   덩어리";
		String[] result3 = line3.split("[a-z0-9 ]+");
		
		String line4 = "김구라바보,해골바보,원숭이바보";
		String result4 = line4.replaceAll("바보", "천재");
		
		// 정규 표현식으로 특수문자 제거
		String line5 = "abc    가나  123 efg  @!$ def 456";
		String result5 = line5.replaceAll("[^A-Za-z0-9]+", " ");
		/*
		 * in javascript => /[^\w]/;
		 * in java => "[^\\w]" \ 하나 당 두 개씩
		 *  - java에서 정규 표현식을 작성할 때 역슬레시를 하나 넣고싶으면 두 개씩 쓰면 된다.
		 */
		String result6 = line5.replaceAll("[^w]", "");
		// not의 의미는 그냥 대문자
		String result7 = line5.replaceAll("[\\W]", "");

 또다른 String type method를 알아본다. 우선 charAt(n)은 문자열의 n번 index에 해당하는 문자를 얻어온다. concat("xxx")은 기존 문자열에 이어서 붙여준다. contains("xxx")은 해당 문자열이 포함되어 있는지 여부를 boolean type으로 return 해준다. indexOf("xxx")는 해당 문자열이 몇 번째 index에 있는지를 return 해준다. 해당 문자열이 있다면 문자열의 가장 앞에 해당하는 index를 return 해주고, 없으면 -1을 return 해준다. length( )는 문자열의 길이를 알 수 있다. split("x")은 해당 문자열을 "x" 로 구분해서 String[ ] (스트링 배열) type으로 return 해준다. split( ) 에 들어가는 문자열은 정규 표현식을 구분하기 때문에 정규 표현식으로 작성해도 된다. replaceAll("xxx", "yyy")은 문자열의 "xxx" 를 모두 "yyy" 로 바꾼 결과로 return 해준다.

 정규 표현식은 이쪽을 참고한다.[각주:1] 다른 점이 있다면 javascript에서 역슬래쉬 \를 하나씩 쓰던 것을 두 개씩 작성해주면 된다는 것이다.

 

- 03

		Scanner scan = new Scanner(System.in);
		System.out.print("아이디 입력 (영문자로 시작, 특수문자 허용하지 않음):");
		String line = scan.nextLine();
		String reg = "^[a-zA-Z][\\w]+$";
		boolean beMatch = line.matches(reg);
		if(beMatch) {
			System.out.println("제대로 입력했군요");
		} else {
			System.out.println("아이디를 확인하세요");
		}

 mathces("regex")는 문자열이 해당 정규 표현식에 적합한지를 boolean type으로 return 해주는 method이다. "regex" 자리에는 정규 표현식을 작성해서 전달해준다.

 

- 04

		String line = "2020-05-18 12:10";
		String reg = "[0-9]+"; // "[\\d]+" 도 된다
		// 정규 표현식을 이용해서 Pattern 객체를 얻어낸다.
		Pattern pat = Pattern.compile(reg);
		// Pattern 객체의 matcher() method를 이용해서 Matcher 객체를 얻어낸다.
		Matcher mat = pat.matcher(line);
		while(mat.find()) {
			String result = mat.group();
			System.out.println(result);
		}
		System.out.println("main method가 종료되었습니다.");

 Pattern type 객체에는 compile( ), matcher( ) method가 있고, compile( ) 의 결과는 Pattern으로 받고 matcher( ) 의 결과는 Matcher로 받아야 한다. 먼저 compile( ) 를 살펴보면 전달해준 정규 표현식을 pattern 으로 compile 한다고 적혀있다. 그리고 matcher( ) 는 그렇게 pattern이 된 친구에 대해 주어진 값이 일치하는 친구들을 matcher로 생성한다.

 이어지는 while 문에서 사용한 Matcher 객체의 find( ) 는 input sequence 중에 matcher의 pattern과 일치하는 다음 sequence가 존재하는 경우에만 true를 return하고 아닌 경우는 false를 return 한다. 그리고 group( ) 은 match 되는 subsequence를 return 해준다.

 

- 05

		Scanner scan=new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String line=scan.nextLine();
		// 문자열 양쪽의 쓸모없는 공백 제거
		String result=line.trim();
		
		System.out.println(result);

 trim( ) 은 문자열 양쪽의 공백을 제거해준다. 중간의 공백은 띄어쓰기로 인정해준다.

댓글