■ Java 에서 Integer.toString() 함수를 써야 하는 이유 


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


바로 이전 포스팅에서 Integer.toString() 함수에 대해 간략히 정리 했는데요. 

이번에는 실제 코딩 시 Integer.toString() 함수를 써야 하는 이유에 대해 언급하고자 합니다. 


우선 아래 코드를 보시겠습니다. 

1
2
3
Integer val = 12;
System.out.println("val1 = "+val);
System.out.println("val2 = "+val.toString());
cs


위 코드를 실행 시 결과 값은 아래와 같습니다. 


val1 = 12

val2 = 12


Integer 값을 바로 프린트 해도 결과 값은 동일하게 나옵니다. 

그렇다면 굳이 길게 쓸 필요 없지 않을까요? 라는 생각을 하시는 분들이 있을 수 있습니다. 


물론 보통의 경우 위와 같이 코드들 작성한다고 크게 문제가 되지는 않습니다. 



하지만 안전한 코딩을 하는 연습을 하기 위해 위와 같이 toString() 함수를 사용하시는 것을 권장 드립니다. 


아래 코드를 보시겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
int intVal = 5;
sampleCode(intVal);
sampleCode2(intVal);
 
private static void sampleCode(int intVal) {
     System.out.println("number" + '=' + intVal);
}
    
private static void sampleCode2(int intVal) {
     System.out.println(intVal + '=' + "number");
}
cs


5라는 int 값을 아래와 같이 두가지 방법으로 표기 해봅니다. 


첫번째 ---> "number" + '=' + 5

두번째 ---> 5 + '=' + "number"


예상되는 결과 값은 아래와 같습니다. 


number=5

5=number


하지만 실제로 프로그램을 실행 해봤을때 결과 값은 예상과 다릅니다. 


number=5

66number


왜 이렇게 나올까요? 

숫자 + 부호의 식이 만들어 질 경우 부호를 유니코드 값으로 변환하여 처리 하는 경우가 생깁니다. (위 예제와 같은 경우) 유니코드 상에서 = 기호 값이 61 입니다. 

즉, 5+61 한 결과 값이 66이므로 66number 라는 생각지도 못한 결과 값을 리턴하게 됩니다. 


그렇기 때문에 sampleCode2 함수의 코는 아래와 같이 toString() 함수를 이용하여 변경하는 것이 좋습니다. 

1
System.out.println(Integer.toString(intVal) + '=' + "number");
cs



아래 샘플 코드는 StackOverflow 에서 발췌한 샘플 코드 인데요.

URL 정보를 미처 확보하지 못해 링크는 못걸었습니다. 

1
2
3
4
display(2'+'35);
public static void display(int num1, char operator, int num2, int result) {
    System.out.println(num1 + operator + num2 + '=' + result);
}
cs


위 코드를 실행 시키면 아래와 같은 결과 값이 나옵니다. 


114


2 + 43 (+ 의 유니코드 값)  + 3 + 61 (= 의 유니코드 값) + 5 을 계산한 결과 값이 114 입니다. 


위 코드를 안전한게 toString() 함수를 이용하여 작성해 보겠습니다. 

1
2
3
4
displaySafe(2'+'35);
public static void displaySafe(int num1, char operator, int num2, int result) {
    System.out.println(Integer.toString(num1) + operator + Integer.toString(num2) + "=" + result);
}
cs


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


2+3=5


이제서야 원했던 결과 값이 제대로 나온것 같습니다. ^^



왜 toString 함수를 쓰는 것이 좋은 습관인지 아시겠죠? 물론 대부분의 경우 위와 같은 케이스를 경험하기는 힘듭니다. 하지만 평상시에 연습하지 않으면 당연하다는 생각에 코드 상에서 오류가 발생해도 쉽사리 찾기 어렵습니다. 경험담입니다 ㅠㅠ


좋은 코딩 습관을 기르는 연습이 왜 필요한지 한번 생각해 보는 것도 좋겠죠? ^^




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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,



  Java Numbers - toString() 함수 



toString() 함수는 Number 객체의 값을 String 객체로 변환하는 함수 입니다. 

만약 인자값이 primitive data type 일 경우 primitive data type 의 String 객체가 리턴 됩니다. 



Syntax

String toString()

