안녕하세요. 제임스 입니다.

 

이번에는 개발 중 종종 발생하는 오류중 하나인 NumbreFormatException 에 대해 정리 해보겠습니다. 

 

NumbreFormatException 은 왜 발생 하는 것일 까요? 

단어를 잘 보시면 이유를 알 수 있습니다. 

 

Number 와 관련된 오류 인데... 

Format Exception 이라고 합니다. 즉, 형식 오류라는 의미 인데요. 

풀어서 이야기 하면 숫자 형식 오류 라는 의미가 됩니다. 

 

 

그렇다면 어떤 경우에 발생하는지 예제를 보면서 다시 살펴 보겠습니다.

 

앞서 문자열을 숫자로 변환하는 방법에 대해 정리 했었는데요. (아래 링크 참조)

2018/03/06 - [Java] - [ 자바 코딩 ] Java Integer.parseInt

 

이와 관련하여 잘못된 사용으로 인해 오류가 발생 할 수 있습니다. 

1
2
3
4
5
6
7
8
package com.james.test;
public class JavaNumbers {
    public static void main(String[] args) {
        String str = "O1O";
        System.out.println(Integer.parseInt(str));
    }
}
 
cs

 

위 코드를 보시면 String str = "010"; 이라고 입력 되어 있습니다. 

사실 이 코드는 숫자 010 이 아닌 영문 대문자 O 와 숫자1 의 조합으로 영문 소문자로 사용 시 아래와 같이 표현 할 수 있습니다. 

String str = "o1o";

즉, 숫자 형이 아닌 말 그래로 문자열입니다. 

 

문자열을 숫자형으로 변환한다???

절대 불가능한 일이죠. 

이 경우 위 코드를 실행 시키명 아래와 같은 오류를 볼 수 있습니다. 

 

Exception in thread "main" java.lang.NumberFormatException: For input string: "O1O"

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at com.james.test.JavaNumbers.main(JavaNumbers.java:5)

 
 

이런 오류가 발생 하면 안되 겠지만 발생하는 경우가 있기 때문에 Exception 처리를 해주는 것이 중요 합니다. 

 

그래서 Integer.parseInt() 를 사용할 경우 try ~ catch ~ 를 이용하여 감싸줍니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.james.test;
public class JavaNumbers {
    public static void main(String[] args) {
        try {
            String str = "010";
            System.out.println(Integer.parseInt(str));
        } catch (NumberFormatException e) {
            // NumberFormatException 이 발생한 경우 처리 방법
        } catch (Exception e) {
            // Exception 이 발생한 경우 처리 방법
        }
    }
}
 
cs

 

각각의 Exception 종류에 따라 원하는 코드를 작성하여 처리 하여 주면 됩니다. 

만약 위와 같이 아무런 오류 처리를 하지 않을 경우 오류가 발생하더라도 아무런 반응을 하지 않게 됩니다.

 

위 코드에서는 정상적으로 숫자 010 을 입력 하였습니다. 

문제가 되던 오입력된 숫자형 무자열을 수정 하였으니 제대로 나오겠죠? ^^

 

실행 결과 값은 아래와 같습니다. 

 

10 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


앞서 정규표현식으로 파일 확장자 처리 하는 방법을 포스팅 했었는데요. 

abcd.tar.gz 와 같이 이중 파일 확장자가 있는 경우도 있습니다. 


이런 파일은 어떻게 처리 하는지 알아 보겠습니다. 




■ 정규표현식 이중 파일 확장자 처리


1
String regExp = "^([\\S]+(\\.(?i)(tar)+\\.gz)$)";
cs



위 코드는 abcd.tar.gz 파일 확장자를 정규표현식으로 변환한 것입니다. 

좀더 디테일하게 정리하면 아래와 같습니다. 


^

(

[\\S]

+

(

\\.

(?i)

(tar)

+

\\.gz

)

$

)

1

2

3

4

5

6

7

8

9

10

11

12

13



1: 정규표현식 시작 

2: 첫번째 영역 지정 소괄호 오픈

3: 공백문자가 아닌 문자열

