본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 것으로, 노션 웹을 통해 최적화된 형태로 읽으시길 권장드립니다.(➡️ 노션 링크)

8강 - java.lang 패키지: Object, String, StringBuffer

Untitled

Java.lang 패키지

필수적인 기본 클래스 제공하는 패키지로, import문이 필요없음!

  • Object, String, StringBuffer, Process, Thread, Exception, Throwable, Error, System, Package, Class, Math, 포장클래스(Number, Integer, Double, Character, Boolean 등)

Object 클래스

  • 모든 클래스의 조상으로 이 클래스를 상속받음.
  • 계층구조에서 루트가 되는 클래스.

toString()

  • 객체를 문자열로 표현하여 반환함

    • 클래스이름@16진수해시코드 로 표현
  • 문자열의 +연산, sout에서 필요함.

  • 자식 클래스에서 재정의할 수 있음.(String / Integer)

  • 코드

      class MyClass1 {
    
      }
    
      class MyClass2 extends Object {
    
        //재정의
        public String toString() {
          return "This MyClass2 class";
        }
      }
    
      public class ToString {
    
        public static void main(String[] args) {
          MyClass1 my_class1 = new MyClass1();
          MyClass2 my_class2 = new MyClass2();
    
          System.out.println(my_class1.toString());
          System.out.println(my_class2.toString());
    
          System.out.println(my_class1);
          System.out.println(my_class2);
        }
    
      }
    

equals()

  • 두 객체변수를 비교해, 객체의 ‘참조값’이 같을 때 True를 반환

  • 자식 클래스에서 재정의할 수 있음.

  • 코드

      public class Equals {
    
        public static void main(String[] args) {
          Integer x = Integer.valueOf(5);
          Integer y = Integer.valueOf(10);
          Integer a = 5;
          Short b = 5;
    
          System.out.println(x.equals(y)); //false
          System.out.println(x.equals(a)); //true
          System.out.println(x.equals(b)); //false
          System.out.println(x == y); //false
          System.out.println(x == a); //true
          //System.out.println(x == b); //컴파일 오류 : incomparable types
    
          //cf. Integer Cashing
    
        }
      }
    

clone()

  • 객체를 복제하여 리턴

  • ‘Cloneable 인터페이스를 구현한 클래스’의 객체만 clone() 메소드를 호출할 수 있음.

    • 단, 예외처리(CloneNotSupported)해줘야함.
  • 코드

      package lecture08;
    
      //복제가능한 Box 클래스
      class Box implements Cloneable {
    
        private int width, height;
    
        public Box(int w, int h) {
          width = w;
          height = h;
        }
    
        public int width() {
          return width;
        }
    
        public int height() {
          return height;
        }
    
        public Object clone() {
          try {
            return super.clone();
          } catch (CloneNotSupportedException e) {
            return null;
          }
        }
      }
    
      public class Clone {
        public static void main(String args[]) {
          Box b1 = new Box(20, 30);
          Box b2 = (Box) b1.clone(); //복제
    
          System.out.println(b2.width());
          System.out.println(b2.height());// b1과 값은 같다.
          System.out.println(b1);
          System.out.println(b2); //b1과의 식별값은 다르다.
        }
      }

getClass()

  • 현재 객체의 유형/정보를 가진 Class객체 리턴.

  • Class 클래스는 정보 확인을 위한 메소드 제공

  • 메소드 코드

      package lecture08;
    
      public class GetClass {
    
        public static void main(String[] args) {
          Box box = new Box(50, 50);
    
          System.out.println("클래스 이름 : " + box.getClass());
          System.out.println("슈퍼클래스 이름 : " + box.getClass().getSuperclass().getName());
          System.out.println("필드 목록");
          for (int i = 0; i < box.getClass().getDeclaredFields().length; i++) {
            System.out.println(box.getClass().getDeclaredFields()[i]);
          }
    
          System.out.println("메소드목록");
          for (int i = 0; i < box.getClass().getDeclaredMethods().length; i++) {
            System.out.println(box.getClass().getDeclaredMethods()[i]);
    
          }
        }
      }
    

    Untitled


String 클래스

  • 문자열을 표현/처리하기 위한 클래스

    String s1 = new String(”Java”); //객체 생성

  • String 클래스는 기본 자료형 처럼 사용 가능.

    String s2 = “Java”; // 리터럴 대입

  • 한번 만들어지면 내용이 변하지 않는(immutable) 상수 객체.

String 클래스의 메소드

문자열 비교 메소드

int compareTo(String anotherString)

  • 두 문자열이 같으면 0을 리턴, 다르면 0이 아닌 정수 리턴

int compareToIgnoreCase(String aS)

  • 대소문자 무시하고 비교

boolean equals(Object anObject)

  • 두 ‘문자열’을 비교 → 같으면 true

boolean equalsIgnoreCase(String aS)

  • 대소문자 무시하고 비교

문자열 검색 메소드

int indexOf(String str)

  • 처음 위치부터 문자열을 찾아 처음 등장하는 위치를 리턴.
  • 없으면 -1 리턴

int indexOf(String str, int fromIndex)

  • fromIndex위치부터 str을 찾음, 처음 등장하는 위치를 리턴. 없으면 -1

int lastIndexOf(String str) / int lastIndexOf(String str, int fromIndex)

  • 마지막 위치부터 앞 방향으로 찾음

문자열 추출 메소드

char charAt(int index)

  • index 위치에 있는 문자를 리턴

String substring(int beginIndex)

  • beginIndex위치부터 마지막까지 문자열 리턴

String substring(int beginIndex, int endIndex)

  • begin 부터 endIndex-1 까지의 문자열 리턴

문자열 변환 메소드

***원본 문자열은 변환되지 않음! 새로운 객체가 만들어짐.