- 해당 Integer 값을 String 객체로 표기 합니다. 


static String toString(int i)

- 전달 받은 인자(i) 를 String 객체로 표기 합니다. 



Sample

1
2
3
Integer x = 7;
System.out.println("x.toString() >>> "+x.toString());
System.out.println("Integer.toString(x) >>> "+Integer.toString(x));
cs


Integer x 값을 toString() 또는 toString(x) 한 값은 동일한 결과를 리턴합니다. 


x.toString() >>> 7

Integer.toString(x) >>> 7



한가지 주의 할 점은 아래와 같은 경우가 있습니다. 

1
2
int y = 5;
System.out.println("y.toString() >>> "+y.toString());
cs


Integer 값이 아닌 int 값 (primitive data type) 을 toString() 하려는 경우 아래와 같은 오류가 발생 합니다. 

Cannot invoke toString() on the primitive type int


primitive data type 인 int에 toString() 함수를 사용할 수 없다는 내용입니다. 


int 와 Integer 가 엄연히 다르다는 것 꼭 기억하시길 바랍니다. 





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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,



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


최근에 자바 Number 관련 함수 중 valueOf 와 parseInt 에 대해 정리 했는데요. 

이 두 함수의 차이점은 무엇일까요? 


parseInt 함수에 대한 내용은 아래 링크 참조하세요.

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


valueOf 함수에 대한 내용은 아래 링크 참조하세요.

2018/03/26 - [Java] - [ 자바 코딩 ] Java Number - valueOf() 함수




Integer.parseInt() vs Integer.valueOf() 두 함수의 차이점은 무엇일까요? 


결정적인 차이점은 parseInt 함수는 int 형의 primitive data type 을 리턴하는 반면 valueOf 함수는 Integer 객체로 반환한다는 점입니다. 


1
2
int x = Integer.parseInt("5");
Integer y = Integer.valueOf("7");
cs


위 코드는 각각 int 값 5 와 Integer 값 7 을 리턴합니다. 



또 다른 한가지는 차이점이라 이야기 하긴 어렵긴 한데요...

사실 valueOf 함수가 내부적으로 parseInt 함수를 사용하고 있습니다. 

아래는 Integer.class 소스 내용 중 관련 부분 발췌했습니다. 


public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s, 10);
}

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, radix));
}

public static Integer valueOf(String s) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, 10));
}


valueOf 함수 결과 값을 리턴 할때 이미 내부적으로 parseInt 한 값을 Integer 형으로 리턴하고 있는 것을 보실 수 있습니다. 



두 함수의 차이점 이해 하셨나요? 

비슷하지만 다른 두 함수의 리턴 값, 잘 알아 두시면 좋을 거예요. 




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

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

감사합니다 :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 등의 프로그래밍 언어를 소개 합니다.

,



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


이번에는 Java Number 관련 함수 중 equals() 라는 함수에 대해 알아 보겠습니다. 



equals() 함수는 함수를 호출하는 Number 객체가 인자 값으로 전달 되는 객체와 같은지 여부를 판단하여 boolean  형으로 리턴 해줍니다.  



Syntax

public boolean equals( Object o )


Parameters

인자 값으로는 어떤 객체든 상관 없이 받을 수 있습니다. 


Return Value

▶ 인자값이 null 이 아니고, 비교 대상이 동일한 값이며 동일한 형일 경우 true

▶ 인자값이 null 이거나, 비교 대상이 다른 값일 경우 또는 형이 다른 경우 false

를 반환합니다. 


Sample Code

1
2
3
4
5
6
7
8
Integer x = 7;
Integer y = 20;
Integer z =7;
Short a = 7;
 
System.out.println(x.equals(y));  
System.out.println(x.equals(z)); 
System.out.println(x.equals(a));
cs


비교대상이 되는 x 값을 Integer 형의 7로 설정했습니다. 

그리고 동일한 Integer 형의 20 과 7을 비교 해봅니다. 


첫번째 7과 20은 동일한 형이지만 다른 값이므로 false 가 나올것으로 예상됩니다. 

두번째 7과 7은 동일한 형에 동일 값으로 true 가 리턴 될 것입니다. 

