티스토리 뷰

한화시스템/백엔드

[BE] JAVA_API_String

jjam-mo 2024. 7. 19. 00:14

1. String 클래스 개요

1-1. String 클래스란?

💡 문자열을 나타내는 자료형
문자열 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 메소드가 포함되어 있다.
String 인스턴스는 한 번 생성되면 그 값을 읽기만 가능하고 변경할 수는 없다. 이러한 객체를 불변 객체(immutable object) 라고 한다.

즉, 자바에서 덧셈(+) 연산자를 이용하여 문자열 결합을 하는 경우
기존 문자열이 변경되는 것이 아닌 문자열이 합쳐진 새로운 String 인스턴스가 생성.

1-2. String 주요 메소드

package com.ohgiraffers.section02.string;

public class Application1 {
    public static void main(String[] args) {

        /* 수업목표. String 클래스의 자주 사용하는 메소드에 대해 숙지하고 응용할 수 있다. */
        /* 필기. 1. charAt(): 해당 문자열의 특정 인덱스에 해당하는 문자를 반환 */
        String str1 = "apple";

        for (int i = 0; i < str1.length(); i++) {       // 0 ~ 4 / length() -> 메소드
            System.out.println("charAt(" + i + ") = " + str1.charAt(i));
        }

        /* 필기. compareTo(): 인자로 전달된 문자열과 사전 순으로 비교 */   // 첫글자만 비교?? no! 같으면 다음 글자 비교
        String str2 = "java";
        String str3 = "java";
        String str4 = "JAVA";
        String str5 = "mariaDB";
//        String str6 = "mariaDBaa";

        System.out.println(str2.compareTo(str3));   // 0
        System.out.println("(int)'j': " +(int)'j' + ", (int)'J': " + (int)'J'
        + ", 차이는 " + ((int)'j' - (int)'J'));
        System.out.println(str2.compareTo(str4));   // 32
        System.out.println(str4.compareTo(str2));   // -32
        System.out.println(str2.compareTo(str5));   // -3
        System.out.println(str5.compareTo(str2));   // 3
//        System.out.println(str5.compareTo(str6));   // 길이 차이 리턴

        /* 필기. concat(); 문자열에 인자로 전달된 문자열을 합쳐서 새로운 문자열 반환 */
        System.out.println("concat(): " + str2.concat(str5));

        /* 필기. indexOf(): 문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환 */
        String indexOf = "java mariaDB";
        System.out.println("indexOf('a'); " + indexOf.indexOf('a'));
        System.out.println("indexOf('z'); " + indexOf.indexOf('z'));    // 없을 경우 -1

        /* 필기. trim(): 문자열의 앞 뒤에 공백을 제거한 문자열을 반환한다. */
        String trimStr = "    java     ";
        System.out.println("trimStr: #" + trimStr + "#");
        System.out.println("trim(): #" + trimStr.trim() + "#");
//        System.out.println("trim(): #" + trimStr.replaceFirst("^\\s+","") + "#"); // 왼쪽만 지우기

        /* 필기.
        *   toLowerCase(): 모든 문자를 소문자로 변환
        *   toUpperCase(): 모든 문자를 대문자로 변환
        *  */
        String caseStr = "javamariaDB";

        System.out.println("toLowerCase(): " + caseStr.toLowerCase());
        System.out.println("toUpperCase(): " + caseStr.toUpperCase());
        System.out.println("caseStr: " + caseStr);

        /* 필기. substring(): 문자열의 일부분을 잘라내어 새로운 문자열을 반환 */
        String javamariaDB = "javamariaDB";

        System.out.println("substring(3, 6): " + javamariaDB.substring(3, 6));
        System.out.println("substring(3): " + javamariaDB.substring(3));
        System.out.println("javamariaDB: " + javamariaDB);

        /* 필기. replace(): 문자열에서 대체할 문자열로 기존 문자열을 변경해서 봔환 */
        System.out.println("replace(): " + javamariaDB.replace("java", "python"));
        System.out.println("javamariaDB: " + javamariaDB);

        /* 필기. length(): 문자열의 길이를 정수형으로 반환 */
        System.out.println("length(): " + javamariaDB.length());
        System.out.println("빈 문자열 길이: " + "".length());

        /* 필기. isEmpth(): 문자열의 길이가 0이면 true를 반환, 아니면 false를 반환(null과 다르다.) */
        System.out.println("isEmpty(): " + "".isEmpty());
        System.out.println("isEmpty(): " + "abc".isEmpty());

    }
}