4: 앞의 표현식 (3번) 이 1회 이상 일치 (공백문자가가 아닌 문자열이 꼭 와야 함)

5: 두번째 영역 지정 소괄호 오픈

6: 마침표( . )가 앞의 표현식 뒤에 따라옴

7: 대소문자 구분 없음

8: tar 라는 문자열만 허용 

9: 앞의 표현식 (8번) 이 1회 이상 일치

10: .gz 라는 문자열 포함

11: 두번째 영역 지정 소괄호 종료

12: 정규표현식 종료

13: 첫번째 영역 지정 소괄호 종료



앞서 일반적인 파일 확장자 정규표현식과 다른 부분이 위 8, 9, 10 입니다. 


8번의 경우 확장자 명을 기존 jpg, png 등 이미지 확장자 명에서 tar 로 변경 한 것입니다. 

9번의 경우 8번이 1회 이상 일치 해야 함을 지정 한 것입니다. 

10번의 경우 .gz 가 마지막에 따라 와야 함을 지정 한 것입니다. 



1
2
3
4
5
6
7
8
9
10
11
String regExp = "^([\\S]+(\\.(?i)(tar)+\\.gz)$)";
        
String input1 = "james.tar.gz";
String input2 = "james.zip.gz";
String input3 = ".tar.gz";
String input4 = "james..gz";
 
System.out.println("input1 정규표현식 적용 결과 ==> "+input1.matches(regExp));
System.out.println("input2 정규표현식 적용 결과 ==> "+input2.matches(regExp));
System.out.println("input3 정규표현식 적용 결과 ==> "+input3.matches(regExp));
System.out.println("input4 정규표현식 적용 결과 ==> "+input4.matches(regExp));
cs



input1 은 abcd.tar.gz 라는 파일 형식에 제대로 맞춰서 입력값을 초기화 했습니다. 

나머지 변수값들은 좀 비정상 적이죠? ^^;;


Results


input1 정규표현식 적용 결과 ==> true

input2 정규표현식 적용 결과 ==> false

input3 정규표현식 적용 결과 ==> false

input4 정규표현식 적용 결과 ==> false




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


앞서 정규표현식 (Regular Expression) 에 대해 간단히 정리 했었습니다. 

이번에는 정규표현식 중 숫자만 허용 하는 표현식을 알아 보겠습니다. 




■ 정규표현식 숫자만 허용하기


1
String regExp = "^[0-9]+$";
cs


위와 같이 정규표현식을 작성 했습니다. 


^ => 문자열의 시작

[...] => 문자의 집합, 두 문자 사이에 - 기호를 이용하여 범위를 지정 [0-9] 와 같이 입력하여 0 ~ 9 를 표현 

+ => 앞에 문자가 최소 한개이상 있음, 여기서는 0 ~ 9 사이의 숫자의 갯수 제한이 없음을 의미

$ => 문자열 종료 


다시 정리 하면 아래와 같습니다. 



^[0-9]+$


문자열 시작 

[0 ~ 9 까지 숫자 인정] 

0 ~ 9 까지 숫자 갯수 제한 없음

문자열 종료



위 표현식이 정말 숫자만 허용 하는지 확인 해보겠습니다. 


1
2
3
4
5
6
7
String testStr1 = "12345";
 
