2022. 10. 5. 15:16ㆍDev.Program/Java & Spring
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)은 나중에 따로 할 거! 지금은 안함
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Math.random()] 로또 번호 생성 프로그램 (0) | 2022.10.06 |
---|---|
StringBuffer 와 StringBuilder 클래스 / java.lang.Math 클래스 (1) | 2022.10.06 |
[Java] java.lang.Object 클래스 - (2) toString() (0) | 2022.10.05 |
[Java] java.lang.Object 클래스 - (1) equals() (1) | 2022.10.05 |
[Java] 향상된for문 / 어노테이션 (1) | 2022.10.05 |