[JAVA 복습] 자바의 자료형과 연산자 - 문자열 자료형

seonjeong·2023년 10월 24일
0

Java

목록 보기
25/26
post-thumbnail

❤️ 문자열 자료형 기초

String : 문자열 자료형

  • 0~다수의 문자들로 구성
  • ""로 둘러쌈
  • 원시 자료형이 아닌 참조 자료형이지만 원시값과 유사하게 사용될 수 있음
  • 클래스의 인스턴스
//  리터럴 방식
String str1 = "Hello World!";

// 빈 문자열 가능
String str2 = "";

//  인스턴스 생성 방식
String str3 = new String("안녕하세요.");
  • == 연산자 : 비교하는 두 대상의 주소값을 비교. 동일한 객체인지를 판별
  • equals 메서드 : 비교하는 두 대상의 값을 비교
String hl1 = "Hello";
String hl2 = "Hello";
String wld = "World";

boolean bool1 = hl1 == hl2;  // true
boolean bool2 = hl1 == wld;  // false

String hl3 = new String("Hello");
String hl4 = new String("Hello");
String hl5 = hl4;

boolean bool3 = hl3 == hl4;  // false -> 참조하는 주소값이 각각 다르므로 false가 나옴

boolean bool4 = hl1.equals(hl2);  // true
boolean bool5 = hl1.equals(hl3);  // true
boolean bool6 = hl3.equals(hl4);  // true
boolean bool7 = wld.equals(hl2);  // false

//  같은 곳을 참조하는 인스턴스들
boolean bool8 = hl4 == hl5;  // true
  • 리터럴로 생성시, String constant pool이라는 곳에 중복없이 저장됨(같은 문자열이면 같은 것을 가리킴)
  • 객체 인스턴스로 생성시, 매 번 새로 생성되어 각각 자리를 차지함

+ 연산자

  • 문자열을 이어붙임
String str1 = "안녕";
String str2 = "하세요.";

String str3 = str1 + str2;  // "안녕하세요."

타 자료형간 변환

String.valueOf();  // 값이 그대로 문자열로 변환됨
  • 예시
String str1 = String.valueOf(true);  // "true"
String str2 = String.valueOf(false);  // "false"
String str3 = String.valueOf(123);  // "123"
String str4 = String.valueOf(3.14f);  // "3.14"
String str5 = String.valueOf('가');  // "가"
  • 문자열을 정수 자료형으로 변환하기
String str123 = "123";

byte bytNum = Byte.parseByte(str123);  // 123
short srtNum = Short.parseShort(str123);  // 123
int intNum = Integer.parseInt(str123);  // 123
long lngNum = Long.parseLong(str123);  // 123
  • 대소문자 무관 'true'일 때 true반환
boolean bool1 = Boolean.parseBoolean("TRUE");
boolean bool2 = Boolean.parseBoolean("true");
boolean bool3 = Boolean.parseBoolean("T");

이스케이프 표(escape sequence)

이스케이프 표현대체
\"큰따옴표
\’작은따옴표
\n줄바꿈
\t
\\백슬래시 하나
String str = "Hello \"World\"";  // Hello "World"

❤️ 문자열의 메소드들

문자열은 불변(immutable)

  • 문자열 스스로를 변경하는 메소드 ❌
  • 새 문자열 또는 다른 값을 반환

문자열 길이 반환 : length

String str = "Hello";

int len = str.length(); // 5

빈 문자열 여부 : isEmpty, isBlank

  • isEmpty : 문자열의 길이가 0인지 여부 -> isBlack보다 엄격
  • isBlank : 공백(white space)을 제외한 문자열의 길이가 0인지 여부
String str1 = "";
String str2 = " \t\n";

int int1 = str1.length();  // 0
int int2 = str2.length();  // 3

boolean bool1 = str1.isEmpty();  // true
boolean bool2 = str2.isEmpty();  // false

boolean bool3 = str1.isBlank();  // true
boolean bool4 = str2.isBlank();  // true

트리밍 : trim

  • trim : 앞 뒤의 공백 제거
