[Java] java.lang.String 클래스

2022. 10. 5. 15:16Dev.Program/Java & Spring

728x90

p.420

p.426

======== JAVA0324 → Ex.java 만들기

< java.lang.String 클래스 >

  • 문자열을 관리하는 클래스
    • ⇒ 내부적으로 char[] 타입으로 문자 하나하나를 자동으로 저장하여 관리
  • final 클래스이므로 상속 불가
  • new 키워드를 사용한 문자열 할당과, 리터럴을 직접 할당하는 방법으로 구분
    •  ⇒ 특별한 경우 외에는 기본적으로 리터럴 직접 할당 방법을 사용함
    • (저장공간을 절약할 수 있음)
  • 불변성을 가지므로, 문자열을 변경하더라도 원본 문자열은 그대로 유지되고, 변경된 문자열을 새로운 공간에 할당한다.

 

1. 리터럴을 사용하여 직접 문자열을 생성하는 방법

    String s1 = "Hello"; // 동일한 문자열이 없으므로 새로 생성
    String s2 = "Hello";
    // s1 에 해당하는 문자열이 동일하므로 같은 주소값을 사용
 

⇒ 상수 풀(Constant Pool)에 문자열을 저장한다. 

저장하기 전 동일한 문자열이 존재하는지 검사한 뒤, 동일한 문자열이 존재할 경우 해당 문자열 주소를 리턴하고 아니면 새로 생성

if(s1 == s2) { // 참조변수의 동등비교 연산 = 주소값 비교
    System.out.println("s1, s2 주소값이 같다!");
} else {
    System.out.println("s1, s2 주소값이 다르다!");
}

if(s1.equals(s2)) {
	// String 클래스의 equals() 메서드 사용 = 실제값(문자열) 비교 
    System.out.println("s1, s2 실제값(문자열)이 같다!");
} else {
    System.out.println("s1, s2 실제값(문자열)이 다르다!");
}
 
  • 출력창

 

2. String 클래스의 객체 생성 문법을 사용(new 키워드)하여 문자열 생성

  • new 를 통해 String 바로 넣을 수 있음
String s3 = new String("Hello");
// 힙 공간에 "Hello" 문자열 저장 공간 생성
String s4 = new String("Hello");​

⇒ new 키워드를 사용할 때마다 무조건 새로운 Heap 공간에 문자열 생성됨

if(s3 == s4) { // 참조변수의 동등비교 연산 = 주소값 비교
    System.out.println("s3, s4 주소값이 같다!");
} else {
    System.out.println("s3, s4 주소값이 다르다!");
}

if(s3.equals(s4)) {
	// String 클래스의 equals() 메서드 사용 = 실제값(문자열) 비교 
    System.out.println("s3, s4 실제값(문자열)이 같다!");
} else {
    System.out.println("s3, s4 실제값(문자열)이 다르다!");
}
 
  • 출력창
  • new 를 통해 선언했기 때문에 주소값이 다르다고 나옴

 

======== Ex2.java

p.427

p. 428-429 → 주요메서드

< String 클래스의 주요 메서드 >

String s1 = "Hello, World!";
 

 

1. length() : 문자열 길이

  • 출력창

⇒ "Hello, World!" 의 길이가 13이므로, 인덱스는 0 ~ 12번까지 사용됨

2. equals() : 실제값 비교

 

  • equals() 메서드는 대소문자를 구별하여 비교하지만
  • equalsIgnoreCase() 메서드는 대소문자 구별없이 비교

3. charAt()

  • 특정 인덱스에 위치한 문자 1개 리턴

  • 출력창
  • 7번 인덱스(8번째 문자) 리턴



========  Test2.java → String 클래스 연습

문제1 )

String 타입 변수 jumin 에서 주민등록번호를 통해 남/여 판별 후 출력

⇒ 뒷부분 첫번째 자리 숫자가 1 또는 3이면 남성! 2 또는 4이면 여성! 출력

String jumin = "001010-3344556";
 

 

  • 푼 답!
  • charAt 의 리턴타입이 char타입이기 때문에 ‘’(작은따옴표) 사용

  • 선생님 답

 

<Ex2.java>

4. indexOf()

  • 특정 문자열을 탐색하여 해당 문자열이 존재할 경우 시작인덱스 리턴

  • char 타입도 가능

  • 없으면 -1 리턴

