프로그래밍을 배우고 취직 한 지 9개월이 지난, 지금까지 제일 많이 본 예외처리 두 개가 있다. 그건 바로

NullPointException
integer cannot be cast to java.lang.string

특히 저 NullPointerException 은 이젠 내 친구같다 ^^;;

저 exception이 뜨는 이유의 80% 이상은 null 체크를 하지 않고 형변환을 해서 그렇다.


String 형변환 (Object to String)

1. (String)Object

  • 이것은 NullPointerException 이 뜨질 않는다.
  • 모든 타입을 String으로 강제 변환을 한다.
  • 다만, Object 가 null 값이라면 null 로 된다. 문자열 “null”이 아니라.

2. Object.toString()

  • Object (Wrapper Class - 래퍼 클래스) 의 데이터를 String 문자열로 바꾼다.
  • Wrapper Class 는 사용가능하지만 Primitive type은 사용 불가.
    • 예시)
        int pri = 3;
        String str = pri.toString();
        System.out.println(str);
      

      결과 )

        error: int cannot be dereferenced
      
  • Object에 null값이 들어간다면 NullPointerException이 뜬다.
    • 예시)
        Object nullValue = null;
        String str = nullValue.toString();
        System.out.println(str);
      

      결과 )

        Exception in thread "main" java.lang.NullPointerException: 
        Cannot invoke "Object.toString()" because "" is null at main.main
      

3. String.valueOf()

  • 위에 쓴 Object.toString()과 다르게 x 위치에 Wrapper Class, Primitive type 둘 다 사용 가능하다.
  • x값이 null 이 들어간다면 결과값은 “null”의 문자열이 출력된다.

4. Integer.toString()

  • 3번(String.valueOf())과 같은 기능이다. 참고로 3번은 4번을 호출하는 방식이다.
  • 3번과 다르게 null값이 들어가면 NullPointerException이 뜬다.


int 형변환 (Object to int, String to int)

1. (int)Object

  • 강제 형변환이다.
  • ()괄호 안에 int뿐만 아니라 byte, double 등등 사용가능하다.
  • 다만, 범위가 각자 다를 때 주의해야할 사항이 있다.
    • 강제 타입 변환(Casting)
      작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
      

      이렇게 큰 타입을 작은 타입으로 강제 캐스팅을 하면 담을 수 있을 정도로만 값이 바뀐다.
      예시)

      float val = 3.14;
      int intVal = (int)val; // 3의 값으로 바뀐다.
      
    • 자동 타입 변환(Promotion)
      • 이는 작은 타입이 큰 타입으로 저장될 때 발생한다.
      • 자동으로 변환된다.
      • 타입 변환이 불가한 경우
        • char 타입은 음수가 없다. <p>그래서 음수를 char로 변환하면 컴파일 에러가 난다.</p>
          byte byteVal = 65;
          char charVal = byteVal; // 컴파일 에러
          
  • 기본 타입의 허용 범위
    byte < short < char < int < long < float < double

2. Integer.valueOf((String) Object)

  • Integer (wrapper class)객체로 반환

3. Integer.parseInt(Object.toString)

  • 원시데이터인 int 타입으로 반환
  • Autoboxing and Unboxing 이 도입된 Java 1.5 이후부터는 2번, 3번 둘 중 무엇을 써도 상관이 없다.

Comments