0%

StringBuffer클래스

  • String처럼 문자형 배열(char[])을 내부적으로 가지고 있음
  • String은 불변이지만 StringBuffer은 변경가능
  • 배열은 길이 변경불가. 공간이 부족하면 새로운 배열을 생성해야 함
  • stringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 함
1
StringBuffer sb = new StringBuffer("aaa")
2
sb.append("123").append("ZZ");
3
4
sb = "aaa123ZZ"
  • StringBuffer는 equals()가 오버라이딩되어있지 않아서 String으로 변환 후 equals()로 비교해야 함

StringBuffer의 생성자와 메서드

  • StringBuffer()
    • 16문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성
  • StringBuffer(int length)
    • 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성
  • StringBuffer(String str)
    • 지정된 문자열 값을 갖는 StringBuffer인스턴스를 생성
  • StringBuffer delete(int start, int end)
    • 시작위치부터 끝위치 사이에 있는 문자를 제거
  • StringBuffer deleteCharAt(int index)
    • 지정된 위치의 문자를 제거
  • StringBuffer insert
    • 두번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치에 추가. pos는 0부터 시작
  • int length()
    • StringBuffer인스턴스에 저장되어 있는 문자열의 길이를 반환
  • StringBuffer replace(int start, int end, string str)
    • 지정된 범위의 문자들을 주어진 문자열로 바꿈. end위치의 문자는 범위에 포함 되지 않음
  • StringBuffer reverse()
    • StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열
  • void setCharAt(int index, char ch)
    • 지정된 위치의 문자를 주어진 문자로 바꿈
  • void setLength(int newLength)
    • 지정된 길이의 문자열의 길이를 변경. 길이를 늘리는 경우에 나머지 빈 공간을 널문자(‘\u0000’)로 채움
  • String toString()
    • StringBuffer인스턴스의 문자열을 String으로 반환
  • String substring(int start, int end)
    • 지정된 범위내의 문자열을 String으로 뽑아서 반환함. 시작위치만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환

image

String클래스의 생성자와 메서드

  • String(StringBuffer buf)
    • StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성
  • char charAt(int index)
    • 지정된 위치에 있는 문자를 알려줌
  • int compareTo(String str)
    • 문자열을 사전순서로 비교함 같으면 0 사전순으로 이전이면 음수를, 이후면 양수를 반환
  • String concat(String str)
    • 문자열을 뒤에 덧붙임
  • boolean contains(CharSequence s)
    • 지정된 문자열이 포함되었는지 검사
  • boolean endWith(String suffix)
    • 지정된 문자열로 끝나는지 검사
  • boolean startWith(String prefix)
    • 주어진 문자열로 시작하는지 검사
  • boolean equals
    • 매개변수로 받은 문자열과 String인스턴스의 문자열을 비교. obj가 String이 아니거나 문자열이 다르면 false를 반환
  • int indexOf(int ch, int pos)
    • 주어진 문자가 문자열에 존재하는지 지정된 위치부터 확인하여 위치를 알려줌. 못 찾으면 -1을 반환함
  • int indexOf(String str)
    • 주어진 문자열이 존재하는지 확인하여 그 위치를 알려줌
  • int lnegth()
    • 문자열의 길이를 알려줌
  • String[] split(String regex)
    • 문자열을 지정된 분리자로 나누어 문자열 배열에 담아 반환
  • String substring(int begin, int end)
    • 주어진 시작위치부터 끝 위치범위에 포함된 문자열을 얻음. 이 때, 시작위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않음
  • String toLowerCase()
    • 모든 문자열을 소문자로 변환하여 반환
  • String toUpperCase()
    • 모든 문자열을 대문자로 변환하여 반환
  • String trim()
    • 왼쪽끝, 오른쪽끝에 있는 공백을 없앤 결과를 반환. 이 때 문자열 중간에 있는 공백은 제거되지 않음

String클래스

  • StringClass = 데이터[char[]] + 메서드(문자열 관련)
1
public final class String implements java.io.Serializable, Comparable {
2
  private char[] value;
3
  ....
4
}
  • 내용을 변경할 수 없는 불변(immutable) 클래스
  • 뎃셈연산자(+)를 이용한 문자열 결합은 성능이 떨어짐
  • 문자열의 결합이나 변경이 잦다면, 내용 변경 가능한 StringBuffer를 사용(ex.for문)

문자열 리터럴

  • 문자열 리터럴은 프로그램 실행시 자동으로 생성됨(constanct pool에 저장)
  • 같은 내용의 문자열 리터럴은 하나만 만들어짐

빈 문자열(“”, empty string)

  • 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열

    • String str = ""; //str을 빈 문자열로 초기화
      <!--1-->
  • 문자(char)와 문자열(String)의 초기화

Object클래스

  • 모든 클래스의 최고 조상, 오직 11개의 메서드만을 가지고 있음

getClass()

  • 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환 함

equals(Object obj)

  • 객체 자신(this)과 주어진 객체(obj)를 비교함. 같으면 true 다르면 false
  • Object클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)

image

image

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 함
  • equals()의 결과가 true인 두 객체의 해시코드는 같아야 함
1
String str1 = new String("abc");
2
String str2 = new String("abc");
3
System.out.println(str1.equals(str2)); //true
4
System.out.println(str1.hashCode()); // 96354
5
System.out.println(str2.hashCode()); // 96354

