핑구

09. 기본 API 본문

JAVA 웹 개발/1. JAVA

09. 기본 API

코딩 펭귄 2022. 5. 10. 16:21
📅 2021.08.27

API (Application Programm Interface)

  • API : 라이브러리에 접근하기 위한 규칙들을 정의한 것을 말한다.

 

String 관련 클래스

  • String 클래스 : 문자열 관련 클래스로, 저장된 문자열을 수정할 수 없다. immutable(불변)
    변수에 저장된 문자열을 변경하는 경우 해당 문자열이 수정되는 것이 아니라 새로운 공간에 새로운 문자열이 할당되며, 변수에 저장된 주소값이 새로운 주소값으로 대체된다.

    수정이 이루어질 때마다 heap 영역에 새로운 공간을 할당하는 방식이기 때문에 공간에 불필요한 할당이 계속 생기며, 그렇게 되면 가비지 컬렉터가 계속 지워주는 일을 하게 된다.(메모리적으로 손실이 생긴다.)
    변경이 적고 읽기가 많은 경우에 적합하다.

    String은 워낙 많이 사용되기 때문에 사용할 때마다 heap 영역에 공간을 만들게 되면 메모리의 낭비가 생긴다. 따라서 heap 메모리 영역에 존재하는 String pool(= constant pool, literal pool) 영역에 String을 담아 놓고, 값이 같은 String이 존재하는 경우 먼저 만들어진 문자열의 주소 값을 이후에 만들어진 같은 문자열들이 공유한다. 따라서 같은 문자열의 경우 참조하는 주소 값이 같다.

    하지만 new를 이용하여 새로운 객체를 생성한 후 같은 문자열을 넣는 경우에는 주소 값이 달라진다. 그 이유는 new 연산자는 새로운 공간에 객체를 할당한다는 의미이기 때문이다.

    String은 객체 자체를 println() 메소드를 이용하여 출력하여도 주소 값이 나오지 않고, 저장되어 있는 데이터가 출력된다. 이를 통해 String 클래스의 toString() 메소드가 데이터 값을 출력하도록 오버라이딩 된 것을 알 수 있다. 따라서 String의 주소 값을 출력하는 경우에는 System 클래스의 identityHashCode() 메소드를 사용하여야 한다.
    String str1 = "java";
    String str2 = "java";
    String str3 = new String("java");
    
    System.out.println("str1의 실주소값 : " + System.identityHashCode(str1));
    // 1829164700
    System.out.println("str2의 실주소값 : " + System.identityHashCode(str2));
    // 1829164700
    System.out.println("str3의 실주소값 : " + System.identityHashCode(str3));
    // 2018699554
    

    하지만 주소 값과는 다르게 해시코드는 같은 문자열인 경우 모두 같은 해시 코드가 출력된다. 해시코드를 출력하기 위해 사용되는 메소드는 hashCode() 메소드인데, 이 메소드의 특징 중 하나는 만약 두 객체가 equals() 메소드를 통해 같은 값이라도 판단되는 경우에는 같은 int 값을 생성하는 것이기 때문이다.
    • String 클래스의 메소드
      1. charAt(int index):char
        String의 index번째에 있는 char를 반환한다.
      2. concat(String str):String
        본래 값 뒤에 str을 추가해 준다. 하지만 String의 경우 해당 메소드를 사용하지 않더라도 str += "!!!"의 형태로도 문자열 추가가 가능하다.
      3. equals():boolean
        문자열의 값을 비교해 준다. 문자열의 값은 항상 equals() 메소드로 비교해 주어야 하며, 비교 연산자 ==을 이용해 비교하는 경우 주소 값이 비교된다.
      4. subString(int beginIndex):String
        subString(int beginIndex, int endIndex):String
        오버로딩이 되어 있는 메소드로, endIndex 값을 입력하지 않는 경우 beginIndex부터 문자열 끝까지를 반환하며, endIndex가 존재하는 경우 beginIndex ≤ str < endIndex 범위의 문자열을 반환한다.
      5. replace(char oldChar, char newChar):String
        oldChar로 입력받은 문자를 newChar로 대체한 후 문자열을 반환한다.
      6. toUpperCase()/toLowerCase():String
        문자열을 모두 대문자 혹은 모두 소문자로 변경하여 반환한다. 소문자로 입력하든 대문자로 입력하든 같은 경우가 출력되어야 하는 경우 주로 사용한다.
      7. equalsIgnoreCase():boolean
        대소문자를 구분하지 않고 문자열을 비교한다. 따라서 h와 H를 비교하는 경우 true가 반환된다.
      8. trim():String
        문자열의 앞/뒤에 있는 빈 공간(공백)을 제거하여 반환한다. 사용자의 실수로 공백이 입력되어 오류가 생기는 경우를 방지하기 위해 주로 사용된다.
      9. split(String str):String[]
        문자열을 str을 기준으로 나누어 주는 메소드이다. StringTokenizer 클래스와 비슷한 기능을 하나, 구분자가 여러 개인 경우 StringTokenizer와는 다르게 정규 표현식을 이용하여야 한다.
      10. String str2 = "Apple,Banana-Cream*Dessert#Egg Fruits"; String[] strArr = str2.split(",-*# "); // 구분자를 통째로 인식하여 나눠지지 않음 String[] strArr = str2.split(",|-|*|#| "); // 정규 표현식
  • StringBuffer 클래스 : 문자열 값을 새로운 주소로 받아오지 않고 수정이 가능하다. 기존 문자열 내에서 수정, 삭제가 이루어진다. mutable(가변)
    쓰레드 safe기능(동기화 기능)을 제공한다. 동기화 기능이란 여러 프로그램들이 충돌하기 않게 하나씩 줄을 세워 주는 기능이다. 하지만 충분히 여러 프로그램을 한꺼번에 실행할 수 있는 경우에는 이것이 성능 저하 요인이 되기도 한다.
    아무 문자열 없이 생성하는 경우 기본적으로 16개의 문자가 들어갈 수 있도록 만들어지며, 이후 사용 시 용량이 감당되는 경우 늘어나지 않고, 부족한 경우에는 용량이 자동으로 늘어난다.
    • StringBuffer 클래스의 메소드 
      1. append(String str):StringBuffer
        값을 추가하는 메소드로 무조건 맨 뒤에 값을 추가한다.
      2. insert(int offset, String str):StringBuffer
        offset 부분에 내가 원하는 위치(인덱스)를 입력하여 해당 부분에 새로운 문자열 str을 추가한다.
      3. delete(int start, int end):StringBuffer
        start ≤ index < end 범위의 문자열을 삭제한다.
      4. reverse():StringBuffer
        문자열을 거꾸로 만들어 준다.
  • StringBuilder 클래스 : StringBuffer와 동일하나, 쓰레드 safe 기능을 제공하지 않는다.
  • StringTokenizer 클래스 : String 클래스에서 제공하는 split() 메소드와 같은 기능을 하는 클래스로 생성 시 전달받은 문자열을 구분자로 나누어 각 토큰에 저장한다.
    분리된 문자열을 배열이 아닌 토큰에 저장하기 떄문에 인덱스가 존재하지 않으므로 for문으로는 출력이 어려우며, while문과 hasMoreTokens() 메소드를 이용해 출력한다.
    • StringBuffer 클래스의 메소드
      • hasMoreTokens():boolean
        다음 토큰(분리된 문자열)이 있는 경우 true를 반환하는 메소드이다.
      • nextToken():String
        토큰이 있는 경우 다음 값을 반환하는 메소드이다. 
        while(st.hasMoreTokens()) {
        	System.out.println(st.nextToken());
        }
        
        여러 개의 구분자가 있는 경우에도 같은 방법으로 문자열의 분리가 가능하다.
        String str2 = "Apple,Banana-Cream*Dessert#Egg Fruits";
        StringTokenizer st2 = new StringTokenizer(str2, ",-* #");
        

 