세번째 7과 7은 값은 같지만 Integer 와 Short 로 서로 다른 형이기에 결론적으로 다른 값으로 볼수 있습니다. 즉, false 가 리턴 될 것으로 예상 할 수 있습니다. 


결과 값은 어떻게 나올까요? 


아래와 같습니다. 


false

true

false



equals() 함수는 값만 보는 것이 아니라 데이타 타입 즉, 형도 같이 비교 대상입니다. 꼭, 기억해 두세요 ^^




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

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

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,



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


최근 Java Number 관련 함수에 대해 계속해서 알아 보고 있습니다.

이번에는 compareTo() 라는 함수에 대해 이야기 해보겠습니다. 



compareTo() 함수는 함수를 호출한 Number 객체를 인자값과 비교를 합니다.

Byte, Double, Integer, Float, Long 또는 Short 등을 비교 할 수 있습니다. 단, 서로 다른 형을 비교 할 수는 없으므로 함수를 호출하는 인수와 비교대상이 되는 Number 객체는 동일한 형이어야 합니다. 


예를 들면 Integer 는 Integer 형 인자값과 비교가 가능하지만, Long 형 인자 값을과는 비교가 불가능 합니다. 



Syntax


public int compareTo( NumberSubClass referenceName )



Parameters


referenceName 은 Byte, Double, Integer, Float, Long 또는 Short 등이 될수 있습니다. 



Return Value


▶ 비교 대상이 동일한 값일 경우 0

▶ 비교 대상이 작은 경우 -1

▶ 비교 대상이 큰 경우 1 

을 반환합니다. 



Sample Code


1
2
3
4
5
6
7
Integer x = 7;
          
System.out.println(x.compareTo(3));
        
System.out.println(x.compareTo(7));
        
System.out.println(x.compareTo(77));
cs


비교 대상은 Integer 형인 7 입니다. 


첫번째 7과 3의 비교인데요... 당연히 비교대상인 7이 인자값인 3보다 크죠. 

예상되는 결과 값은 1 입니다. 


두번째는 7과 7의 비교입니다. 당연히 동일한 값입니다.

예상 결과 값은 0 입니다. 


세번째 7과 77의 비교! 인자값 77보다 작습니다. 

예상 결과 값은 -1이 됩니다. 



결과는 어떨까요? 


1

0

-1


맞습니다. 예상대로 결과 값이 리턴 됩니다. 



이번에는 Double 형으로 테스트 해보겠습니다. 

1
2
3
4
5
6
7
Double y = 12.5;
        
System.out.println(y.compareTo(3.0));
        
System.out.println(y.compareTo(12.5));
        
System.out.println(y.compareTo(27.8));
cs


결과가 예상이 되시나요? 


1

0

-1


위와 같은 결과 값이 나옵니다. 

예상하신 값과 동일 한가요? ^^




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

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

감사합니다 :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 등의 프로그래밍 언어를 소개 합니다.

,



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


자바에서 D-Day 구하는 방법에 대해 알아 보겠습니다. 


D-Day 란 오늘로 부터 특정 일자까지 남은 기간을 의미합니다. 

즉, 오늘과 특정 지정일의 차를 의미 하는 것입니다. 


앞서 두 날자 간 차를 구하는 방법에 대해 포스팅 했었습니다. 