toString(), toString()의 오버라이딩

  • toString(): 객체를 문자열(String)으로 변환하기 위한 메서드

image

연결된 예외

  • 한 예외가 다른 예외를 발생시킬 수 있음
  • 예외 A가 예외 B를 발생시키면 A는 B의 원인 예외(cause exception)
1
Throwable initCause(Throwable cause) // 지정한 예외를 원인 예외로 등록
2
Throwable getCause() // 원인예외를 반환

사용이유

  • 여러 예외를 하나로 묶어서 다루기 위함
1
try {
2
  install();
3
} catch(ScpaceException e) {
4
  e.printStackTrace();
5
} catch(MemoryException e) {
6
  e.printStackTrace();
7
} cetch(Exception e) {
8
  e.printStackTrace();
9
}
1
try {
2
  install();
3
} catch(InstallException e) {
4
  e.printStackTrace();
5
} catch(Exception e) {
6
  e.printStackTrace();
7
}
1
void install() throws InstallException {
2
  try {
3
    startInstall();
4
    copyFiles();
5
  } catch (SpaceException e) {
6
    InstallException ie = new InstallException("설치중 예외발생");
7
    ie.initCause(e);
8
    throw ie;
9
  } catch (MemoryException me) {
10
    ......
11
  }
12
}
  • checked예외(필수처리)를 unchecked예외(선택처리)로 변경하려 할 때 사용
1
static void startInstall() throws SpaceException, MemoryException {
2
  if(!enoughSpace())
3
    throw new SpaceException("설치할 공간이 부족합니다.");
4
  if(!enoughMemeory())
5
    throw new MemoryException("메모리가 부족합니다.");
6
}
1
static void startInstall() throws SpaceException {
2
  if(!enoughSpace())
3
    throw new SpaceException("설치할 공간이 부족합니다.")
4
  if(!enoughMemory())
5
    throw new RuntimeException(new MemoryException("메모리가 부족합니다.")); // 원인 예외로 등록
6
}

사용자 정의 예외 만들기

  • 우리가 직접 예외 클래스를 정의할 수 있음
  • 조상은 ExceptionRuntimeException중에서 선택
1
class MyException extends Exception {
2
  MyException(String msg) { // 문자열을 매개변수로 받는 생성자
3
    super(msg) // 조상인 Exception클래스의 생성자를 호출
4
  }
5
}

예외 되던지기(exception re-throwing)

  • 예외를 처리한 후에 다시 예외를 발생시키는 것
  • 호출한 메서드와 호출된 메서드 양쪽 모두에게 예외처리하는 것
  • 분담처리할때 사용하는 경우가 많음
1
class example {
2
  public static void main(String[] args) {
3
    try {
4
      method1();
5
    } catch (Exception e) {
6
      System.out.println("main메서드에서 예외가 처리되었습니다.");
7
    }
8
  } // main메서드의 끝
9
  
10
  static void method1() throws Exception {
11
    throw new Exception();
12
  } catch (Exception e) {
13
    System.out.println("method1메서드에서 예외가 처리되었습니다.");
14
    throw e;
15
  } // method1메서드의 끝
16
}

메서드에 예외 선언하기

  • 예외를 처리하는 방법: try-catch문, 예외 선언하기
  • 메스가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것
1
void method() throws Exception, Exception2, ... ExceptionN {
2
  // 메서드의 내용
3
}
1
void method() throws Exception {
2
  // 메서드의 내용
3
}

image

finally블럭

  • 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣음
  • try블럭안에 returnanㄴ이 있어서 try블럭 벗어나갈 때도 finally블럭이 실행됨
1
try {
2
  
3
} catch (Exception1 e1) {
4
  
5
} finally {
6
  
7
}

예외 발생시키기

  • 연산자 new를 사용해서 발생시키려는 예외 클래스의 개게를 만든 다음Exception e = new Exception("예외 발생시키기");
  • 키워드 throw를 이용해서 예외를 발생시킴throw e;

image

checked예외, unchecked예외

  • checked예외: 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)
  • unchecked예외: 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)
1
class test1 {
2
  public static void main(String[] agrs){
3
   throw new Exception(); // Exception을 고의로 발생시킴
4
  }
5
}
1
class test2 {
2
  public static void main(String[] agrs){
3
    throw new RuntimeException(); // RuntimeException을 고의로 발생시킴
4
  }
5
}
  • 런타임에러
    • Error
    • Exception
      • Exception과 자손: 체크드예외(필수)
      • RuntimeException과 자손: 언체크드예외(선택)

image

printStackTrace()와 getMessage()

  • printStackTrace(): 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력함
  • getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음

image

멀티 catch블럭

  • 내용이 같은 catch블럭을 하나로 합친 것
1
try {
2
  ...
3
} catch (ExceptionA | ExceptionB e) {
4
  e.printStackTrace();
5
}

try-catch문

  • 예외의 발생에 대비한 코드를 작성하는 것
1
try {
2
  // 예외가 발생할 가능성이 있는 문장들을 넣음
3
} catch (Exception1 e1) {
4
  // Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣음
5
} catch (Exception2 e2) {
6
   // Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 넣음
7
} catch (Exception3 e3) {
8
   // Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 넣음
9
}
  • 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감
  • 일치하는 catch블럭이 없으면, 예외는 처리 안됨
  • Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch블럭)

image