String str3 = "\t 안 녕 하 세 요. \n"

String str4 = str3.trim(); // "안 녕 하 세 요."

문자 반환 : charAt

  • charAt : ~번 째 문자 반환
String str1 = "어떻게 이별까지 사랑하겠어.";

char ch1 = str1.charAt(0);  // '어'
char ch2 = str1.charAt(4);  // '이'

//  ⭐️ 마지막 문자 얻기
char ch3 = str1.charAt(str1.length() - 1); // .

문자(열)의 위치 반환 : indexOf, lastIndexOf

  • indexOf : 일치하는 첫 문자열의 위치 앞에서부터 카운트해서 int로 반환
  • lastIndexOf : 일치하는 마지막 문자열의 위치 앞에서부터 카운트해서 int로 반환
String str2 = "얄리 얄리 얄라셩 얄라리 얄라";

// 두 번째 인자 : ~번째 이후/이전부터 셈
int int1 = str2.indexOf('얄');  // 0
int int2 = str2.indexOf('얄', 4);  // 6

int  int3 = str2.indexOf("얄라");  // 6
int  int4 = str2.lastIndexOf("얄라");  // 14
int  int5 = str2.lastIndexOf("얄라", 12);  // 10

// 포함되지 않은 문자는 -1 반환
int int6 = str2.indexOf('욜');  // -1

값 동일 여부 확인 : equals

// 대소문자 구분하여 비교
String str_a1 = "Hello World";
String str_a2 = new String("Hello World");
String str_a3 = "HELLO WORLD";

boolean bool_a0 = str_a1 == str_a2;  // false ⚠️ 문자열은 이렇게 비교하지 말 것!

boolean bool_a1 = str_a1.equals(str_a2);  // true
boolean bool_a2 = str_a1.equals(str_a3);  // false

// equalsIgnoreCase : 대소문자 구분하지 않고 비교
boolean bool_a3 = str_a1.equalsIgnoreCase(str_a3);  // true
boolean bool_a4 = str_a2.equalsIgnoreCase(str_a3);  // true

포함 여부 확인 : contains, startWith, endsWith

  • contains : 포함 여부
  • startWith : (주어진 위치에서) 해당 문자열로 시작 여부
  • endsWith : 해당 문자열로 끝남 여부
String str_b1 = "옛날에 호랑이가 한 마리 살았어요.";

boolean bool_b1 = str_b1.contains("호랑이");  // true
boolean bool_b2 = str_b1.contains("나무꾼");  // false

boolean bool_b3 = str_b1.startsWith("옛날에");  // true
boolean bool_b4 = str_b1.startsWith("호랑이");   // false
boolean bool_b5 = str_b1.startsWith("호랑이", 4);  // true

boolean bool_b6 = str_b1.endsWith("살았어요.");  // true
boolean bool_b7 = str_b1.endsWith("호랑이");  // false

정규표현식 일치 여부 확인

String emailRegex = "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$";

String str_c1 = "judyan@judyan.kr";
String str_c2 = "judyan.judyan.kr";
String str_c3 = "judyan@judyan@kr";

boolean bool_c1 = str_c1.matches(emailRegex);  // true
boolean bool_c2 = str_c2.matches(emailRegex);  // false
boolean bool_c3 = str_c3.matches(emailRegex);  // false

문자열 비교 : compareTo

  • compareTo : 사전순 비교에 따라 양수 또는 음수 반환
String str_a1 = "ABC";
String str_a2 = "ABCDE";
String str_a3 = "ABCDEFG";

//  같은 문자열이면 0 반환
int int_a1 = str_a1.compareTo(str_a1);  // 0

//  시작하는 부분이 같을 때는 글자 길이의 차이 반환
int int_a2 = str_a1.compareTo(str_a2);  // -2
int int_a3 = str_a1.compareTo(str_a3);  // -4
int int_a4 = str_a2.compareTo(str_a3);  // -2
int int_a5 = str_a3.compareTo(str_a1);  // 4

String str_a4 = "HIJKLMN";