// 실행 결과
charAt(0) = a
charAt(1) = p
charAt(2) = p
charAt(3) = l
charAt(4) = e

0
(int)'j': 106, (int)'J': 74, 차이는 32
32
-32
-3
3

concat(): javamariaDB

indexOf('a'); 1
indexOf('z'); -1

trimStr: #    java     #
trim(): #java#

toLowerCase(): javamariadb
toUpperCase(): JAVAMARIADB
caseStr: javamariaDB

substring(3, 6): ama
substring(3): amariaDB
javamariaDB: javamariaDB

replace(): pythonmariaDB
javamariaDB: javamariaDB

length(): 11
빈 문자열 길이: 0

isEmpty(): true
isEmpty(): false
package com.ohgiraffers.section02.string;

public class Application2 {
    public static void main(String[] args) {


        /* 수업목표. 문자열 객체를 생성하는 다양한 방법을 숙지하고 인스턴스가 생성되는 방식을 이해할 수 있다. */
        /* 필기.
        *   문자열 객체를 만드는 방법
        *   1. "" 리터럴 형태: 동일한 값을 가지는 인스턴스(동등(h, e) 객체)를 단일 인스턴스로 관리한다.
        *                   (singleton 개념, 상수풀(constant pool) 활용)
        *   2. new String("") 형태: 매번 새로운 인스턴스를 생성한다.(주소값이 매번 다름)
        *  */
        String str1 = "java";
        String str2 = "java";
        String str3 = new String("java");
        String str4 = new String("java");

        System.out.println("str1 == str2: " + (str1 == str2));  // true (주소값 같다. 같은 객체) / 이거 쓰지마!
        System.out.println("str2 == str3: " + (str2 == str3));  // false
        System.out.println("str3 == str4: " + (str3 == str4));  // false

        /* 설명. equals와 hashCode 확인 */
        System.out.println("str1.equals(str3): " + str1.equals(str3));
        System.out.println("str1.hashCode() == str3.hashCode(): " + (str1.hashCode() == str3.hashCode()));
        // 오버라이딩 잘해놨네?????어디에 오버라이딩 함????String에 대한 hashCode()

        /* 설명. 문자열 비교는(==)쓰지 말고 (.equals()) 사용하자. */

        /* 설명. 문자열은 불변객체(immutable object)로 변화를 주면 항상 새로운 객체(인스턴스)를 생성한다. */
        String str = "apple";
        System.out.println(System.identityHashCode(str));
        str += ", banana";
        System.out.println(System.identityHashCode(str));
        System.out.println("fruit: " + str);
    }
}

// 실행 결과
str1 == str2: true
str2 == str3: false
str3 == str4: false

str1.equals(str3): true
str1.hashCode() == str3.hashCode(): true

414493378
205029188
fruit: apple, banana
package com.ohgiraffers.section02.string;

import java.util.Arrays;
import java.util.StringTokenizer;