String replace(char oldChar, char newChar)

  • oldChar문자를 newChar문자로 변환하여 리턴

String trim()

  • 문자열의 앞뒤 공백 제거한 새 문자열 반환

String toUpperCase()

  • 문자열의 모든 문자 대문자로 변환한 새 문자열 반환

String toLowerCase()

  • 문자열의 모든 문자 소문자로 변환한 새 문자열 반환

String concat(String str)

  • 현재 문자열에 다른 문자열 연결한 새 문자열 반환

기타

boolean startsWith(String prefix)

  • prefix로 시작하면 true로 리턴

boolean endsWith(String suffix)

  • suffix로 끝나면 true리턴

char[] toCharArray()

  • 문자 배열로 변환하여 리턴함.

String 클래스의 문제점

문자열이 빈번하게 변경될 때, String은 immutable클래스이기 때문에 기존 String은 놔둔 채 새로운 String 객체가 계속 생성된다. → 메모리 낭비, 실행 속도 저하.

따라서! StringBuffer, StringBuilder클래스를 사용.

  • String, StringBuffer, StringBuilder 클래스의 시간비교

      package lecture08;
    
      public class StringCompare {
    
        public static void main(String[] args) {
          final String tmp = "abcde";
          long start, end;
          String str = new String();
          StringBuffer sb1 = new StringBuffer();
          StringBuilder sb2 = new StringBuilder();
          start = System.nanoTime();
          for (int i = 0; i < 10000; i++) {
            str = str + tmp;
          }
          end = System.nanoTime();
          System.out.println("String" + (end - start) / 1000000.0 + " msecs");
          start = System.nanoTime();
          for (int i = 0; i < 10000; i++) {
            sb1.append(tmp);
          }
          end = System.nanoTime();
          System.out.println("String 버퍼" + (end - start) / 1000000.0 + " msecs");
          start = System.nanoTime();
          for (int i = 0; i < 10000; i++) {
            sb2.append(tmp);
          }
          end = System.nanoTime();
          System.out.println("String 빌더" + (end - start) / 1000000.0 + " msecs");
        }
    
      }
    

실행결과

실행결과

빠른 순서 : String < StringBuffer < StringBuilder

StringBuffer는 동기화 기능 지원 → 더 많은 오버헤드가 발생→ StringBuilder보다 성능이 떨어질 수 있다.


StringBuffer 클래스

: 객체 생성 이후 문자열을 ‘변경’할 수 있는 클래스

  • 내용 변경이 가능한 mutable 클래스!

내부적으로 문자열을 저장하기 위해, 크기가 조절되는 buffer를 사용함.

메소드

int capacity()

  • 버퍼의 크기를 리턴

int length()

  • 문자열의 길이를 반환

char charAt(int index)

  • 인덱스 위치의의 문자를 반환

int indexOf(String str)

  • str로 시작하는 위치의 인덱스를 반환

String substring(int beginIndex, int endIndex)

  • start부터 end-1 까지의 문자열을 반환

StringBuffer append(char c)

  • 문자열 끝에 문자 c 추가한 후 StringBuilder 반환

StringBuffer delete(int start, int end)

  • start부터 end-1 까지의 문자를 삭제

StringBuffer insert(int offset, String str)

  • offset위치에 문자열을 삽입

StringBuffer replace(int start, int end, String str)

  • start부터 end-1 까지의 문자열을 str로 대체

StringBuffer reverse()

  • 문자열을 역순으로 변환

포장 클래스

: 기본형을 참조형으로 표현하기 위한 클래스

기본형과 상응하는 객체(ex. int와 Integer)사이의 형변환 기능

  • int → Integer 를 박싱, Integer를 int는 언박싱!

종류

Byte, Short, Integer, Long, Float, Double, Charachter, Boolean

언제 사용하나?

  • 메소드 인자로 객체가 필요할 때
  • Number의 자식 포장 클래스가 제공하는 상수를 사용할 때
    • 상수? → Integer.MIN_VALUE, Integer.MAX_VALUE 등.
  • 기타 클래스가 제공하는 다양한 메소드를 사용할 때

Number 클래스

숫자를 표현하는 클래스, Byte, Short, Integer, Long, Float, Double의 추상 부모 클래스

각각의 자식클래스에서는 아래 종류와 같은 메소드를 구현해놓음.

-박싱, 언박싱, String 변환/역변환(valueOf/parse**), 기본형과의 비교(compareTo), 형태까지 비교(equals) 등.

Integer 클래스의 경우

Integer, String, int사이의 변환기능

  • int parseInt(String s) : String을 int로
  • String toString(int i) : int를 String으로
  • Integer valueOf(int i) : int를 Integer로
  • String toString() : Integer를 String으로
  • Integer valueOf(String s) : String을 Integer로.

자동 박싱 / 언박싱

인자에 전달되거나 / 변수에 대입될 때 기본형→포장형 (박싱) / 포장형→ 기본형(언박싱)으로 자동 변환됨

System 클래스

: Java 플랫폼, 시스템과 관련된 기능 제공.(클래스필드/메소드)

  • 모든 멤버는 static ⇒ 사용시 객체 생성할 필요 없음.

종류

  • 표준 입/출력
  • JVM또는, 운영체제 속성과 환경변수의 사용/제어
  • 배열 복사, 시간조회 등

Scanner에서 그토록 많이 봤던…

System.in 의 정체는?

표준 입력 스트림으로, InputStream유형이다.

키보드로 부터 입력을 받을 때 사용!

*System.Out은 표준 출력 / 화면에 데이터를 출력할 때 사용.(PrintStream)

System.err : ‘표준 에러 출력 스트림’ / 오류메시지를 화면에 출력.