//  시작하는 부분이 다를 때는 첫 글자의 정수값 차이 반환
int int_a6 = str_a1.compareTo(str_a4);  // -7
int int_a7 = str_a4.compareTo(str_a3);  // 7

대소문자 변환 : toUpperCase, toLowerCase

  • toUpperCase : 모두 대문자로 변환
  • toLowerCase : 모두 소문자로 변환
  • 영문 텍스트에서 대소문자 무관 특정 텍스트 포함 여부 확인시 사용
String str_a1 = "Hello, World!";

String str_a2 = str_a1.toUpperCase();  // HELLO, WORLD!
String str_a3 = str_a1.toLowerCase();  // hello, world!

이어 붙이기 : concat

String str_a1 = "안녕";
String str_a2 = "하세요.";
String str_a3 = "반가워요.";

String str_a4 = str_a1.concat(str_a2);  // "안녕하세요."

// 메서드 체이닝 -> 모두 문자열을 반환하기 때문에 이어서 사용 가능
String str_a5 = str_a1.concat(str_a2).concat(str_a3);  // "안녕하세요.반가워요"
  • + 연산자와의 차이
    • concat에는 문자열만 이어붙일 수 있음

    • concat은 필요시에만 새 인스턴스 생성 (큰 의미 없음)

    • null이 포함될 경우, +연산자는 이어붙이기 가능 (concat은 NullPointerException 발생)

    • ️ ⭐️ 다중 연산시 생성되는 문자열 인스턴스의 수가 다름

      • + 연산 : 내부적으로 아래와 같이 최적화 됨 -> 다중 연산시 메모리 절약
        StringBuilder, StringBuffer 등 사용
      String str_d1 = "a" + "b" + "c" + "d";  
      
       String str_d2 = new StringBuilder("a")
                  .append("b")
                  .append("c")
                  .append("d")
                  .toString();  // "abcd"가 생성됨
      // "a", "b", "c", "d", "abcd"가 생성되어 메모리 차지
      • concat : 매 번 문자열을 반환하므로 메모리를 차지
      String str_d3 = "a"
                  .concat("b") // "ab"가 생성됨
                  .concat("c") // "abc"가 생성됨
                  .concat("d"); // "abcd"가 생성됨
      // "a", "b", "c", "d", "ab", "abc", "abcd"가 생성되어 메모리 차지

반복하기 : repeat

  • repeat : 문자열을 주어진 정수만큼 반복
String str_a1 = "hello";
String str_a2 = str_a1(2);  // "hellohello"
String str_a3 = str_a1
		.concat(" ")  // "hello " -> 공백 추가
		.repeat(3)  // "hello hello hello " -> 공백 추가된 문자열을 3번 반복
		.trim();  // "hello hello hello" -> 양쪽 공백을 제거한 최종 결과

잘라오기 : substring

  • substring : ~번째 문자부터 (~번째 문자까지) 잘라서 반환
String str_b1 = "우리는 오렌지 태양 아래 그림자 없이 함께 춤을 춰";

String str_b2 = str_b1.substring(4);  // "오렌지 태양 아래 그림자 없이 함께 춤을 춰"
String str_b3 = str_b1.substring(4, 13);  // "오렌지 태양 아래"
String str_b4 = str_b1.substring(14, 23);  // "그림자 없이 함께"

String piece1 = "오렌지";
String piece2 = "춤을";
String str_b5 = str_b1.substring(
		str_b1.indexOf(piece1),
		str_b1.indexOf(piece2) + piece2.length()
);  // "오렌지 태양 아래 그림자 없이 함께 춤을"

치환 : replace

  • replace : 주어진 앞의 문자(열)을 뒤어 문자(열)로 치환
  • replaceAll / replaceFirst : 정규표현식 사용 가능. 전부 치환 / 첫 번째 일치부분만 치환
String str_c1 = "오늘 점심은 짜장면이야.";
String str_c2 = str_c1.replace("점심", "저녁");  // "오늘 저녁은 짜장면이야."

