초록꼬마의 devlog
article thumbnail

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 클래스 형태의 객체 생성 방법
  1. new 키워드로 생성자 호출: 문자열 내용이 같더라도 다른 주소값 참조 → 메모리 낭비 심해질 수 있어서 사용 지양
  2. 대입연산자를 통해 직접 값을 넣어서 생성: 문자열은 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 클래스

  • 문자열을 배열로 분리시키는 방법
  1. 구분자를 제시해서 해당 문자열을 분리시킴 = 배열 이용
  2. 분리된 각각의 문자열들을 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 시험 공부하기