5. lastIndexOf()

  • 특정 문자열을 "뒤에서부터" 탐색하여 존재하면 인덱스 리턴

  • indexOf() 와 lastIndexOf() 비교!

6. replace()

  • 특정 문자 또는 문자열 치환 = 찾아서 바꾸기

  • CharSequence 보면 String 타입이네!! 라고 생각하면 됨
  • replace(원본문자, 바꿀문자)

  • 해당되는 문자 또는 문자열을 모두 치환!

7. concat() : 문자열 결합

  • 우리 결합하는거 +(연결 연산자), .append, concat() 3가지 사용!
  • .append → concat() → + 순으로 빠르다 (+ 가 그냥 편해서 쓰는거)
    • ⇒ #tip. 실무에서는 최소한 concat() 사용!

8. subString() : 특정 문자열 추출

  • ⇒ 시작인덱스만 지정할 경우 시작인덱스 ~ 끝까지 추출
  • ⇒ 시작인덱스, 끝인덱스 지정할 경우 시작인덱스 ~ 끝인덱스 -1 까지 추출

 Hello, World! 에서 World 만 추출하고 싶을 때

  • 출력창
  • 이렇게 하면 World 가 아니라 Worl 만 출력됨(7 ~ 10까지만 추출)

  • 이렇게 적어야 World 제대로 출력(7 ~ 11까지 추출)

  • 숫자 하나(7)만 적으면 7 ~ 끝까지 추출



<Test2.java>

문제 2)

이메일 주소가 저장된 String 타입 변수 email 에서

'@' 기호를 기준으로 계정명과 도메인을 분리해서 출력

ex) ytlee@itwillbs.co.kr 일 경우(계정명 : ytlee, 도메인 : itwillbs.co.kr)

String email = "ytlee@itwillbs.co.kr";
 

  • 푼 답

  • 이렇게 넣어서 만들어 보기 baseIndex 에는 ‘@’ 찾아서 넣기

  • indexOf(‘@’) 로 찾을 수 있다!

 

  • 선생님 답 ( baseIndex 를 설정해 두면 위에 email 변수가 바뀌어도 상관없다 )
    • ⇒ 좋은 코드


<Ex2.java>

9. toUpperCase() : 모든 영문자를 대문자로 변환

10. toLowerCase() : 모든 영문자를 소문자로 변환

String s2 = "            ITWILL      부산   교육센터       ";
 

11. trim() : 문자열 앞 뒤의 공백 제거

  • 문자열 사이의 공백은 제거하지 않는다!

  • 출력창
  • 중간 공백 외에는 공백 제거 됨!
String s3 = "김태희/전지현/송혜교";
 

12. split()

  • 문자열을 주어진 구분자(분리자, Delimeter)를 사용하여 분리

⇒ 기준이 되는 문자를 구분자 또는 분리자라고 하며 분리된 문자열들은 String[] 타입으로 각각 저장됨

ex ) “김태희/전지현/송혜교” 문자열을 “/” 기호를 기준으로 분리

  • 리턴타입 [] 배열

  • (향상 for문 사용)
  • (그냥 for문도 가능)
  • 전부 꺼내보기!
  • 출력창

 

13. String.format()

> 얘는 조금 다른 성격 : static 이라 String. 으로 접근

  • 형식 지정 문자(%로 시작하는 문자)를 사용하여 특정 포맷을 적용한 문자열을 생성 = printf() 와 사용법 동일

  • printf 문을 문자열로 저장해주는게 format()!
  • 단순출력문이냐 / 저장이 가능하냐의 차이!

 

> 다시 s1, s2, s3 출력해보기

  • 문자열 변경을 수행하더라도 원본은 변하지 않는다! (불변성)

 

429-431

Test2.java에 p.431 코드 그대로 따라치기

<Test2.java>

String hp = "010-1234-5678";
 

문제 ) 전화번호 가운데자리를 "****" 로 대체

단, 가운데자리 번호가 3자리 또는 4자리 모두 대체되어야 함

  • 푼 답
  • 출력창

  • 가운데 번호를 3자리로 바꿔도
  • 출력창
  • 제대로 잘 나옴!

  • 이렇게 바꾸면 더 좋은 코드!

 

p432 (6)은 나중에 따로 할 거! 지금은 안함

 

728x90