Calendar.getTimeInMlls() 두 날자 간 차 구하기 포스팅 보러 가기 ( http://jamesdreaming.tistory.com/103 )


이를 이용하여 D-Day 구하는 코드를 작성해 보겠습니다. 


두 날자 간 차를 구하기 위해서는 Calendar Class 의 getTimeInMills() 함수를 이용하여 천분의 1초 단위까지 계산을 합니다. 


오늘 날자와 D-Day 날자 선언을 합니다. 

1
2
Calendar today = Calendar.getInstance();
Calendar d_day = Calendar.getInstance();
cs


d_day 를 2018년 8월 19일로 설정해 보겠습니다. 

1
d_day.set(2018, Calendar.AUGUST, 19);
cs


두 날자를 getTimeInMills() 함수를 이용하여 날자정보를 가져 오겠습니다. 

이때 천분의 1초단위 값이기 때문에 24시간 * 60분 * 60초 * 1000  한 값(하루의 밀리세컨 값)으로 나눠서 일단위 값을 리턴 받습니다. 

1
2
long l_dday = dday.getTimeInMillis() / (24*60*60*1000);
long l_today = today.getTimeInMillis() / (24*60*60*1000);
cs


이제 이 두값의 차를 구해 보겠습니다. 

오늘 날자로 부터 남은 기간이기 때문에 큰 날자에서 빼지 않고 작은 날자 (오늘날자) 에서 빼는 것으로 하겠습니다. 

1
long substract = l_today - l_dday;
cs


오늘 날자 (2018.1.29) 로 부터 8월 19일 까지 D-Day 결과 값은 -202 가 나옵니다. 




제대로 나온 값일 까요? 

검증 하는 방법은 앞선 포스팅 ( 날자 계산하기 - 날자 더하기 / 빼기 포스팅 보러가기 )에서 다뤘습니다. 

다시 한번 해볼까요? 

1
2
3
4
5
6
7
8
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
            
Calendar targetDate = Calendar.getInstance();
            
targetDate.set(2018, Calendar.AUGUST, 19);
targetDate.add(Calendar.DAY_OF_MONTH, -202);
            
System.out.println("ret = "+sdf.format(targetDate.getTime()));
cs


결과는 아래와 같이 나옵니다.

ret = 2018/01/29


테스트 진행한 당일 날자가 제대로 나왔습니다. 


간단하죠? ^^




D-Day 구하는 코드를 인자 값을 받을 수 있는 함수 형태로 작성하고 main() 함수에 호출 하는 예제로 풀로 작성 해 보겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static int getDDay(int _year, int _month, int _day){
        try {
            
            Calendar today = Calendar.getInstance();
            Calendar d_day = Calendar.getInstance();
            
            d_day.set(_year, _month, _day);
            
            long l_dday = d_day.getTimeInMillis() / (24*60*60*1000);
            long l_today = today.getTimeInMillis() / (24*60*60*1000);
            
            long substract = l_today - l_dday;
            return (int)substract;
 
        } catch (Exception e) {
            return -1;
        }
}
    
public static void main(String[] args) {
        System.out.println("8월 19일까지 D-Day = "+getDDay(2018, Calendar.AUGUST, 19));
}
cs




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

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

감사합니다 :D





블로그 이미지

쉬운코딩이최고

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

,




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


이번에는 두 날짜 간의 차이 구하는 방법에 대해 정리 해보겠습니다. 


몇월 몇일 부터 몇월 몇일 까지 몇일 차이인지 구하거나 특정일 까지 D-Day 를 구하거나 할때 사용 할 수 있는 방법입니다. 


우선 두 날짜간의 차이를 알기 위해 Calendar 클래스의 getTimeInMills() 라는 함수를 이용하여 천분의 일초 단위 까지 반환 합니다.

그리고 이 초 단위 값을 다시 일단위로 변환하여 최종적으로 두 날짜 간 일 차이를 구할 수 있습니다. 


아래 예제를 보시면 좀더 이해가 편하실 겁니다. 


1
2
Calendar baseCal = new GregorianCalendar(2018, Calendar.JANUARY, 11); // 기준 날짜 2018.1.11
Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24 
cs


기준 날짜를 2018년 1월 11일 로 비교 대상 날짜를 2018년 5월 24일 로 설정 했습니다. 


이제 두 날짜간 차이를 getTimeInMills() 함수를 이용하여 천분의 일초 단위로 변환 및 차를 구하겠습니다. 


1
long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis())/1000;
cs

천분의 1초 단위 이므로 1000 으로 나눠 초 단위로 변환 했습니다.


이제 다시 초단위를 일 단위로 변환 하겠습니다. 


1
long diffDays = diffSec / (24*60*60);
cs

1일은 24(시간) * 60(분) * 60(초) 초 이므로 diffSec 값에서 24*60*60 한 값을 나누면 일로 변환 됩니다. 


1
System.out.println("두 날짜간의 일수 차 = "+diffDays+" 일");
cs

위와 같이 결과 값을 프린트하면 아래와 같은 값을 리턴 합니다. 


두 날짜간의 일수 차 = 133 일


정말 133일 차이가 나는지는 앞서 포스팅했던 내용과 같이 기준날짜에 133일을 더하거나 비교대상 날짜에 133일을 빼면 알 수 있겠죠? 


