1. String 클래스 메서드를 사용하여 문자열 변경하기
- 문자열을 변경할 때는 String 클래스 메서드 사용하지말고 StringBuffer 클래스와 StringBuilder 클래스 사용하기
- 아래 코드는 로직 파악하는 개념으로 정리
예시1)
예시2)
예시3)
2. StringBuffer 클래스
- 버퍼(buffer)라는 단어가 있으면 임시기억공간이 있다는 소리
3. StringBuilder 클래스
- StringBuffer 클래스와 차이점 : 스레드에 안전하다(==동기화 처리가 되어져 있다)
* 동기화 : A사람(스레드)이 사용할 때 다른 사람(스레드)이 사용하지 못하게 잠금하는 작업을 동기화 처리라고 함
* 공유자원은 꼭 1개여야만 의미가 있음
> 스레드 배울 때 상세히 다룰 예정이며, 지금은 의미정도 파악
4. 문자열이 자주 변경될 때 StringBuffer, StringBuilder 클래스 사용하기
- 처리 속도 시간차이가 본인 노트북 기준으로 1000배 이상 차이가 남
main() 메서드)
testString 메서드 / testStringBuffer 메서드)
4-1. StringBuffer 클래스로 프로그래머스 수박수박수박수 문제 풀기
5. StringTokenizer 클래스
- String.split() 문자열을 구분자(regex)를 사용해서 잘래내기
> 토큰으로 할 수 있지만, split()으로 사용하는 걸 권장
public class Ex02 {
public static void main(String[] args) {
String str ="홍길동, 박예린 , 김서영, 마상민";
String[] names = str.split("\\s*,\\s*"); // \\s* 공백이 있던지 없던지
for (String name : names) {
// System.out.printf("[%s]", name.trim());
System.out.printf("[%s]", name);
}
} // main
} // class
Token 예시)
6. Math 클래스
1. 안에 있는 멤버가 전부 다 static 멤버(필드, 메서드) -> 자주 사용하니 객체 생성하지 말고 쓰자
2. 수학 계산과 관련된 메서드
3. 필드 2개 밖에 없다.
ceil(), floor(), round() 사용 예시) 페이징 처리할 때 사용
6-1. StrictMath 클래스
- Math 클래스의 메서드는 JVM에 설치된 OS(부동소수점 처리 방법이 다름)에 따라 다른 결과가 나온다.
-> 성능 향상을 위해 사용
- 성능 포기하더라도 OS 상관없이 동일한 결과를 얻기 위해서 새로운 Math 클래스를 만든 것이 StrictMath 클래스
7. 래퍼(Wrapper) 클래스
- 기본형 8가지를 클래스(필드, 메서드)로 가공해 놓은 것을 [래퍼클래스]라고 한다.
- Integer 클래스 메서드
- [문자열 "100" -> 숫자로 변환하는 방법 3가지]
// 1. Integer.parseInt("100");
// 2. intValue()
Integer i = new Integer("100");
int j = i.intValue();
int i = new Integer("100").intValue(); // 위의 코딩 한줄
// 3. int i = Integer.valueOf("100");
7-1. Number클래스
1. 추상클래스이다.
2. 숫자를 필드(멤버변수)로 갖는 래퍼클래스들의 조상이다. (byte, short, int, long, float, double)
3. 2번 외에 2가지 클래스
ㄴ BigInteger 클래스 : long형보다 더 큰 정수 값의 범위을 다루는 자료형
ㄴ BigDecimal 클래스 : double형보다 더 큰 실수(부동소수점) 값의 범위를 다루는 자료형
8. 오토박싱 & 오토언박싱(autoboxing & autounboxing)
- 오토박싱
기본형이 자동으로 래퍼클래스 타입으로 형변환이 되는 것을 '오토박싱'이라고 한다.
(Object <- Number <- Integer 래퍼클래스 <- (오토박싱) <- int)
- 오토언박싱
래퍼클래스 타입이 기본형으로 자동 형변환 되는 것을 '오토언박싱'이라고 한다.
> Object 타입 객체를 줘야 하는 곳에 기본형을 줘도 문제가 되지 않는 이유 => 오토박싱, 언박싱
disp 메서드)
[참고]
- 리턴자료형 Object => 모든 자료형(타입)을 리턴값으로 사용하겠다.
- 매개변수 자료형 Object => 모든 자료형(타입)을 매개변수로 받겠다.
9. java.util 패키지 안에 있는 클래스
- 유용한(자주 사용되는) 클래스이다.
1) Objects 클래스 : Object를 다룰 때 자주 쓰는 클래스
2) Arrays 클래스 : 배열을 다루는 기능이 구현된 클래스
1) Objects 클래스
Objects 클래스 관련 main() 메서드 내용)
test 메서드)
2) Arrays 클래스
응용하는 코드)
package days21;
import java.io.FileReader;
import java.util.Arrays;
public class Ex09 {
public static void main(String[] args) {
// String.repeat(); JDK 11버전부터~ ***
// [문제] days20.Ex01.java 파일을 읽어서 알파벳이 몇 개 있는지 배열에 저장해서 막대그래프 그리기
String fileName = "days20\\Ex01.java";
// 경로
// ㄴ 절대경로 = C\\temp\\test\\abc.txt;
// ㄴ 상대경로 = 기준점 -> javaPro 프로젝트명 -> .으로 나타냄\
// String 기준경로 = System.getProperty("user.dir"); // System.getProperty("user.dir") => 기준경로를 가져오는 코딩 ***[암기]
// System.out.println(기준경로); // C:\Class\JavaClass\javaPro
String path = String.format("%s\\src\\%s", System.getProperty("user.dir"), fileName); // ***[암기]
// System.out.println(path); // C:\Class\JavaClass\javaPro\src\days20\Ex01.java
int[] counter = new int[26]; // 대소문자 구분없이 A나 a는 0번 째 인덱스에 집어 넣을 것, Z z 는 [25]
// ASCII 문자코드 : A 65, a 97 | Z 90 z 122 -> 65이거나 97이면 [0]번째 값 증가
char one; // 알파벳 한 문자 한 문자를 읽어와서 저장할 변수
int code;
// try-with-resources문
try( FileReader fr = new FileReader(path); ) {
while( (code = fr.read()) != -1 ) { // read()는 읽어서 숫자로 돌려주고 읽을 게 없으면 -1을 돌려줌
// System.out.printf("%d-%c\n",code, (char)code); // 읽어오는지 확인하는 코딩
if('A' <= code && code <= 'Z' || 'a' <= code && code <= 'z') { // Character.isAlphabetic(code);
code = Character.toUpperCase(code); // 읽어온 영문자를 다 대문자로 변환하여 code 변수에 담기 -> 65~90으로 바뀌어짐
counter[code-65]++; // code값이 65면 [0]번째, 66이면 [1]번째, 67이면 [2]번째 에 들어가야 하니까 -65를 해준 것
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Arrays.toString(counter));
// 막대그래프 메서드 호출
for (int i = 0; i < counter.length; i++) {
System.out.printf("[%c] : %s(%d)\n", i+65, printBarGraph('*', counter[i]), counter[i]); // i+65 -> 영문자로 변환하는 코딩
}
// [응용하면 단어 갯수 파악 가능]
} // main
// 막대그래프 그리는 메서드
// printBarGraph('*', 10) => **********
public static String printBarGraph(char style, int length) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append(style);
}
return sb.toString();
}
} // class
// com.util.Rnd.java => com.util 패키지 안에 Rnd 클래스 파일 생성
Rnd 클래스)
10. Random 클래스
Rnd 클래스 관련)
- 클래스 라이브러리(com.util.Rnd와 같은 여러 개 있는 것들을 패키지로 묶은것) => random.jar(확장자)
11. 정규표현식(Regular Expression == regex)
- java.util.regex 패키지 => 정규표현식과 관련된 클래스들
- Matcher, Pattern 두 가지의 클래스가 있다.
1) java.util.regex.Matcher;
2) java.util.regex.Pattern;
예시)
- 정규표현식의 일부를 괄호를 나누어 묶어서 그룹화할 수 있다.
- 그룹화된 부분은 하나의 단위로 묶어서 셈이 된다.
- 한 번 또는 그 이상 반복을 의미하는 + * ? {1,2} . -> 이런 것들이 뒤에 오면 그룹화된 부분이 적용대상이 된다.
// "(0\\d{1,2})-(\\d{3,4})-(\\d{4})";
// 그룹1 그룹2 그룹3
예시)
> 위의 코딩과 같이 그룹화하지 않고 String.mathces() 메서드와 Pattern, Matcher 클래스를 사용하여 풀 수도 있다.
- String.mathces() 메서드 사용)
- Pattern, Matcher 클래스 사용)
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days23 (0) | 2022.03.22 |
---|---|
[SIST] Java_days22 (0) | 2022.03.21 |
[SIST] Java_days20 (0) | 2022.03.17 |
[SIST] Java_days19 (0) | 2022.03.16 |
[SIST] Java_days18_OOP관련 (0) | 2022.03.15 |