메소드 체이닝

  • 메소드 체이닝 : 메소드를 여러 개 붙여서 사용하는 것을 말한다. 사용하는 메소드의 반환값이 객체라면 해당 객체에 존재하는 다른 메소드를 또 다시 사용할 수 있다.
    buffer3.append("abc").append("def");
    sc.nextLine().charAt(0);
    

 

향상된 for문(for-each)

  • 배열의 인덱스를 이용하지 않고, 처음부터 끝까지 하나하나 돌기만 하면 되는 경우에 사용된다.
    조건식에 선언된 변수에 해당 배열의 값을 차례로 하나씩 임시로 담아 사용한다.
    for(String s : strArr) { // strArr에 있는 변수를 하나씩 꺼내서 s에 임시로 담음
    	System.out.println(s); // 임시로 담은 것을 출력
    }
    

 

Wrapper 클래스

  • Primitive Data Type(= 원시 타입, 기본 자료형)을 객체화해 주는 클래스이다.
    기본 자료형은 값 자체이므로 .을 이용해 메소드를 가져와 사용할 수 없기 때문에 기본 자료형을 객체로 만들어 주어서 메소드를 사용할 수 있게 해 준 것이다.
  • boxing: 원시 타입을 클래스 타입으로 바꿔 주는 것을 boxing이라고 한다.
    Integer integer1 = new Integer(num1);
  • unboxing: 클래스 타입을 원시 타입으로 바꿔 주는 것을 언박싱이라고 한다.
    int num2 = integer1.intValue();
  • auto-boxing: JDK1.5 버전부터 제공하며, new를 이용해 객체를 만들거나, 메소드를 사용하지 않아도 자동으로 박싱/언박싱을 진행해주는 것을 말한다.

 