1
2
3
4
5
6
7
8
9
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
System.out.println("----------------------------------------");
System.out.println("기준 날짜 = "+sdf.format(baseCal.getTime()));
System.out.println("비교 대상 날짜 = "+sdf.format(targetCal.getTime()));
System.out.println("----------------------------------------");
baseCal.add(Calendar.DAY_OF_MONTH, (int)diffDays);
System.out.println("기준날짜에 "+diffDays+" 일 만큼 더한 날짜 = "+sdf.format(baseCal.getTime()));
targetCal.add(Calendar.DAY_OF_MONTH, -(int)diffDays);
System.out.println("비교 대상 날짜에 "+diffDays+" 일 만큼 뺀 날짜 = "+sdf.format(targetCal.getTime()));
cs


yyyy/MM/dd 형태로 기준 날짜와 비교 대상 날짜를 먼저 프린트 합니다. 

이후 기준 날짜에 133일을 더하고 비교대상 날짜에서 133일 뺍니다. 


결과는 아래와 같습니다. 


-------------------------

기준 날짜 = 2018/01/11

비교 대상 날짜 = 2018/05/24

-------------------------

기준 날짜에 133 일 만큼 더한 날 = 2018/05/24

비교 대상 날에 133 일 만큼 뺀 날 = 2018/01/11


제대로 구해진것이 확인 됩니다. 



여기서 주의 할 점이 하나 있습니다. 

만약 기준 날짜를 Calendar.getInstance() 로 할 경우 오차가 생길 수 있습니다. 

천분의 일초 까지 계산을 하기 때문에 올림/내림의 변수가 존재 하여 원치 않는 결과 값이 나올 수 있습니다. 


아래 예제를 보여 드리겠습니다. 


1
2
3
Calendar baseCal1 = Calendar.getInstance(); // 기준 날짜 
Calendar baseCal2 = new GregorianCalendar(2018, Calendar.JANUARY, 11); // 기준 날짜 2018.1.11
Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24
cs


테스트 한 현재 시간 (2018년 1월 11일 오전 1시 59분) 으로 처음 예제와 동일한 날짜 이지만 시간이 초단위까지가 차이가 납니다. 


1
2
3
System.out.println("baseCal 초단위 값 ==> "+baseCal1.getTimeInMillis());
System.out.println("baseCal2 초단위 값 ==> "+baseCal2.getTimeInMillis());
System.out.println("targetCal 초단위 값 ==> "+targetCal.getTimeInMillis());
cs


위 코드 결과는 아래와 같습니다. 


baseCal1 초단위 값 ==> 1515603810414

baseCal2 초단위 값 ==> 1515596400000

targetCal 초단위 값 ==> 1527087600000


Calendar.getnstance() 한 값을 기준값 또는 비교값으로 설정 할 경우 +/- 1일 정도의 오차가 발생 할 수 있습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Calendar baseCal = Calendar.getInstance(); // 기준 날짜 
Calendar targetCal = new GregorianCalendar(2018, Calendar.MAY, 24);// 비교대상 날짜 2018.5.24 
 
long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis())/1000;
long diffDays = diffSec / (24*60*60);
 
System.out.println("두 날짜간의 일수 차 = "+diffDays+" 일");
 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
System.out.println("----------------------------------------");
System.out.println("기준 날짜 = "+sdf.format(baseCal.getTime()));
System.out.println("비교 대상 날 = "+sdf.format(targetCal.getTime()));
System.out.println("----------------------------------------");
baseCal.add(Calendar.DAY_OF_MONTH, (int)diffDays);
System.out.println("기준 날에 "+diffDays+" 일 만큼 더한 날 = "+sdf.format(baseCal.getTime()));
targetCal.add(Calendar.DAY_OF_MONTH, -(int)diffDays);
System.out.println("비교 대상 날에 "+diffDays+" 일 만큼 뺀 날 = "+sdf.format(targetCal.getTime()));
cs


위와 같이 Calendar.getInstance() 한 값을 기준으로 한 결과는 아래와 같습니다. 


두 날짜간의 일수 차 = 132 일

----------------------------------------

기준 날짜 = 2018/01/11

비교 대상 날짜 = 2018/05/24

----------------------------------------