//  여럿 포함시 모두 치환
String str_c3 = "배고파!! 배고파 죽겠다! 배고파";
String str_c4 = str_c3.replace("배고파", "배불러");  // "배불러!! 배불러 죽겠다! 배불러"

String str_e1 = "02=123.4567_8900";

String str_e2 = str_e1
		.replaceAll("[=._]", "-")
		.replaceFirst("[-@#]", ")");  // 02)123-4567-8900

배열 반환 : toCharArray, split

  • toCharArray : 문자열을 분할하여 문자열의 배열로 반환
  • split : 주어진 기준으로 (~개까지) 분할하여 문자열 배열로 반환
String str1 = "가나다라마바사";
String str2 = "010-1234-5678";

char[] chAry = str1.toCharArray();  // [가,나,다,라,마,바,사]
String[] strAry = str2.split("-");  // ["010","1234","5678"]

❤️ 문자열의 포매팅과 null

포매팅 : formatted

  • formatted : 주어진 형식에 따라 문자열 생성

  • 형식설명
    %b불리언
    %d10진수 정수
    %f실수
    %c문자
    %s문자열
    %n(포맷 문자열 내 줄바꿈)
String str1 = "%s의 둘레는 반지름 X %d X %f입니다.";

String circle = "원";
int two = 2;
double PI = 3.14;

String str2 = str1.formatted(circle, two, PI);  // 13버전
String str3 = String.format(str1, circle, two, PI);  // 이전 버전
// "원의 둘레는 반지름 X 2 X 3.140000입니다."

// 시스템의 printf 메소드 : String.format과 같은 형식으로 출력
System.out.printf("%s의 둘레는 반지름 X %d X %f입니다.%n", circle, two, PI);

%n 은 OS별로 일정하게 줄바꿈이 되도록 적절한 개행문자를 넣어줌

  • 윈도우 : \r\n
  • 맥&리눅스 : \n

정수, 실수

: 숫자 앞에 오는 플래그 부분에는 ,, -, +, 0가 올 수 있다

  • 숫자 앞에 0 : 숫자 출력 시 빈칸이 아닌 0으로 채우라는 의미
  • - : 왼쪽 정렬
  • + : 양수일 경우 앞에 +를 포함하여 출력하라는 의미
  • , : 숫자를 3자리마다 ,로 분리하라는 의미
// 정수
int n = 12345;
        
System.out.printf("%10d%n", n); 
System.out.printf("%010d%n", n);
System.out.printf("%+10d%n", n);
System.out.printf("%-10d%n", n);
System.out.printf("%,10d%n", n);

/*
     12345
0000012345
    +12345
12345     
    12,345
*/

// 실수
double n = 1234.2;
        
System.out.printf("%.2f%n", n);  
System.out.printf("%10.2f%n", n);
System.out.printf("%+010.2f%n", n);
System.out.printf("%-10.2f%n", n);
System.out.printf("%,10.2f%n", n);

/*
1234.20
   1234.20
+001234.20
1234.20   
  1,234.20
*/

문자열

String str = "Hello";

System.out.printf("%.3s%n", str);  // 3번째까지만 출력
System.out.printf("%15s%n", str);  // 15자리 확보
System.out.printf("%10.2s%n", str);  // 10자리 확보, 2번째까지만 출력
System.out.printf("%-10s%n", str);  // 10자리 확보, 왼쪽 정렬

/*
Hel
          Hello
        He
Hello   
*/

null

  • 값이 없음을 의미
  • 빈 문자열과는 다름
  String emptyStr = "";
  String nullStr = null;

  boolean b = emptyStr == nullStr; // false
  • 빈 문자열 : 힙 공간에 자리를 차지
    null 문자열 : 힙에 할당되지 않음
  • 잠조 자료형의 인스턴스는 null 가능
Object obj = null;
Integer nullInt = null;
Double nullDbl = null;
  • 원시값은 불가




출처 - 인프런 '제대로 파는 자바' 강의

profile
🦋개발 공부 기록🦋

0개의 댓글

관련 채용 정보