일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 국비지원
- Java
- 사용자 정의 예외처리
- 추상화
- do~while문
- 클래스의구조
- 비전공자
- 캐스팅연산자
- userDefineException
- 부모 생성자
- 프로그래머스
- 개발
- Calendar Class
- for문
- 알고리즘
- 생성자
- 코딩
- exception
- 예외처리
- Date Class
- 개발자
- AoutoBoxing
- 백앤드
- 취준생
- 상속
- 자바
- 독학
- 예외던지기
- 가위바위보프로그램
- super 생성자
- Today
- Total
유난스런 개발 기록
[JAVA] Day-10 _ String 클래스 (String Class),(자주 사용하는 메소드 정리) 본문
day-10
String 클래스
String 클래스란?
- String 클래스는 문자열을 보다 쉽게 활용할 수 있는 다양한 클래스를 제공한다.
- java.lang 패키지에 포함되어 있어서. 해당 패키지를 import하면 패키지 안에 포함된 모든 클래스를 이용할 수 있다.
- 하지만 실제로 java.lang 패키지에 있는 클래스들은 import를 하지 않고 이용할 수 있다.
자주 사용하고 알아두면 좋은 String클래스의 method들을 살펴보자.
charAt()
// === 1. "문자열".charAt(int index) ===
// "안녕하세요".cahrAt(2) ==> '하'
// index => 01234
위의 예시 코드와 같이 charAt() 메소드를 이용할 수 있다.
() 안에 인덱스를 입력하면 문자열에서 해당하는 인덱스의 글자를 추출할 수 있다.
'하'가 출력 된 것은 자바에서 인덱스는 0 부터 시작하기 때문에
index 0 => (안)
index 1 => (녕)
index 2 => (하)
위와 같은 순서로 이루어져 있기 때문이다.
그렇다면 마지막 인덱스 부터 거꾸로 출력하려면 어떻게 해야할까?
String str = "안녕하세요";
String result = ""; // 추출한 index를 넣어주기 위해 result라는 변수를 선언하고 기본값으로 초기화해준다.
for( int i=str.length()-1; i=>0; i--) {
result += str.charAt(i); // result에 반복하며 나온 i의 값을 쌓아준다.
}
System.out.println(result); // result에 쌓인 결과 출력
// 요세하녕안
int i를 배열의 길이로 설정하되, -1을 해주어야 마지막 인덱스 부터 반복문을 거꾸로 실핼할 수 있다.
배열의 길이는 '글자 수'라고 생각하면 되는데, "안녕하세요" 의 글자 수는 5글자라서 배열의 길이는 5다.
인덱스는 0 부터 시작하기 때문에 0,1,2,3,4 로 구성되어 있다.
때문에 마지막 인덱스를 지정해주기 위해서는 배열길이에서 -1을 해주어야 한다.
toCharArray()
// === 2. "문자열".toCharArray() ===
// "안녕하세요".toCharArray() ==> char 타입의 배열로 만들어준다.
// -----------------------
// |'안'|'녕'|'하'|'세'|'요'|
// -----------------------
// 0 1 2 3 4 <=== index
toCharArray()는 문자열을 문자로 하나씩 뽑아서 배열에 넣어주는 역할을 한다.
"안녕하세요"를 거꾸로 출력하는 예시 코드를 보자
char[] chArr = "안녕하세요".toCharArray(); // char 타입의 배열 chArr을 생성하고 "안녕하세요"를 넣어준다.
String result = ""; // toCharArray로 만들어진 값들을 저장해줄 변수를 선언한다.
for(int i = chArr.length - 1; i >=0; i--) {
result += chArr[i];
}
System.println(result);
//요세하녕안
문자열 "안녕하세요"를 char타입의 배열에 하나씩 넣어주기 위해
char[] chArr을 선언하고 "안녕하세요"를 넣어준다.
이 과정을 toCharArray 메소드로 진행하는 것이다.
나머지 과정은 chatAt()과 동일하다.
substring()
// === 3. "문자열".substring(int 시작인덱스, int 끝인덱스) ===
// "안녕하세요".substring(1,4) ==> 1번 인덱스인 "녕" 부터 4번 인덱스 앞에까지 뽑아온다.
//안 | 녕 | 하 | 세 | 요
// 0 | 1 | 2 | 3 | 4
String str = "안녕하세요".substring(1,4);
System.out.println(str);
// 녕하세
substring()의 기본적인 사용법이다. () 안에 시작 인덱스와 끝 인덱스를 지정해주면,
해당 인덱스에 해당하는 값들 안의 모든 인덱스가 선택이 된다. 즉, 지정해준 마지막 인덱스 앞 까지만 뽑아온다.
그렇다면 시작 인덱스만 적으면 어떻게 될까?
// === 4. "문자열".substring(int 시작인덱스) ===
// "안녕하세요".substring(2) ==> 2번 인덱스인 "하" 부터 끝까지 뽑아온다.
String str = "안녕하세요".substring(2);
System.out.println(str);
// 하세요
시작 인덱스만 넣어주면 시작 인덱스 부터 마지막 인덱스 까지 선택이 된다.
indexOf()
// === 5. "문자열".indexOf("찾을문자열") ===
// "문자열" 에서 최초로 나오는 "찾을문자열"의 인덱스(int)를 알려준다.
int index = "시작하라 안녕하세요 건강하세요".indexOf("하");
// 012
System.out.println(index); // 2
index = "시작하라 안녕하세요 건강하세요".indexOf("하세");
// 01234567
System.out.println(index); // 7
index = "시작하라 안녕하세요 건강하세요".indexOf("A");
System.out.println(index); // -1 찾고자 하는 문자열이 없으면 -1 이 나온다.
"하세"의 경우 해당 두 글자를 하나의 인덱스로 친다.
때문에 "하세"의 인덱스는 7이 된다.
또한
찾고자 하는 인덱스가 없으면 출력값으로 -1이 나온다
lastIndexOf()
// === 6. "문자열".lastIndexOf("찾을문자열") ===
// "문자열" 에서 마지막으로 나오는 "찾을문자열"의 인덱스(int)를 알려준다.
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("하");
// 012
System.out.println(index); // 13
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("하세");
// 01234567
System.out.println(index); // 13
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("A");
System.out.println(index); // -1 찾고자 하는 문자열이 없으면 -1 이 나온다.
마지막 "하"에 해당하는 인덱스를 출력해준다.
공백도 하나의 인덱스로 인식하기 때문에 반드시 포함시켜야한다!!!.
split()
// === 7. "문자열".split("구분자") ===
// "문자열" 을 "구분자" 로 잘라서 String 타입의 배열로 돌려주는 것이다.
String food = "파스타,국밥,볶음밥,고구마,계란말이";
String[] foodArr = food.split(",");
// {"파스타","국밥","볶음밥","고구마","계란말이"}
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
} // 파스타
// 국밥
// 볶음밥
// 고구마
// 계란말이
문자열 배열을 지정해준 , 로 구분지어준다.
그렇다면 다른 문자를 사용해서 구분지어주면 어떻게 될까?
String food = "파스타,국밥,볶음밥,고구마,계란말이";
String[] foodArr = food.split(",");
// 출력이 안된다.
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 0
// 인식하지 못한다.
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
}
// 출력이 안된다
실행해보면
foodArr.length => 0 라고 출력이 되며
String food에 넣어준 값은 출력이 되지 않는다.
즉 . 을 단독으로 사용할 경우 구분자로 인식하지 못한다는 것이다.
split 사용시 구분자로 . | / 등 특수문자를 사용하려고 할 경우에는 구분자로 인식을 못할 경우가 많으므로
구분자 앞에 \\ 를 붙이거나 []를 씌워주면 된다.
ex) \\구분자 or [구분자]
코드를 통해 확인해보자
\\ 의 사용
String food = "파스타.국밥.볶음밥.고구마.계란말이";
String[] foodArr = food.split("\\.");
// {"파스타"."국밥"."볶음밥"."고구마"."계란말이"}
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
} // 파스타
// 국밥
// 볶음밥
// 고구마
// 계란말이
[] 의 사용
String food = "파스타.국밥.볶음밥.고구마.계란말이";
String[] foodArr = food.split("[.]");
// {"파스타"."국밥"."볶음밥"."고구마"."계란말이"}
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
} // 파스타
// 국밥
// 볶음밥
// 고구마
// 계란말이
위와 같이 \\ 와 [] 를 같이 이용하면 구분자로서 역할을 수행할 수 있다.
| 의 경우도 마찬가지로 적용이 된다.
[]를 사용하는 것이 가독성 측면에서 더 좋다.
split() 괄호에 정규식을 \\d 와 \\D 를 사용하면 해당 문자열의 숫자와 문자를 제거할 수 있다.
예시 코드를 통해 확인해보자.
\\d
Sting food = "파스타1국밥2볶음밥3고구마4계란말이";
String[] foodArr = food.split("\\d"); // 위와 같이 \\를 하는 것 보다 []를 쓰는게 알아보기 편하다.
// \\d에서 d는 정규표현식의 하나로써 숫자를 의미한다.
// 즉, 숫자가 구분자가 되는 것이다.
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
} // 파스타
// 국밥
// 볶음밥
// 고구마
// 계란말이
\\D
String food = "파스타1국밥2볶음밥3고구마4계란말이";
String[] foodArr = food.split("\\D"); // 위와 같이 \\를 하는 것 보다 []를 쓰는게 알아보기 편하다.
// \\D에서 D는 정규표현식의 하나로써 숫자가 아닌 것을 의미한다.
// 즉, 문자가 지워지는 것이다.
// {"1","2","3","4","5"}
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5
for (int i = 0; i < foodArr.length; i++) {
System.out.println(foodArr[i]);
}
// 1
//
// 2
//
//
// 3
//
//
// 4
여기서 한 가지!
여러 코드들과 문자들을 출력하다 문득 궁금했다.만약 "" 안에 ""를 그리고 \를 넣어주고싶다면 어떻게 해야할까?
이럴 때는 escape 문자를 사용하면 된다.
원하는 특수문자 앞에 \ 한개만 붙여주면 된다.
예시 코드를 통해 확인해보자.
// == <참고> \ 를 'escape 문자' 라고 부른다. ==
System.out.println("나의 이름은 \"이순신\" 입니다.");
// 나의 이름은 "이순신" 입니다.
System.out.println("C:\\movie\\아바타2.mp4");
// C:\movie\아바타2.mp4
String.join()
split()은 구분자를 통해 문자열을 나누어줬다면
String.join()은 구분자를 기준으로 문자열을 합쳐서 String 타입으로 돌려준다.
// === 8. String.join("구분자", 문자열타입의배열명) ===
// 문자열타입의배열을 "구분자"로 합쳐서 String 타입으로 돌려주는 것이다.
String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
String names = String.join("-", nameArr);
System.out.println(names);
// 한석규-두석규-세석규-네석규-오석규
replaceAll()
// === 9. "문자열".replaceAll("변경대상문자열", "새로이변경될문자열") ===
// "문자열" 에서 "변경대상문자열" 을 모두 "새로이변경될문자열" 로 교체해서 반환해주는 것이다.
String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
String names = names.replaceAll("석규", "SK");
System.out.println(names);
// 한SK-두SK-세SK-네SK-오SK
여기서 궁금증이 생길 수 있다!
replaceAll() 말고 생김새가 비슷한 replace() 을 사용해보거나 본 적이 있었는데,
그렇다면 replaceAll() 과 replace() 의 차이점은 무엇일까?
"문자열".replace()는 정규표현식 사용 불가능
"문자열".replaceAll()은 정규표현식 사용 가능
예시 코드를 통해 다양한 경우들을 확인해보자
// 변수 str 에서 a 또는 b 또는 c 라는 글자가 있으면 삭제하려고 한다.
str = "java abcd javascript";
str = str.replace("a", "").replace("b", "").replace("c", "");
// "jv bcd jvscript"
// "jv cd jvscript"
// "jv d jvscript"
System.out.println(str);
// jv d jvscript
str = "java abcd javascript";
str = str.replaceAll("[abc]", ""); // replaceAll 은 정규표현식도 사용이 가능하다.
System.out.println(str);
// jv d jvsript
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0123456789]", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
// java abcd javascript
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0-9]", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
// java abcd javascript
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0-4689]", ""); // 숫자중에 5와7을 뺀 숫자만 제거하라는 뜻이다.
System.out.println(str);
// ja7va abcd jav555ascri5pt
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[^0-9]", ""); // 숫자가 아닌것만 제거하라는 뜻이다.
System.out.println(str);
// 79812555521300
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("\\d", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
// java abcd javascript
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("\\D", ""); // 숫자가 아닌것만 제거하라는 뜻이다.
System.out.println(str);
// 79812555521300
str = "java KOREA 0070 @#$@!";
str = str.replaceAll("[a-z]", ""); // 소문자만 제거하라는 뜻이다.
System.out.println(str);
// KOREA 0070 @#$@!
str = "ja88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[a-zA-Z0-9_ ]", ""); // 소문자 및 대문자 및 숫자 및 _ 및 공백을 제거하라는 뜻이다.
System.out.println(str);
// @#$@!
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\w]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.
System.out.println(str);
// # @#$@!
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\w ]", ""); // 소문자 및 대문자 및 숫자 및 _ 및 공백을 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.
System.out.println(str);
// #@#$@!
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[^a-zA-Z0-9_]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제외한 나머지를 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.
System.out.println(str);
// ja88va_KOss_REA00abc70java
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\W]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제외한 나머지를 제거하라는 뜻이다.
// 정규표현식에서 \\W 은 word(단어)가 아닌것 이라는 뜻으로 대문자,소문자,숫자,_ 를 제외한 나머지를 말한다.
System.out.println(str);
// ja88va_KOss_REA00abc70java
replaceFirst()
// === 10. "문자열".replaceFirst("변경대상문자열", "새로이변경될문자열") ===
// "문자열" 에서 "변경대상문자열" 을 첫번째만 "새로이변경될문자열" 로 교체해서 반환해주는 것이다.
String[] nameArr = {"한SK","두SK","세SK","네SK","오SK"};
String names = names.replaceFirst("SK", "석규");
System.out.println(names);
// 한석규-두SK-세SK-네SK-오SK
startsWith()
// === 11. "문자열".startsWith("찾고자하는문자열") ===
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오면 true를 반환,
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오지 않으면 false를 반환,
// "건강" 이라는 단어로 시작하는 것만 출력하세요.
String[] contents = { "호호안녕하세요", "건강하세요", "행복하세요 또봐요", "즐겁고 건강한 하루되세요" };
for (int i = 0; i < contents.length; i++) {
if (contents[i].startsWith("건강")) {
System.out.println(contents[i]);
}
} // 건강하세요
endsWith()
// === 12. "문자열".endsWith("찾고자하는문자열") ===
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오면 true를 반환,
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오지 않으면 false를 반환,
// "하세요" 이라는 단어로 시작하는 것만 출력하세요.
String[] contents = { "호호안녕하세요", "건강하세요", "행복하세요 또봐요", "즐겁고 건강한 하루되세요" };
for (int i = 0; i < contents.length; i++) {
if (contents[i].endsWith("하세요")) {
System.out.println(contents[i]);
}
} // 호호안녕하세요
// 건강하세요
trim()
// === 13. "문자열".trim() ===
// "문자열"의 좌,우에 공백이 있다면 공백을 모두 제거하고서 반환해준다.
String insa = " 수고 많으셨습니다 ";
System.out.println("하하하" + insa + "내일 뵐게요~~");
// 하하하 수고 많으셨습니다 내일 뵐게요~~
System.out.println("하하하" + insa.trim() + "내일 뵐게요~~");
// 하하하수고 많으셨습니다내일 뵐게요~~
isEmpty()
// === 14. "문자열".isEmpty() ===
// "문자열" 이 아무것도 없으면 true 를 반환해주고,
// "문자열" 이 뭔가 있으면 false 를 반환해준다.
String str1 = "", str2 = "abc", str3 = " ";
System.out.println(str1.isEmpty()); // true
System.out.println(str2.isEmpty()); // false
System.out.println(str3.isEmpty()); // false
System.out.println(str3.trim().isEmpty()); // true
toUpperCase()
// === 15. "문자열".toUpperCase() ===
// "문자열" 에서 소문자가 있으면 모두 대문자로 변경해서 반환해줌.
String words = "My Name is Tom 입니다.";
System.out.println(words.toUpperCase());
// MY NAME IS TOM 입니다.
toLowerCase()
// === 16. "문자열".toLowerCase() ===
// "문자열" 에서 대문자가 있으면 모두 소문자로 변경해서 반환해줌.
String words = "My Name is Tom 입니다.";
System.out.println(words.toLowerCase());
// my name is tom 입니다.
equals()
// === 17. "문자열".equals("비교대상문자열") ===
// 대문자와 소문자를 구분하면서
// "문자열" 과 "비교대상문자열" 의 값이 일치하면 true 를 반환.
// "문자열" 과 "비교대상문자열" 의 값이 일치하지 않으면 false 를 반환.
String[] strArr = { "korea", "seoul", " KOREA seoul", "Korea 대한민국", "서울 kOrEA 만세", null };
// 검색어를 "korea" 라는 글자가 들어있는 것만 출력하세요.
for (int i = 0; i < strArr.length; i++) {
if ("korea".equals(strArr[i]))
// if("korea".equals("korea")
// if("korea".equals("seoul")
// if("korea".equals("KOREA seoul")
// ...
// if("korea".equals(null)
System.out.println(strArr[i]);
// 아래의 방식대로 하면 NullPointerException 이 유발될 수 있다.
// if(strArr[i].equals("korea")) // if("korea".equals("korea")
// if("seoul".equals("korea")
// if("KOREA seoul".equals("korea")
// ...
// if(null.equals("korea")
// System.out.println(strArr[i]);
} // end of for------------------------
equalsIgnoreCase()
// === 18. "문자열".equalsIgnoreCase("비교대상문자열") ===
// 대문자와 소문자를 구분하지 않으면서
// "문자열" 과 "비교대상문자열" 의 값이 대,소문자와 관계없이 일치하면 true 를 반환.
// "문자열" 과 "비교대상문자열" 의 값이 대,소문자와 관계없이 일치하지 않으면 false 를 반환.
// 검색어를 "korea" 또는 "KOREA" 또는 "kOreA" 또는 "kOreA" 와 같이 했을때에
// 대,소문자를 구분치 않고 "korea" 라는 글자가 들어있는 것만 출력하세요.
String[] strArr = { "korea", "seoul", " KOREA seoul", "Korea 대한민국", "서울 kOrEA 만세", null };
String search = "kOreA"; // "korea" , "KOREA" , "kOreA"
for (String s : strArr) { // 배열 strArr 크기만큼 반복한다.
// 즉, 6번 반복한다.
search = search.toLowerCase(); // "korea"
// 첫번째 반복일 경우
// String s = "korea";
// 두번째 반복일 경우
// String s = "seoul";
// 세번째 반복일 경우
// String s = "KOREA seoul";
// 네번째 반복일 경우
// String s = "KOREA 대한민국";
// 다섯번째 반복일 경우
// String s = "서울 kOrEA 만세";
// 여섯번째 반복일 경우
// String s = null;
if (s != null && s.toLowerCase().indexOf(search) != -1) {
// 일단 null이 아니기 때문에 !=로 제외시키고 배열에 저장되어 있는 소문자로 바꾸고
// 검색에 있는 값도 소문자로 바꿔주고 그게 없는 값(-1)이 아니어야한다.
// s.toLowerCase() 은 "korea", "seoul", "korea seoul", "korea 대한민국", "서울 korea 만세"
// search 는 "korea"
System.out.println(s);
// korea
// KOREA seoul
// Korea 대한민국
// 서울 kOrEA 만세
}
} // end of for-----------------------------------
/*
"korea"
" KOREA seoul"
"Korea 대한민국"
"서울 kOrEA 만세"
*/
오늘은 String Class에서 자주 사용하는 메소드들을 공부했다.
위에 기록해 둔 메소드는 앞으로 정말 많이 사용할 것이기 때문에
그 사용법과 정의를 꼭 외워둬서 언제든 사용할 수 있도록 익숙해지자!
'개념정리 > JAVA' 카테고리의 다른 글
[JAVA] Day-11 _ 캘린더 클래스와 데이트 클래스(Calendar Class & Date Class) (1) | 2023.01.23 |
---|---|
[JAVA] Day-11 _ StringBuilder & StringBuilder (StringBuilder를 중심으로) (0) | 2023.01.23 |
[JAVA] Day-9 _ 2차원 배열 (TwoDimensionArray) (0) | 2023.01.19 |
[JAVA] Day-9 _ 배열 (Array) (0) | 2023.01.19 |
[JAVA] Day-8 _ Math.random() 난수 생성하기 (0) | 2023.01.18 |