public class Application3 {
    public static void main(String[] args) {

        /* 수업목표. 문자열 분리에 대해 이해하고 적용할 수 있다. */
        /* 필기.
        *   문자열을 특정 구분자로하여 분리한 문자열을 반환하는 기능을 한다.
        *   1. split(): 정규표현식을 이용하여 비정형화된 문자열을 분리한다.
        *               (String을 파싱하여 String[]로 만들어 주고 []를 활용하여 구분자들을 넣을 수 있다.)
        *   2. StringTokenizer: 문자열의 모든 문자들을 구분자를 활용하여 문자열이 분리된다.
        *                       (StirngTokenizer가 제공하는 메소드를 활용해야 한다.)
        * */

        /* 설명. 1. split() 활용 */
        String emp1 = "100/홍길동/서울/영업부";
        String emp2 = "200/유관순//총무부";
        String emp3 = "300/이순신?경기도/";       // 마지막 하나는 결과를 보니 한 칸으로 안쳐주는구나!

        String[] empArr1 = emp1.split("/");     // split 구현해보기(반복문, if 사용)
        String[] empArr2 = emp2.split("/");
        String[] empArr3 = emp3.split("[/?]");  // 정규표현식 형태로 여러 개 넣으면 된다.

        System.out.println(Arrays.toString(empArr1));
        System.out.println(Arrays.toString(empArr2));
        System.out.println(Arrays.toString(empArr3));

        /* 설명. 2. StringTokenizer 활용 */
        String colors = "red, yellow, green, purple? blue";
        StringTokenizer colorStringTokenizer = new StringTokenizer(colors, ", ?");
        while(colorStringTokenizer.hasMoreTokens()) {
//            System.out.println(colorStringTokenizer.nextToken());   // nextToken은 1. 값을 반환 2. 커서 옆으로 이동

            String token = colorStringTokenizer.nextToken();        // nextToken은 반복문에서 한번만 나와야한다. 따라서 여러번 돌릴려면 이렇게 만들어줘야한다.
            System.out.println(token);
            System.out.println(token);
        }
    }
}

// 실행 결과
[100, 홍길동, 서울, 영업부]
[200, 유관순, , 총무부]
[300, 이순신, 경기도]

red
red
yellow
yellow
green
green
purple
purple
blue
blue
package com.ohgiraffers.section02.string;

public class Application4 {
    public static void main(String[] args) {

        /* 수업목표. 이스케이프(escape)문자에 대해 이해하고 적용할 수 있다. */
        /* 필기.
        *   이스케이프(escape) 문자
        *    문자열 내에서 사용하는 특수기능을 위한 문자이다.
        *
        * 필기.
        *  \n: 개행
        *  \t: 탭
        *  \': 작은 따옴표
        *  \": 큰 따옴표
        *  \\: 역슬래쉬 표기
        * */
        System.out.println("안녕하세요.\n저는 홍길동 입니다.");
        System.out.println("안녕하세요.\t저는 홍길동 입니다.");  // 탭은 격자무늬를 기준으로 다음 구간으로 가는 것.

        System.out.println("안녕하세요. 저는 '홍길동' 입니다."); // 구분이 되서 괜찮다.
        System.out.println('\'');
        System.out.println("안녕하세요. 저는 \"홍길동\" 입니다.");

        System.out.println("역슬래쉬(\\)입니다.");

        /* 설명. 이스케이프 문자 외에도 printf 관련 문법도 있으니 참고하자. */
        /* 설명. %.2f: 소수점 둘째자리까지 실수를 표현하며 셋째자리에서 반올림, %d: 정수형 표현 */
        System.out.printf("원주율은 %.2f입니다. 우린 %d로 하죠", 2.146592, 3);
    }
}

// 실행 결과
안녕하세요.
저는 홍길동 입니다.
안녕하세요.	저는 홍길동 입니다.
안녕하세요. 저는 '홍길동' 입니다.
'
안녕하세요. 저는 "홍길동" 입니다.
역슬래쉬(\)입니다.
원주율은 2.15입니다. 우린 3로 하죠

 

  • 두 번째(str2) 만들어질 때 리터럴이므로 (문자열 동등 비교하는)constant pool에서 비교하다 원래 있던 것이 있다.
    • 동등 비교(hashCode() → 같은 값, equal() → true) 후 얕은 복사가 된다.
    • 이유는? 효율성
  • 3,4 번은 각자 객체 생성 

'한화시스템 > 백엔드' 카테고리의 다른 글

[BE] JAVA_API_Wrapper  (1) 2024.07.19
[BE] JAVA_API_StringBuilder & StringBuffer  (1) 2024.07.19
[BE] JAVA_API_Object  (0) 2024.07.19
[BE] JAVA_인터페이스  (0) 2024.07.18
[BE] JAVA_추상 클래스  (0) 2024.07.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함