if(testStr1.matches(regExp)){
    System.out.println("testStr1 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr1 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr1 이라는 변수에 숫자만 1 ~ 5 까지 나열 되어 있습니다. 

그냥 봐도 숫자만 입력 된 것이 맞죠? ^^


결과는 아래와 같습니다. 

testStr1 ==> 숫자만 입력 됨



1
2
3
4
5
6
7
String testStr2 = "1T2E3S4T5";
 
if(testStr2.matches(regExp)){
    System.out.println("testStr2 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr2 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr2 이라는 변수에는 숫자와 문자의 조합인 값이 들어 있습니다. 


결과는 아래와 같습니다.

testStr2 ==> 숫자 외 다른 문자도 입력 됨



1
2
3
4
5
6
7
String testStr3 = "";
 
if(testStr3.matches(regExp)){
    System.out.println("testStr3 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr3 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


testStr3 이라는 변수는 빈 값으로 설정 했습니다. 


결과는 아래와 같습니다.

testStr3 ==> 숫자 외 다른 문자도 입력 됨




■ 정규표현식 숫자와 공백 허용하기


위 세번째 예제를 사용한 이유는 숫자만 허용하는 표현식을 많이 사용 하기도 하지만 더 많이 사용 하는 것이 숫자와 빈값을 인정하는 표현식을 더 많이 사용하기 때문입니다. 


앞선 숫자만 허용하는 표현식에서는 + 라는 표현식을 이용하여 선행 문자의 갯수를 1개 이상으로 지정 했었습니다. 하지만 이 표현식을 * 로 변경할 경우 선행 문자의 갯수가 0개 이상으로 지정 할 수 있습니다. 


예제를 보시겠습니다. 


1
2
3
4
5
6
7
String regExp2 = "^[0-9]*$";
String testStr4 = "";
if(testStr4.matches(regExp2)){
    System.out.println("testStr4 ==> 숫자만 입력 됨");
}else {
    System.out.println("testStr4 ==> 숫자 외 다른 문자도 입력 됨");
}
cs


regExp2 변수는 0 ~ 9 사이의 숫자가 0개 이상인 것으로 지정 했습니다. 


결과는 아래와 같습니다. 

testStr4 ==> 숫자만 입력 됨



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅 부터는 정규식에 대해 정리 하고자 합니다.


정규표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어 입니다. Pattern Matching 이라고도 부릅니다.


이 정규식을 사용하는 방법에 대해 알아보겠습니다. 


표현식 상세
^ 문자열의 시작을 의미
$ 문자열의 종료를 의미
. 줄바꿈을 제외한 임의의 문자를 의미. 줄바꿈을 위한 m 옵션은 허용
[...] [] 사이에 있는 임의의 문자 또는 문자집합. 문자의 집합은 시작 문자와 종료 문자 사이에 - 기호로 범위를 지정
[^...] [] 사이에 있는 임의의 문자 또는 문자집합을 제외
{} 회수 또는 범위를 의미
() 소괄호 안의 문자를 하나의 문자로 인식
\A 전체 문자의 시작
\z 전체 문자의 종료
\Z 허용되는 최종 라인 종결자를 제외한 전체 문자열의
re* 앞의 표현식이 0 이상 일치
re+ 앞의 표현식이 1 이상 일치
re? 앞의 표현식이 0 또는 1 일치
re{ n} 앞의 표현식이 정확히 n 일치
re{ n,} 앞의 표현식이 n 또는 이상 일치
re{ n, m} 앞의 표현식이 최소 n 최대 m 일치 
a| b a 또는 b 일치
(?i) (?i) 뒤에 옵션을 추가 대소문자 구분하지 않음
(re) 정규식을 그룹화하고 일치된 텍스트를 기억
(?: re) 정규식을 그룹화하고 일치하지 않는 텍스트를 기억
(?> re) 역추적 없이 독립적 패턴과 일치
\w 단어 문자와 일치
\W 단어 문자와 일치
\s 공백문자와 일치. [\t \n \r \f] 동일
\S 공백문자와 일치
\d 숫자와 일치. [0-9] 동일
\D 숫자가 아닌 모든 문자와 일치
\A 문자열의 시작과 일치
\Z 문자열의 종료와 일치. 만약 줄바꿈이 있다면 줄바꿈 이전 문자열과 일치
\z 문자열의 종료와 일치
\G 마지막 일치 위치가 끝난 지점과 일치
\n 캡처 그룹 번호 n 대한 참조
\b 대괄호 밖에 있을때 단어 경계와 일치. 대괄호 안에 있을때는 백스페이스 (0x08) 일치
\B 단어 경계와 일치
\n 줄바꿈과 일치
\t 탭과 일치
\Q, \E \Q \E 사이의 문자와 일치


정규표현식의 기본 패턴 들입니다. 

위 값들의 조합을 통해 원하는 표현식을 만들 수 있습니다. 




정규표현식은 아래와 같이 String 함수들과 함께 사용할 수 있습니다. 


s.matches("regular expression") 

s.split("regular expression")

s.replaceAll("regular expression")


이외에도 다른 String 함수들과 함께 사용 할 수 있습니다. 


1
2
3
4
5
6
7
8
String regExp = "^[a-zA-Z]*$";
        
String testStr1 = "TestCodeHere";
if(testStr1.matches(regExp)){
    System.out.println("testStr1 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr1 은 정규표현식에 맞지 않는 문자열");
}
cs


regExp 라는 변수에 "^[a-zA-Z]*&" 라는 표현식을 작성 했습니다. 

이 표현식은 우리가 일상 코딩중 가장 많이 사용하는 표현식으로 영문대소문자만 허용한다는 표현식입니다. 


String 함수중 matches 함수를 이용하여 testStr1 값이 regExp 표현식에 맞는지 비교 하는 코드 입니다. 

testStr1 값중 영문 대소문자 외에 어떤 텍스트도 보이지 않습니다. 결과 값은 예상 가능하죠? ^^


testStr1 은 정규표현식에 맞는 문자열




1
2
3
4
5
6
String testStr2 = "TestCodeHere.";
if(testStr2.matches(regExp)){
    System.out.println("testStr2 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr2 은 정규표현식에 맞지 않는 문자열");
}
cs


이번에는 동일한 표현식에 testStr2 값이 부합하는지 확인 해보겠습니다. 

testStr2 는 testStr1 값에 마침표( . )을 하나 추가 했습니다. 

정규 표현식 상에서는 영문대소문자만 허용하는 것으로 작성 했습니다. 

결과는 당연히 표현식에 맞지 않는 문자열이라는 값을 리턴해야 정상입니다. 


testStr2 은 정규표현식에 맞지 않는 문자열



1
2
3
4
5
6
String testStr3 = "Im James";
if(testStr3.matches(regExp)){
    System.out.println("testStr3 은 정규표현식에 맞는 문자열");
}else {
    System.out.println("testStr3 은 정규표현식에 맞지 않는 문자열");
}
cs


이번에는 문자열에 스페이스가 있습니다. 

두번째 예제를 이해 하셨다면 쉽겠죠? 당연히 정규표현식에 맞지 않는 문자열입니다. 


testStr3 은 정규표현식에 맞지 않는 문자열



이번 포스팅에서는 정규표현식의 기본을 간단히 정리 했습니다. 

앞으로 많이 사용하는 패턴들과 특수한 케이스에 대해 정리해 보겠습니다. 



아래 링크는 정규표현식을 테스트 해볼 수 있는 사이트 입니다. 

잘 이용하시길 바랍니다.


https://regexr.com/



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에는 Java Number 관련 함수 중 valueOf() 함수에 대해 정리해 보겠습니다. 


valueOf() 함수는 입력받은 인자 값을 지정된 Number 객체 형으로 변환하여 반환 합니다. 이 인자값은 primitive data type (원시 데이터 형 - byte, int, long, double, boolean 등 자바 키워드로 이미 지정된 데이터 형) 또는 문자열 등이 될 수 있습니다. 



Syntax

1. public static Integer valueOf( int i )

2. public static Integer valueOf( String s )

3. public static Integer valueOf( String s, int radix )


그외 Double, Float 등도 valueOf (primitiveType value) 또는 valueOf(String s) 함수를 가지고 있습니다. 

즉, 아래과 같은 syntax 들이 더 있습니다. 참고 하세요.

public static Double valueOf(double d)

public static Float valueOf(float f)


Parameters

첫번째, 두번째 입력 값은 각각 int 및 String 으로 단 하나의 입력 값을 가지고 있습니다. 

이와 다르게 세번째 함수는 String 값과 int 값을 동시에 순차적으로 입력을 받습니다. 입력된 String 형의 값을 두번째 인자값으로 입력된 진수에 맞춰서 변환 합니다. 

예를 들면 Integer.valueOf("100", 16) 이라는 코드가 있다면 100 을 16진수로 변환하여 Integer 형으로 반환 한다는 뜻입니다. 


Sample Code

1
2
3
4
5
6
7
8
9
Integer a =Integer.valueOf(7);
Double b = Double.valueOf(5);
Float c = Float.valueOf("38");               
Integer d = Integer.valueOf("100",16);
 
System.out.println("a = "+a); 
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println("d = "+d);
cs



결과 값은 아래와 같습니다. 


a = 7

b = 5.0

c = 38.0

d = 256



입력 파라미터 값도 중요 하지만 어떤 형으로 반환 할 것인지 결정을 잘해야 겠죠? ^^




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


자바에서 사용하는 함수들 중 xxxValue() 라는 형태의 함수들을 종종 보실 수 있습니다. 

이 함수들에 대해 간단히 설명 하고자 합니다. 


xxxValue() 함수는 함수를 호출하는 Number 객체의 값을 함수에서 반환된 primitive data type 으로 변환 합니다.


※ primitive data type 이란 자바 키워드로 정의 되어 있는 byte, short, int, long, double, boolean 등의 타입을 의미 합니다. 이런 primitive data type 을 제외한 다른 타입들은 모두 reference data type 이라고 부릅니다. 

이와 관련된 내용은 차후 다시 다루도록 하겠습니다. 


Syntax

각각의 primitive data type 의 함수 형태는 아래와 같습니다. 

byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()


파라미터를 별도로 입력 받지 않고 아래와 같은 방법으로 사용 합니다. 


1
2
3
4
5
6
7
8
9
Integer x = 7;
          
System.out.println( x.byteValue() );
 
System.out.println( x.longValue() );
        
System.out.println( x.doubleValue() );
        
System.out.println( x.floatValue() );
cs


Integer 형으로 초기화 했습니다. 

만약 int 형으로 초기화 한다면 위와 같은 방법으로 사용 할 수 없습니다. Number 객체의 값을 primitive data type 으로 변환 하는 것이기 때문입니다. int 형은 이미 primitive data type 입니다. 


결과는 아래와 같습니다. 


7

7

7.0

7.0




다른 예로 이번에는 Float 형의 값을 지정해 보겠습니다. 


1
2
3
4
5
6
7
8
9
Float y = 10.15f;
        
System.out.println( y.byteValue() );
 
System.out.println( y.longValue() );
        
System.out.println( y.doubleValue() );
        
System.out.println( y.floatValue() );
cs



위 코드의 결과 값은 아래와 같습니다. 


10

10

10.149999618530273

10.15




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


문자열을 숫자로 변환시키는 방법으로 자바에서는 Integer.parseInt 를 사용합니다. 


parseInt 함수는 Integer 클래스의 static 함수입니다. 


형태는 아래와 같이 두가지가 있습니다. 



Integer.parseInt(String s)

숫자형의 문자열을 인자 값으로 받으면 해당 값을 10진수의 Integer 형으로 반환 해줍니다. 

1
Integer.parseInt("1004")
cs


참고: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)



Integer.parseInt(String s, int radix)

숫자형의 문자열을 첫번째 인자 값으로 받고 변환할 진수값을 입력하면 해당 진수에 맞춰 Integer 형으로 반환하여 줍니다. 

1
2
3
Integer.parseInt("2018"8);
Integer.parseInt("1004"10);
Integer.parseInt("1004"16);
cs


참고: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)



Integer.parseInt("1004", 10) 의 결과 값은 Integer.parseInt("1004") 한 값과 동일 합니다. 

그래서 첫번째 Integer.parseInt(String s) 의 경우 10진수의  Integer 형을 반환한다고 명시 했습니다. 



1
2
3
4
System.out.println(Integer.parseInt("1004"));
System.out.println(Integer.parseInt("2018"8));
System.out.println(Integer.parseInt("1004"10));
System.out.println(Integer.parseInt("1004"16));

cs


위와 같이 예제로 사용한 함수를 프린트 해보겠습니다. 


결과는 아래와 같습니다. 


1004

516

1004 --> Integer.parseInt("1004") 한 값과 동일 합니다. 

4100



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,