기준 날짜에 132 일 만큼 더한 날짜 = 2018/05/23

비교 대상 날짜에 132 일 만큼 뺀 날짜 = 2018/01/12


분명 133일 차이가 나야 하는데 132일 차이가 나는 것으로 결과 값이 잘못 나옵니다. 

비교 대상이 잘못 되었기 때문이죠.


날짜 간의 비교를 해야 하는 경우라면 Calendar.getInstance() 대신 GregorianCalendar 를 이용하시거나 Calendar 클래스의 set 함수를 이용하여 원하는 날짜를 지정하는 것도 좋은 방법입니다. 



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

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

감사합니다 :D




블로그 이미지

쉬운코딩이최고

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

,




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


이번에 포스팅 할 내용은 특정 날짜에 원하는 날 만큼 + / - 하는 방법입니다. 


오늘 부터 한달 후는 몇 일 일까요? 

연인과 사귄 날로 부터 100일째 되는 날이 언제일까요? 


이런것들을 구하는 방법들에 대해 알아 보겠습니다. 



■ 오늘로 부터 한달 후는 몇일 일까?


1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = Calendar.getInstance();
System.out.println("오늘 날짜: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.MONTH, 1);
System.out.println("오늘로 부터 한달 후: "+sdf.format(cal.getTime()));
cs


Calendar 클래스에서 제공하는 add 라는 함수를 사용했습니다. 


결과는 아래와 같습니다.


오늘 날짜: 2018/01/10

오늘로 부터 한달 후: 2018/02/10



■ 연인과 1일차인 2018년 1월 1일로 부터 100일째는?

1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = new GregorianCalendar(2018, Calendar.JANUARY, 1);
System.out.println("연인과 1일차: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.DAY_OF_MONTH, 100);
System.out.println("연인과 사귄지 100일째: "+sdf.format(cal.getTime()));
cs

달을 구할때와 같이 이번에도 Calendar 클래스의 add 함수를 사용 했습니다. 

단, 이번에는 Calendar.MONTH 대신 Calendar.DAY_OF_MONTH 에 100일을 더했습니다. 


결과는 아래와 같습니다. 


연인과 1일차: 2018/01/01

연인과 사귄지 100일째: 2018/04/11



■ 기준일로 부터 이전 날짜 구하기


위 두가지 예제는 앞으로 몇달 후 또는 몇일 후 를 구하는 방식이었습니다. 

반대로 지나간 날짜를 구하는 방법은 어떻게 될까요? 


아주 간단합니다. 

입력 값을 양수 값이 아닌 음수 값으로 넣어 주면 됩니다. 


두번째 예제 결과 값인 2018년 4월 11일로 부터 101일 전이 몇일 인지 구해 보겠습니다. 


1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = new GregorianCalendar(2018, Calendar.APRIL, 11);
System.out.println("기준일: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.DAY_OF_MONTH, -101);
System.out.println("기준일로 부터 101전: "+sdf.format(cal.getTime()));
cs


add 함수를 사용 했지만 음수 값을 입력했습니다. 

결과는 아래와 같습니다. 


기준일: 2018/04/11

기준일로 부터 101전: 2017/12/31



■ 오늘로 부터 한달 열흘 후 날짜 구하기


이번에는 몇 일 또는 몇 달이 아닌 한달 + 10일 이라는 값을 구하려고 합니다. 

어떻게 하면 될까요? 

눈치 빠르신 분들은 벌써 답을 찾으셨을 것 같습니다. 


한달을 add 한 값에 다시 10일을 add 하면 되겠죠? 

코드는 아래와 같습니다. 


1
2
3
4
5
6
7
8
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 
Calendar cal = Calendar.getInstance();
System.out.println("오늘 날짜: "+sdf.format(cal.getTime()));
        
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, 10);
System.out.println("오늘로 부터 한달 열흘 후: "+sdf.format(cal.getTime()));
cs


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


오늘 날짜: 2018/01/10

오늘로 부터 한달 열흘 후: 2018/02/20



위와 같은 방식으로 여러 조합을 이용하여 원하는 값을 쉽게 가져 올 수 있습니다. 


잘 이용 하시길 바랍니다 :)



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

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

감사합니다 :D



블로그 이미지

쉬운코딩이최고

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

,