날짜 관련 클래스

  • Date 클래스: 시스템으로부터 현재 날짜, 시간, 정보를 가져와 다룰 수 있게 만들어진 클래스이다. JDK 1.1 버전에 만들어진 클래스로 문제가 많아 현재는 생성자 2개를 제외하고는 모두 deprecated 되었다.
    Calendar 클래스 혹은 GregorianCalendar 클래스를 대신 사용하는 것을 권장하나, 해당 클래스에서 데이터를 가져와 Date 클래스를 이용해 가공할 수 있기 때문에 아직 많이 사용된다.
    Date 클래스 내의 getTime() 메소드를 이용해 현재 시간을 밀리세컨드로 변경하여 보관, 활용할 수 있다.
  • Calendar 클래스: 생성자가 protect이며 추상 클래스이기 때문에 new 연산자를 이용해 객체 생성이 불가능하다. 따라서 getInstance() 메소드를 이용하여 객체를 생성하여야 한다.
    Calendar 클래스에서 달(Month)을 가지고 오는 경우에는 +1을 해 주어야 정확한 달을 출력할 수 있다. 달의 경우에는 0부터 시작하기 때문이다.
  • GregorianCalendar 클래스: Calendar 클래스의 후손 클래스로 년, 월, 일, 시, 분, 초 정보를 필드를 이용하여 다룰 수 있다.
    클래스 내의 getTimeInMillis() 메소드를 이용하여 특정 시각을 밀리 세컨드로 변환 가능하다.

 

Format 관련 클래스

  • SimpleDateFormat 클래스: Date 클래스의 날짜, 시간 정보를 원하는 포멧으로 바꾸어 출력할 수 있는 메소드로 java.text 패키지에 존재한다.
  • 24시간 형식으로 출력하고 싶은 경우 hh를 HH로 변경하여 포멧을 만들면 된다.

 

Math 클래스

  • 여러가지 계산이 필요할 경우에 사용한다.
  • 싱글톤 패턴의 구성이다.
    싱글톤 패턴이란 static을 이용하여 애플리케이션이 시작할 때 딱 한 번만 인스턴스를 만들어 메모리를 할당하며, 딱 한 번 만든 인스턴스를 사용하게 하는 패턴이다.
    생성자가 private이기 때문에 객체를 생성할 수 없고, final 클래스이므로 상속 또한 불가능하다.
    모든 멤버가 public static이기 때문에 생성자로 객체를 생성하지 않아도 사용이 가능하다.
  • Random 클래스 : Math.random과 같은 기능을 하는 메소드로 랜덤한 숫자를 출력해 준다.

'JAVA 웹 개발 > 1. JAVA' 카테고리의 다른 글

11. 입출력(IO)  (0) 2022.05.13
10. 예외 처리  (0) 2022.05.13
08. 다형성  (0) 2022.05.10
07. 상속  (0) 2022.05.10
06. 객체 배열  (0) 2022.05.10