2021.11.15(월)
🌿 API
- Application Programming Interface
- 프로그램/applications를 프로그래밍하기 위한 인터페이스
- 언어적 측면에서 제공 + 사용자는 세부(구성)내용 몰라도 됨
- API의 메소드는 오버로딩이 많이 되어있음 + 사용 가능한 메소드 종류, 사용법 등 잘 모르겠으면 API 문서를 먼저 찾아보기
🌿 java.lang 패키지
🌱 Object 클래스
- 모든 클래스의 최상위 = 모든 클래스는 Object 클래스를 상속받음
- 모든 클래스는 Object 타입으로 형 변환 가능
🌱 Math 클래스
- 모든 필드와 메소드(의 접근제한자)가 static으로 되어있음 → static 메모리 = 프로그램 시작~끝 사용 가능, 객체 생성 필요없이 사용 가능 → 굳이 생성자 필요없는 바, 생성자(의 접근제한자) = private
'모든 것이 static으로 되어있음' = Singleton(싱글톤) design pattern: 프로그램 실행과 동시에 메모리 영역에 올려놓고 재사용 → 객체 사용 시 새로운 객체를 계속 생성해서 사용(x) 객체 하나만으로/하나의 객체만 생성해 어디에서든지 가져다 쓸 수 있음, 공유 + 재사용(o)
- 필드: 상수로 정의되어 있음
- 메서드: ceil(), round(), floor(), abs(), min(), max(), sqrt(), pow() 등
🌱 String 클래스
- 참조자료형 = 4bytes 크기
- 불변/변하지 않는/immutable 클래스 = 수정하는 순간 기존의 값이 담겨져있는 공간에서 수정되지 않음, 아예 수정이 안 되는 게 아니라, 매번 새로운 주소값을 참조함
- String 클래스 형태의 객체 생성 방법
- new 키워드로 생성자 호출: 문자열 내용이 같더라도 다른 주소값 참조 → 메모리 낭비 심해질 수 있어서 사용 지양
- 대입연산자를 통해 직접 값을 넣어서 생성: 문자열은 String Pool(동일한 내용의 문자열 존재 불가능)에 들어감 → 문자열 내용이 같으면 같은 주소값 참조 vs 문자열이 수정되면 heap 영역에 새로운 공간 할당하고 새로운 객체가 생김 = 주소값이 바뀜 = 비효율적인 메모리 사용
- StringBuffer(thread-safe), StringBuilder = 문자열 수정 시 보다 효율적인 메모리 활용을 위해 buffer(임시 공간) 준비해서 임시 공간에 차곡차곡 담아두었다가 한 번에 처리해주는 클래스 → 문자열 수정(append) 시 같은 주소값을 참조하며 내용물이 바뀜
- 메서드: charAt(int index), concat(String str), length(), substring(int beginindex(, int endindex)), replace(char old, char new), trim(), split(String 구분자), toUpper/LowerCase(), toCharArray() 등
🌿 java.util 패키지
🌱 StringTokenizer 클래스
- 문자열을 배열로 분리시키는 방법
- 구분자를 제시해서 해당 문자열을 분리시킴 = 배열 이용
- 분리된 각각의 문자열들을 token으로 취급함 = token 이용 ←
StringTokenizer stn = new StringTokenizer(문자열, 구분자);
public class C_StringTokenizerTest {
String str = "Java,강해피,Oracle,JDBC,내일 시험,행복하다"; // str = 필드/멤버변수 + 순서가 있는 문자의 집합
// 방법1) 배열 사용
public void method1() {
String[] sArr = str.split(",");
// 향상된(enhanced) for문/for each문: 초기식, 조건식, 증감식 필요 없음 cf. Java의 정석 p.166
// 표현법: for (값을 받아줄 변수 선언 : 순차적으로 접근한 배열) { }
// 단점: 배열의 값 수정 불가능; 출력만 가능 -> 용도에 맞게 쓰면 됨
for (String s : sArr) {
System.out.println(s);
}
}
// 방법2) token 사용
public void method2() {
StringTokenizer stn = new StringTokenizer(str, ",");
System.out.println("분리된 문자열의 개수 : " + stn.countTokens()); // 분리된 문자열의 개수 : 6
// countTokens() = 분리된 문자열의 개수를 반환해주는 메소드
/*
// 실제로 분리된 내용물을 보고 싶다면 -> nextToken() = 토큰의 내용 하나씩 보여주는 메소드
System.out.println(stn.nextToken()); // Java
System.out.println(stn.nextToken()); // 강해피
System.out.println(stn.nextToken()); // Oracle
System.out.println(stn.nextToken()); // JDBC
System.out.println(stn.nextToken()); // 내일 시험
System.out.println(stn.nextToken()); // 행복하다
// 여기서 남아있는 토큰이 없을텐데, 또 nextToken() 호출하면
System.out.println(stn.nextToken());
// NoSuchElement(요소)Exception; 더 이상 꺼내올 토큰(요소)가 없어서 발생하는 오류
*/
// 중복을 줄여 더 좋은 codes로 만들기 위해 반복문 사용 -> 보통 토큰 출력 시에는 while문 사용
/*
for (int i = 0; i < stn.countTokens(); i++) {
System.out.println(stn.nextToken());
}
*/
while(stn.hasMoreTokens()) {
// hasMoreTokens() = stn에 남아있는 토큰이 있으면 true vs 토큰이 다 빠졌으면 false
System.out.println(stn.nextToken());
}
}
}
📗 소감
- String이 이렇게 복잡한? 성질을 가진 클래스인지 몰랐다. 하지만 많이 쓰이는 중요한 클래스이니, 꼼꼼히 이해하며 공부해 두자
- String 관련 다양한 메서드들도 익혀두어 문자열 처리 시 유용하게 활용하자
- 메모리에 대해 생각하는 것은 어렵지만, 신기하고 더 잘 알고 싶다. 추가 자료를 찾아서 공부해 봐야겠다
📗 homework: SQL 시험 공부하기
'back-end dev > Java' 카테고리의 다른 글
[KH정보교육원] 27일차_Wrapper클래스, Input/Output (0) | 2021.11.17 |
---|---|
[KH정보교육원] 26일차_String클래스 실습 (1) | 2021.11.16 |
[KH정보교육원] 19일차_추상클래스 (0) | 2021.11.09 |
[KH정보교육원] 21일차_미니팀프로젝트 (0) | 2021.11.09 |
[KH정보교육원] 15일차_평가 및 미니팀프로젝트 (0) | 2021.11.07 |