java

반응형

for each문 , 개선된 for문 , 향상된 for문 다양하게 부르지만 본문에선 개선된 for문이라 명칭 하겠습니다.

 

개선된 for 문

 

조건


1.JDK 1.5 이상

2.사용할 변수는 지역변수로 인식된다. (For문 안에서 사용되기 때문)
3. 대상은 배열 or 여러 원소를 포함한 자료형이어야 한다.

 

 

장점


1.간편한,가독성 좋은 코드
2. 배열 인덱스 문제 해결 (ArrayIndexOutOfBoundsException 예외를 피할 수 있다.)

 

 

단점


1.인덱스를 사용하지 못한다.(일반 for문의 (int i=0;) 할 때 i 같은 인덱스를 말하는 것) 하지만 방법이 있다.
★ 중요 ★
2.배열이나 ArrayList 값을 사용할 순 있지만 절대 수정할 수는 없다.

 

 

사용 이유


배열처럼 여러 원소로 이루어진 집합의 모든 원소에 대해 특정 작업을 반복하기 위해 사용

 

자주 사용되는 상황

1.ArrayList 원소 출력
2.배열 원소 출력

 

 

속도


일반 for문이 더 빠르다는 소문이 있어서 테스트해봤는데, 제가 해본 결과는 일단 같았습니다.

일반 for문 == 개선된 for문

이 부분에 있어서 정확하게 아시는 분은 덧글좀 남겨주세요.

 

문법


for(자료형 변수명 : 배열명){
	문장
}

 

쉽게 설명하면

for(자료형 한 단계 아래의 자료형의 변수명 : 배열명){

}

정확히 말하면 아래의 자료형이 아니지만 이렇게 생각하면 이해가 쉽더라고요.

 

실전 예제 - 일반 배열 원소 추출

String[] arr = {"1-1","1-2","1-3","1-4","1-5"};
 		
for(String s : arr) {
		  
 System.out.println(s);
		  
}

결과

 

 

실전 예제 2 - 이차원 배열 원소 추출

String[][] arr = {{"1-1","1-2","1-3","1-4","1-5"},{"2-1","2-2","2-3","2-4","2-5"}};
 		
for(String[] arrs : arr) {
	for(String s : arrs) {
		System.out.println(s);
	}
}

결과

 

 

실전 예제 3 - 삼차원 배열 원소 추출

String[][][] arr = {{{"1-1","1-2","1-3","1-4","1-5"},{"2-1","2-2","2-3","2-4","2-5"}},
					{{"3-1","3-2","3-3","3-4","3-5"},{"4-1","4-2","4-3","4-4","4-5"}}};
 		
for(String[][] arrtop : arr) {
	for(String[] arrs : arrtop) {
		for(String s : arrs) {
			System.out.println(s);
		}
	}
}

결과

 

 

실전 예제 4 - ArrayList<String> 원소 추출

ArrayList<String> arrlist = new ArrayList<String>();
arrlist.add("1-1");
arrlist.add("1-2");
arrlist.add("1-3");
		
for(String s : arrlist) {
			  
  System.out.println(s);
			  
}

결과

 

 

실전 예제 5 - ArrayList<Class> 원소 추출

public class Ex001 {

	private String a;
	private int b;
	private int c;
	
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public int getC() {
		return c;
	}
	public void setC(int c) {
		this.c = c;
	}
}
ArrayList<Ex001> arrlist = new ArrayList<Ex001>();

Ex001 ex01 = new Ex001();
ex01.setA("a");
ex01.setB(1);
ex01.setC(2);
arrlist.add(ex01);
		
 for(Ex001 s : arrlist) {
			  
 System.out.println(s.getA());
 System.out.println(s.getB());
 System.out.println(s.getC());
			  
}

결과


 

반응형
  1. 42421 2021.05.10 15:30

    개선된 for문이 더 느리다는 말은 들어본적이 없지만, 그런 소문이 나온 이유를 대강 추측해본다면,

    아마 일반 for문은 미리 컴파일된 조건이나 수식같은 것이 있어서 그것대로만 하면 되지만,
    개선된for문은 실행할 때마다 배열/list 객체의 사이즈를 재고 그것대로 일반 for문에 적용한 다음,
    매번 반복할 때 마다 새로운 변수/객체를 만들어주니까 차이가 생긴다는 것이 아닐까라고 생각합니다.

반응형

1.String to char (String -> char)


1-1.charAt() 이용하기

 

문법

String input = "안녕하세요";
char c = input.charAt(인덱스);

 

실전 예시

String krstr = "안녕하세요";

char c = krstr.charAt(0);

System.out.println(c);

결과 : 안

 

 

실전 예시 2

String enstr = "abcdef";

char c = enstr.charAt(3);

System.out.println(c);

결과 : d

 

 

실전 예시 3 - for문을 이용하여 하나 씩 반복하며 뽑기

String input = "자바킹";

for(int i=0; i<input.length(); i++) {
System.out.println(input.charAt(i));}

결과 :  자

           바

           킹


처음부터 char형으로 쪼개서 넣을 순 없을까?


1-2.toCharArray() 이용하기

 

문법

String input = "안녕하세요";
char[] arrCh = input.toCharArray();

 

실전 예시 - 개선된 for문을 이용하여 하나 씩 반복하며 뽑기

String input = "안녕하세요";
char[] arrCh = input.toCharArray();

for(char c : arrCh) {
System.out.println(c);}

※ 공통 주의할 점

 

1.특수문자, 공백도 인덱스에 포함된다는 점

예시 :

String input = "안녕 하세요";

char c = input.charAt(2);

 

결과 : (공백)

 

2. 인덱스가 0부터 시작한다는 점

예시 :

String input = "안녕하세요";

char c = input.charAt(0);

결과 : 안


2.char to String (char -> String)


2-1.valueOf() 이용하기

 

문법

char c = 'a';

String str = String.valueOf(c);
System.out.println(str);

 

결과 : a (type : String)

 

실전 예시 - char [] array to String 

char[] arrCh = {'a', 'b', 'c' };

String str = String.valueOf(arrCh);
System.out.println(str);

결과 : abc (type : String)


2-2.toString() 이용하기

 

문법

char c = 'a';

String str = Character.toString(c);

결과 : a (type : String)

 

※ 주의할 점: Character.toString() 사용 시 char [] 배열은 변환이 불가능합니다.

char c = 'a'
char[] arrCh = {'a', 'b', 'c' }; 

Character.toString(c) O
Character.toString(arrCh) X

2-3."" 이용하기 (야매식 변환)

 

문법

char c = 'a';

String str = ch + "";

결과 : a (type : String)


마지막으로..

[2-3."" 이용하기] 방법이 가장 편해서 저도 많이 쓰고 있는데요.

실행 속도는 어떨까요? 한번 비교해봤습니다.

 

[2-1.valueOf()] vs [2-3."" 이용하기]

 

실행 속도 비교 코드

public class Ex006 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		char ch = 'a';
		
		long startNanoTime = System.nanoTime(); 
        
		int i = 1000000000;
		while(i --> 0) {
        
			String str = String.valueOf(ch); //2-1
			String str = ch+""; //2-3
            //하나씩 넣고 컴파일을 진행하였습니다.
			
		}
		
		long secDiffTime = (System.nanoTime() - startNanoTime) / 1000000000;
		System.out.println(secDiffTime);
		
	}
}

 

[2-1.valueOf()] 속도

 

일반 결과 : 0초

배열 결과 : 5초

 

[2-3."" 이용하기] 속도

 

일반 결과 : 20초

배열 결과 : 74초

 

간단한 코드에 이런 차이면 좀 더 복잡할수록 많이 차이 날 거 같습니다.

되도록이면 valueOf()를 사용하시는 걸 추천드립니다.

 

 

 

반응형
  1. 곰탱 2021.07.07 21:21

    감사합니다

반응형

개념


주로 알고리듬이나 어떠한 기능을 만들 때, while문을 쓰게 되는데요.

 

while문 조건에 자주 나오게 되는 녀석이 바로 while(variable-- > 0)입니다.

 

여기서 '-- >'가 헷갈릴 수도 있는데요.

 

variable--; variable > 0; 이 두 가지를 합쳐놓은 것입니다.

 

0 보다 조건 값을 뺀 값이 클 경우, 즉 -- (증감 연산자)와 > (꺾쇠괄호)를 합쳐 놓은 형태인 거죠.

 

 

예시


int T = 3;
int cnt = 10;
		
while(T-- > 0) {
	System.out.println(cnt--+" 루프 : "+T);
			
}

결과

 

설명

1. 해당 루프에서 T를 1 씩 줄입니다.

    즉, 루프가 돌 때마다 T가 1씩 줄게 되고 줄은 값이 0보다 클 경우에만 돌게 됩니다.

    그러니 T 변수의 값이 3이니 3번 돌고 끝나게 됩니다.

 

 

실전 예제

 

입력 값에 따른 라인 출력

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int tcode = Integer.parseInt(bf.readLine()); 

		while (tcode-- > 0) {
			String testStr = bf.readLine() + "\n";
		}

 

마지막으로 while 문을 사용할 땐 항상 무한루프에 주의합시다.

반응형
  1. BlogIcon 도날두덱 2021.07.18 01:59 신고

    좋은내용감사합니다

반응형

MD5 (Message-Digest algorithm 5)

코드(소스) 보기

더보기
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

		public static String encrypt(String str){

			String MD5 = ""; 

			try{

				MessageDigest md = MessageDigest.getInstance("MD5"); 

				md.update(str.getBytes()); 

				byte byteData[] = md.digest();

				StringBuffer sb = new StringBuffer(); 

				for(int i = 0 ; i < byteData.length ; i++){

					sb.append(Integer.toString((byteData[i]&0xff) + 0x100, 16).substring(1));

				}

				MD5 = sb.toString();

				

			}catch(NoSuchAlgorithmException e){

				e.printStackTrace(); 

				MD5 = null; 

			}

			return MD5;

		}

}

 

사용법

public String util() {
		String str = "자바킹";
		String md5_en = MD5Util.encrypt(str);

		System.out.println("MD 5 암호화 : "+md5_en);//MD5 암호화
		return str;
}

SHA-256 (Secure Hash Algorithm 256)

코드(소스) 보기

더보기
import java.security.MessageDigest;

public class SHA256Util {

	public static String encrypt(String planText) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-256");
			md.update(planText.getBytes());
			byte byteData[] = md.digest();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < byteData.length; i++) {
				sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
			}
			StringBuffer hexString = new StringBuffer();
			for (int i = 0; i < byteData.length; i++) {
				String hex = Integer.toHexString(0xff & byteData[i]);
				if (hex.length() == 1) {
					hexString.append('0');
				}
				hexString.append(hex);
			}
			return hexString.toString();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
	
}

사용법

public String util() {
		String str = "자바킹";
		String sha256_en = SHA256Util.encrypt(str);

		System.out.println("SHA 256 암호화 : "+sha256_en);
		return str;
}

AES-128 (Advanced Encryption Standard 128)

코드(소스) 보기

더보기
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AES128Util {

    public static String encrypt(String input, String key) {
        byte[] crypted = null;
        try {
 
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
 
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skey);
            crypted = cipher.doFinal(input.getBytes());
        } catch(Exception e) {
            System.out.println(e.toString());
        }
 
        BASE64Encoder encoder = new BASE64Encoder();
 
        String str = encoder.encode(crypted);
 
        return new String(str);
    }
 
    public static String decrypt(String input, String key) {
        byte[] output = null;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
 
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
 
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skey);
            output = cipher.doFinal(decoder.decodeBuffer(input));
 
        } catch(Exception e) {
            System.out.println(e.toString());
        }
        return new String(output);
    }
}

사용법

public String util() {
		String str = "자바킹";
		String aes128key = "123456789abcdefg"; //사용자 지정 생성
		
		String aes_en = AES128Util.encrypt(str,aes128key);
		String aes_de = AES128Util.decrypt(aes_en,aes128key);

		System.out.println("AES 128 암호화 : "+aes_en);//AES128 암호화
		System.out.println("AES 128 복호화 : "+aes_de);//AES128 복호화
		return str;
}

3 DES (Triple Data Encryption Algorithm)

코드(소스) 보기

더보기
import java.security.Key;
import java.security.NoSuchAlgorithmException;
 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
 
public class DES3Util {
   
   
   private static Key key = null;
     
    static {
     if(key == null) {
      // Key 초기화
     KeyGenerator keyGenerator;
      try {
       keyGenerator = KeyGenerator.getInstance("TripleDES");
       keyGenerator.init(168);
       key = keyGenerator.generateKey();
      } catch (NoSuchAlgorithmException e) {
       e.printStackTrace();
      }
     }
    }
     
    public static String encrypt(String inStr) {
     StringBuffer sb = null;
     try {
      Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] plaintext = inStr.getBytes("UTF8");
      byte[] ciphertext = cipher.doFinal(plaintext);
       
      sb = new StringBuffer(ciphertext.length * 2);
      for(int i = 0; i < ciphertext.length; i++) {
       String hex = "0" + Integer.toHexString(0xff & ciphertext[i]);
       sb.append(hex.substring(hex.length()-2));
      }
     }catch(Exception e) {
      e.printStackTrace();
     }
     return sb.toString();
    }
     
    public static String decrypt(String inStr) {
     String text = null;
     try {
      byte[] b = new byte[inStr.length()/2];
      Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
      cipher.init(Cipher.DECRYPT_MODE, key);
      for(int i = 0; i < b.length; i++) {
       b[i] = (byte)Integer.parseInt(inStr.substring(2*i, 2*i+2), 16);
      }
      byte[] decryptedText = cipher.doFinal(b);
      text = new String(decryptedText,"UTF8");
     }catch(Exception e) {
      e.printStackTrace();
     }
     return text;
    }
   
}

사용법

public String util() {
		String str = "자바킹";
		
        	String des3_en = DES3Util.encrypt(str);
		String des3_de = DES3Util.decrypt(des3_en);

		System.out.println("3DES 암호화 : "+des3_en); //DES3 암호화
		System.out.println("3DES 복호화 : "+des3_de); //DES3 복호화
		return str;
}

"자바킹" 문자열 암호화 종류별 결과

반응형
반응형

1번째 방법 (n * -1)


양수 -> 음수

int a = 119; 

System.out.println(a * -1 );

결과 

-119

 

음수 -> 양수

int b = -119;
		
System.out.println(b * -1 );

결과

119

 

참고

정수형이 아닌 실수형도 다 됩니다.

double c = 3.14;
		
System.out.println(c * -1 );

 

결과

-3.14

 

 

2번째 방법 Math.abs(n)


※ 주의

2번째 방법은 음수-> 양수로만 변환이 가능합니다.

 

 

음수 -> 양수

int a2 = -119; 

System.out.println(Math.abs(a2));

결과

119

 

양수를 Math.abs에 사용한다면?

int b2 = 119;

System.out.println(Math.abs(b2));

결과

119

 

참고

정수형이 아닌 실수형도 다 됩니다.

double c2 = -3.14;
		
System.out.println(Math.abs(c2));

결과

3.14

기타 (주의 할 점)

int test = -2147483648;

만약 이와 같은 값이 있다고 하면

System.out.println(test * -1 );
System.out.println(Math.abs(test));

이 두가지 방법을 사용하더라도 양수로 변하지 않습니다.

 

이유는 int형 범위가 -2147483648에서 2147483647이기 때문입니다.

양수는 2147483647까지인데 2147483648의 값을 뱉으라고 하니 뱉을 수 없는 거죠.

 

사실 당연한 건데 오류를 뱉지 않고 그냥 -2147483648 값을 뱉기 때문에 밤샘 코딩을 하신 분들은

뇌가 파업하기 때문에 멘붕 올 수도 있습니다.

 

해결

방법 1.

long test = -2147483648;

int -> long 타입으로 변경해준다.


방법 2.

int test = -2147483647;

-2147483648에서 1을 뺀 -2147483647로 변경해준다.

반응형
반응형

1. 거슬리는 Enumeration Warning

 

Enumeration를 쓰다 보면 위 사진처럼 노란색 Warning 표시가 뜹니다.

노란색 Warning 표시가 거슬리시죠

Enumeration is a raw type. References to generic type Enumeration<E> should be parameterized

수정 전

Enumeration netInterfaces = null;

 

수정 후

Enumeration<?> netInterfaces = null;

변경 해주면 됩니다.


2.Java split 특수문자 버그

 

String str = "172.10.0.100" ;
String[] result = str.split(".");

String str = "사성|엘취" ;
String[] result = str.split("|");

 

예시대로 코드를 작성 할 경우 split 함수가 작동하지 않습니다.

눈에 안약넣고 찾아봐도 틀린 코드가 없습니다.

 

JDK 1.8 기준 특수문자 스플릿 버그입니다.

 

해결

String str = "172.10.0.100" ;
String[] result = str.split("\\.");

String str = "사성|엘취" ;
String[] result = str.split("\\|");

split 함수 안에 \(역슬래쉬)를 추가 해주면 됩니다.

 

※헷갈림 주의

Java에서만 뜨는 버그입니다

Javascript 됩니다.


3.Java 배열 원소 뽑기

 

split 버그를 찾으려고 배열 안에 잘 들어갔나 안 들어갔나 디버깅 중

java.lang.ArrayIndexOutOfBoundsException를 뱉어서 배열의 길이를 먼저 체크했는데

0이 나왔길래 원소를 보려 했더니

배열 원소 뽑는 게 순간 헷갈렸다.

그래서 준비했습니다.

String[] result = {"arr1","arr2","arr3"};
LOG.info(result);

결과 값 : [Ljava.lang.String;@주소값

[Ljava.lang.String;@주소 값 말고 arr1, arr2, arr3 즉, 배열의 원소들을 뽑고 싶을 땐 이런 식으로 사용하면 안 됩니다.

 

해결

import java.util.Arrays;

int[] result = new int[] {1, 2, 3, 4, 5};
System.out.print(Arrays.deepToString(result));

String[] result = {"arr1","arr2","arr3"};
System.out.print(Arrays.toString(result));

깨알 정보

[Ljava.lang.String;@3 db386 ff 맨 앞에 L이 있으면 배열 주소

java.lang.String;@3db386ff 없으면 그냥 String 주소


4.Java의 Integer, int 숫자 비교의 주의사항

 

java에서 숫자 비교는 ==,!=,>, < 여러 연산자가 있는데

 

int와 int 끼리 비교할 땐 ==이 값을 비교 하지만

Integer와 Integer를 비교 할 땐 ==는 개념이 조금 다르다.

 

Integer wr_i = new Integer(100); 
Integer wr_j= new Integer(100);

System.out.println(wr_i == wr_j); //false 
System.out.println(wr_i.equals(wr_j)); //true

위 코드를 보면 ==로 했을 땐 false가 나온다.

바로 Integer 객체에 주소 값으로 비교했기 때문이다.

 

해결

System.out.println(wr_i.equals(wr_j)); //true

String 타입도 마찬가지로 == 비교하진 않잖아요 equals 비교하지

똑같은 원리입니다. 자세한 건 이전에 글을 작성했습니다.

 

깨알 정보

1) int == Integer

int i = 1;
Integer j = 1;

if (i == j)  //true

2) int == new Integer

int i = 1;
Integer j = new Integer(1);

if (i == j)  //true

3) Integer == Integer

Integer i = 1;
Integer j = new Integer(1);

if (i == j) //false 

 

참고 글

 

[Java]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점)

오늘은 Java 기본형(primitive type)과 참조형(reference type) 종류 및 특징,사용 이유에 대해 시작하겠습니다. 자바는 크게 기본형(primitive type), Wrapper Class 참조형(reference type)으로 나눠진다. Primi..

java119.tistory.com

 

반응형
반응형

아직도!!!!!!!!!!!!!!

Calender Date 사용하려는 혹은 사용하고 있는 저 같은분들을 위해 준비한 글입니다.

 

Java 8 부터 java.time(joda.time) api 출시 됐기 때문에,

Java version 8 이상만 가능합니다.

 

Java 시간 API 시대 흐름순


java.util.Date > java.util.Calendar > java.time(org.joda.time)

 

 

LocalDate

 

 

개념


로컬 날짜 클래스로 날짜 정보만 필요할 때 사용

날짜 정보만 출력됩니다 날짜 정보만~

 

 

문법


// 로컬 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴
LocalDate currentDate = LocalDate.now();
// result : 2019-11-13

// 파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다.
LocalDate targetDate = LocalDate.of(2019,11,12);
 //결과 : 2019-11-12

 

 

LocalTime

 

 

개념


로컬 시간 클래스로 시간 정보만 필요할 때 사용

 

시간 정보만 출력됩니다 시간 정보만~

 

 

문법


// 로컬 컴퓨터의 현재 시간 정보를 저장한 LocalDate 객체를 리턴. 
LocalTime currentTime = LocalTime.now();   
// 결과 : 18:34:22

// 파라미터로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴.
LocalTime targetTime = LocalTime.of(12,33,35,22); 
// 끝에 4번째 매개변수는 nanoSecond 인데 선택 값이다 굳이 쓰지 않아도 된다.
// 결과 : 12:32:33.0000022

 

 

LocalDateTime

 

 

개념


날짜와 시간 정보 모두가 필요할 때 사용.

날짜와 시간 정보 출력~

 

 

문법

 


// 로컬 컴퓨터의 현재 날짜와 시간 정보
LocalDateTime currentDateTime = LocalDateTime.now();    
// 결과 : 2019-11-12T16:34:30.388

LocalDateTime targetDateTime = LocalDateTime.of(2019, 11, 12, 12, 32,22,3333);
// 여기도 second,nanoSecond 매개변수는 필수가 아닌 선택입니다.
// 결과 : 2019-11-12T12:32:22.000003333

 

날짜 더하기

LocalDateTime currentDateTime = LocalDateTime.now();
// 더 하기는 plus***() 빼기는 minus***()
// currentDateTime.plusYears(long) or minusYears(long)
currentDateTime.plusDays(2)
// 결과 : 2019-11-14T12:32:22.000003333

리턴 타입

메소드(매개변수)

설명

java.time.LocalDateTime

plusYears()

java.time.LocalDateTime

plusMonths()

java.time.LocalDateTime

plusWeeks()

java.time.LocalDateTime

plusDays()

java.time.LocalDateTime

plusHours()

java.time.LocalDateTime

plusMinutes()

java.time.LocalDateTime

plusSeconds()

java.time.LocalDateTime

plusNanos()

밀리초

빼기도 동일합니다. minusYear(),minusMonths() …

 

플러스 마이너스... 정말 직관적이다 대박 굿 완전 굿

 

 

실전 예제


 

날짜 비교

LocalDateTime startDateTime = LocalDateTime.now();  
// 결과 : 2019-11-12T12:32:22.000003332
LocalDateTime endDateTime = LocalDateTime.of(2019, 11, 12,12, 32,22,3333);
// 결과 : 2019-11-12T12:32:22.000003333

// startDateTime이 endDateTime 보다 이전 날짜 인지 비교
startDateTime.isBefore(endDateTime);    
// 결과 : true

// 동일 날짜인지 비교
startDateTime.isEqual(endDateTime);
// 결과 : false

// startDateTime이 endDateTime 보다 이후 날짜인지 비교
startDateTime.isAfter(endDateTime); 
// 결과 : false

주의 : 나노초가 존재할 경우 나노초의 시간까지 비교합니다.

 

시간 비교

LocalTime startTime = LocalTime.now();  
// 결과 : 23:52:35
LocalTime endTime = LocalTime.of(23, 59, 59);
// 결과 : 23:59:59

// startTime이 endTime 보다 이전 시간 인지 비교
startTime.isBefore(endTime);    
// 결과 : true

// startTime이 endTime 보다 이후 시간 인지 비교
startTime.isAfter(endTime); 
// 결과 : false

 

날짜 차이 계산

LocalDate startDate = LocalDate.now(); 
// 결과 : 2019-11-12
LocalDate endDate = LocalDate.of(2019,12,13);
// 결과 : 2019-12-13

Period period = Period.between(startDate, endDate);

period.getYears();      // 0년
period.getMonths();     // 1개월
period.getDays();       // 1일 차이

주의 : startDate와 end가 31일 차이가 나서 리턴이 31일이 되는 것이 아니라 1개월 1일로 반환됩니다.

무심코 period.getDays()로 비교했다간 다칠 수 있습니다.

 

그렇다면 31일을 반환 하려면?

 

전체 시간을 기준으로 차이 계산하기

LocalDate startDate = LocalDate.now(); 
// 결과 : 2019-11-12
LocalDate endDate = LocalDate.of(2019,12,13);
// 결과 : 2019-12-13

ChronoUnit.DAYS.between(startDate, endDate); 
// 결과 : 31 (1개월 1일)

클래스

설명

ChronoUnit.YEARS

전체 년 차이

ChronoUnit.MONTHS

전체 월 차이

ChronoUnit.WEEKS

전체 주 차이

ChronoUnit.DAYS

전체 일 차이

ChronoUnit.HOURS

전체 시간 차이

ChronoUnit.SECONDS

전체 초 차이

ChronoUnit.MILLIS

전체 밀리초 차이

ChronoUnit.NANOS

전체 나노초 차이

 

시간 차이 계산

LocalTime startTime = LocalTime.now();  
// 결과 : 17:14:55
LocalTime endTime = LocalTime.of(18,17,35);
// 결과 : 18:17:35

Duration duration = Duration.between(startTime, endTime);
duration.getSeconds();      
// 결과 : 3742
duration.getNano();
// 결과 : 922000000

 

날짜 포맷

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 M월 d일 a h시 m분");
String nowString = now.format(dateTimeFormatter);   
// 결과 : 2019년 11월 12일 오후 7시 2분

LocalDateTime now2 = LocalDateTime.now();  
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
// 결과 : 2019-11-12 07:26:12

주의 : 포맷의 두번째 예제에 07는 19시입니다. 24시간 표기가 아닙니다. 


날짜 변환

 

LocalDate -> String

LocalDate.of(2020, 12, 12).format(DateTimeFormatter.BASIC_ISO_DATE);

LocalDateTime -> String

LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

LocalDate -> java.sql.Date

Date.valueOf(LocalDate.of(2019, 12, 27));

LocalDateTime -> java.util.Date

Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());

LocalDateTime -> java.sql.Timestamp

Timestamp.valueOf(LocalDateTime.now());

String -> LocalDate

LocalDate.parse("1995-05-09");
LocalDate.parse("20191224", DateTimeFormatter.BASIC_ISO_DATE); 

String -> LocalDateTime

LocalDateTime.parse("2019-12-25T10:15:30");
LocalDateTime.parse("2019-12-25 12:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

java.util.Date -> LocalDateTime

LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());

LocalDateTime -> LocalDate

LocalDate.from(LocalDateTime.now());

LocalDate -> LocalDateTime

LocalDate.now().atTime(2, 30);

 

날짜 변환 [jekalmin의 블로그] 참조

 

 

해당 월에 마지막 날짜 찾기

String targetDate = "2020-02-02";

YearMonth targetYearMonth = YearMonth.from(LocalDate.parse(targetDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")));

//해당 월의 일 수(int)
System.out.println(targetYearMonth.lengthOfMonth()); // 29

//해당 월의 마지막 날(LocalDate)
System.out.println(targetYearMonth.atEndOfMonth()); // 2020-02-29

해당 주차의 날짜 찾기

final long calendarWeek = 34; //34주차 입력
LocalDate desiredDate = LocalDate.now()
            .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, calendarWeek)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
//결과 : 2020-08-17 
//DayOfWeek.MONDAY = 해당 주차에 월요일

 

TMI((Too Much Information)


위에 예제처럼 LocalDateTime startDateTime = LocalDateTime.now(); 하게 되면

// 결과 : 2019-11-12T12:32:22.000003332 이러한 결과가 나오는데 여기서 중간에 T는 뭘까?

바로 ISO 형식 시간표기법이다.

 

그 말은 즉, String으로 날라온 매개변수를 LocalDateTime로 파싱할때

'T'가 없으면 java.time.format.DateTimeParseException이 발생한다는 뜻입니다.

 

반짝 예시

String date = "2019-11-12 12:30:54"
LocalDateTime localdatetime = LocalDateTime.parse(date);
// 결과 : java.time.format.DateTimeParseException

String date = "2019-11-12T 12:30:54";
LocalDateTime localdatetime = LocalDateTime.parse(date);
// 결과 : parse 성공

 

ISO 자세히 알기

 

[ISO] ISO 8601 개념

ISO 날짜 형식이란? 정식 명칭 Date elements and interchange formats - Information interchange - Representation of dates and times 미쳤다.. 현재 제일 최신 버전 ISO 8601 구버전 ISO 8601:2000, ISO 8601:..

java119.tistory.com

반응형
  1. 2020.06.15 09:31

    좋은글 너무 감사합니다!

  2. 개망주 2020.08.19 15:03

    퍄 제가 찾고 있던 거

  3. 감사 2020.11.14 22:57

    감사합니다!

  4. 최고에요~~ 2021.05.12 15:35

    너무 정리 잘해주셔서

    잘썼습니다.

    참고 할게요~

  5. android 2021.07.08 23:13

    진짜 너무 좋은 글 감사해요 깔끔하게 정리해주셔서 보기 편해요

  6. 감사해요!! 2021.07.30 15:02

    정말 알기 쉽게 예시 까지 들어주시구 너무 잘 보았습니다 !! 감사합니다!!

반응형

이 글을 본 사람은 다 이해하진 못해도 자기가 코딩을 하다 예외가 떨어지면

아 오류 났네, 에러 났네 하지 말고 아 예외 떨어졌네. 익셉션 떨어졌네.라고 해줍시다.

그리고 제에발! 제발!!!!!!!!!

제목 : "어떤 기능 개발 중 에러 ㅠㅠ" 하면서 커뮤니티에 100 줄 넘는 예외 코드 올리지 말고

무슨 예외 났는지부터 봅시다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

오류(Error 에러)

 

개념


에러(Error)란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는 것

따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

 

오류(Error 에러)- 시스템 레벨에서 발생

 

 

종류


Throwable 하위

Error 하위

VirtualMachineError 하위

OutOfMemoryError

StackOverflowError (보자마자 사이트가 생각나는 엄청난 파급력..)

.. 외에 여러 것들이 있다

 

 

Exception(예외) 

 

개념


사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.

 

예외가 발생하면 프로그램이 종료가 된다는 것은 에러와 동일하지만 예외는 예외처리(Exception Handling)를 통해 프로그램을 종료되지 않고 정상적으로 작동되게 만들어줄 수 있습니다. 자바에서 예외처리는 Try Catch문을 통해 해 줄 수 있습니다.

 

예외(Exception)- 개발자가 구현한 로직에서 발생

 

즉,

예외는 발생할 상황을 미리 예측하여 처리할 수 있다

 

있 기 문 에

있 기 문 에

있 기 문 에

 

예외의 개념을 확실히 알고 다음 글인 예외처리를 확실히 하자.

 

 

종류


Checked Exception과 Unchecked Exception

 

 

Checked Exception

 

특징


반드시 예외 처리 해야함.

반드시 예외 처리 해야함.

반드시 예외 처리 해야함.

 

확인 : 컴파일 단계

 

예외 발생시 트랜잭션 처리 : *roll-back 하지 않음

 

*roll-back : 롤백(rollback)은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다.

 

대표 예외

RuntimeException 제외한 모든 예외

IOException

SQLException  지금은 없다.

 

Unchecked Exception

 

특징


예외 처리를 반드시 하지 않아도 .

예외 처리를 반드시 하지 않아도 .

예외 처리를 반드시 하지 않아도 .

 

확인 : 실행단계 확인

 

예외 발생시 트랜잭션 처리 : *roll-back 진행됨.

 

*roll-back : 롤백(rollback)은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다.

 

대표 예외

RuntimeException 하위 예외

NullPointException

IllegalArgumentException

IndexOutOfBoundException

SystemException

 

자주 보는 대표 예외들


java.xxx. ~ Exception

 

ArithmeticException

정수를 0으로 나눌경우 발생 

int c = 4 / 0;

 

ArrayIndexOutOfBoundsExcetion

배열의 범위를 벗어난 index를 접근할 시 발생

int[] a = {1, 2, 3};
System.out.println(a[3]);

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Test.main(Test.java:17)

a [3] 있지 않냐? 배열은 0부터 시작 ^^..

 

FileNotFoundException

파일을 못 찾을 때 발생

BufferedReader br = new BufferedReader(new FileReader("emptyfile.txt"));
br.readLine();
br.close();

Exception in thread "main" java.io.FileNotFoundException: emptyfile.txt (지정된 파일을 찾을 수 없습니다) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream. <init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader. <init>(Unknown Source)...

 

ClassCastExcetion

변환할 수 없는 타입으로 객체를 반환 시 발생 

Integer.parseInt(Object)

심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

참고 글.

 

[Java] java.lang.ClassCastException

예외 상황1 원인 심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long..

java119.tistory.com

 

NullPointException (저랑은 이미 절친인 Exception ^^)

존재하지 않는 레퍼런스를 참조할 때 발생 

(거의 대부분은 객체가 제대로 생성되지 않은 경우 발생). 

String a = null; 
    if (a.equals("비교값")) { 
        System.out.println("equals");
    } else {
        System.out.println("!equals");
    }
    
//Spring 예시
@RequestMapping("menu/menuTest001.do")
	public ModelAndView workflowConfig() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}
//menuTest001 이라는 jsp가 존재하지 않을 때.

 

IllegalArgumentException

잘못된 인자를 전달할 때 발생 

public String print(String x) throws Exception;

<select id="prints" statementType="CALLABLE" parameterType="String" resultType="String">
</select>

//dao - print 호출 MyBatis - prints

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value xxx.xxx.xxx.xxx

 

IllegalArgumentException MyBatis 절친이다.

MyBatis 쓰다가 예외가 발생했다면 주 원인

1.mapper id가 틀린 경우

2.Parameter와 bean의 field명이  틀린 경우

3.sql.xml에서 정의된 namespace와 DAO에서 호출하는 namespace가 다를 경우

4.mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우

5.mapper에 정의된 namespace 명칭이 같은 Application 내에 중복될 경우

참고 글.

 

[MyBatis] 관련 오류(예외)시 꼭! 확인해야 될 사항

오키에 어떤 멋진 선배님이 덧글로 남긴 거 퍼옵니다. 이 사항들만 잘 지켜도 오류(예외) 해결 됩니다. 하나하나 다시 되돌아보시기 바랍니다. 1. 에러 출력되는 부분은 없습니까? 2. 디비 설정이 디비명, 테이블..

java119.tistory.com

IOException

입출력 동작 실패 또는 인터럽트 시 발생

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int age=0;
age = Integer.parseInt(in.readLine());

//IOException을 강제로 써야하지만 안쓰고 바로 Run을 실행한 상태.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Unhandled exception type IOException

 

BufferedReader, InputStreamReader 파일 I/O 관련 함수를 쓰려면

강제로 try/catch 하거나 throws IOException

(Checked Exception 특징 하나가 반드시 예외를 처리해야함 이라고 나와있었죠)

 

OutOfMemoryException

메모리가 부족한 경우 발생  

Exception in thread “main”: java.lang.OutOfMemoryError: Java heap spac
Heap size의 부족으로 Java Object를 Heap에 할당하지 못하는 경우.

Exception in thread “main”: java.lang.OutOfMemoryError: PermGen space
Class나 Method 객체를 PermGen space에 할당하지 못하는 경우 발생

애플리케이션에서 너무 많은 class를 로드할 때 발생한다.
주로 잘못된 설계/구현에 의해 발생한다.
-XX:PermSize, -XX:MaxPermSize Option을 이용하여 오류를 수정하기도 한다.

Exception in thread “main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
사용할 배열의 사이즈가 VM에서 정의될 사이즈를 초과할 때 발생한다.

Exception in thread “main”: java.lang.OutOfMemoryError: request bytes for . Out of swap space?
Java는 런타임시 물리적 메모리를 초과한 경우 가상메모리를 확장해 사용하게 되는데 가용한 가상메모리가 없을 경우 발생한다.

Exception in thread “main”: java.lang.OutOfMemoryError: (Native method)
JVM에 설정된 것 보다 큰 native메모리가 호출 될 때 발생한다.

코드는 아니지만 길어서 코드 블록에 가둔다.

 

NumberFormatException

문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생

String str = "OO7oO";
System.out.println(Integer.parseInt(str));

00700 아닌 영문 O 섞인 OO7OO

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

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

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

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

at com.java119.test.JavaNFE.main(JavaNFE.java:5)

 

아니면 parseInt()인데 받는 값이 int 맥스인 2147483647를 넘는 경우에도 발생한다.

int a = Integer.parseInt(2147483648);

 

NoClassDefFoundException 

Exception in thread "main" java.lang.NoClassDefFoundError: Hello

‘Hello라는 클래스를 찾을 수 없다.’는 뜻이다. 클래스의 ‘Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스 파일(*. class)이 생성되었는지 확인한다.

 예를 들어 ‘Hello.java’가 정상적으로 컴파일되었다면 클래스 파일 ‘Hello.class’가 있어야 한다. 클래스 파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면

클래스 패스(classpath)의 설정이 바르게 되었는지 다시 확인해보자.

 

ClassNotFoundException

java.lang.ClassNotFoundException

컴파일된 java class 파일을 찾을 없다.

 

해당 경로에 분명 파일이 있음에도, 두개의 익셉션이 뜬다면?

참고 글.

 

[Eclipse] 잘되던 프로젝트가 갑자기 안될때(feat.HTTP 404)

이 글은 이클립스(IDE) 기반으로 설명합니다. 어제까지 잘되던 프로젝트가 내일 출근하고 보니 맛(?)이 갈 때가 있습니다. 바아로 따라해봅시다 1.Project 2.Clean… 1.Servers 탭 2.Tomcat version Server..

java119.tistory.com

NoSuchMethodException 

Exception in thread "main" java.lang.NoSuchMethodError: main

public static void mains(String []s args

‘main메서드를 찾을 수 없다.’는 뜻인데 실제로 클래스 내에 main메서드가 존재하지 않거나 메서드의 선언부(public static void main(String [] args))에 오타가 존재하는 경우에 발생한다.

 

Spring 관련 예외


BadSqlGrammarException

org.springframework.jdbc.BadSqlGrammarException:

컬럼명을 잘못 기술했을 경우 나타나는 예외

<select id="get~" resultType="DTO">
select from table
</select>
// select * from table *(아스타)가 빠짐.
// 외에 DB 컬럼명과 다르게 호출 할 경우 발생. id - ids

 


어디서 한 번씩은 본거 같은 Java 예외 리스트


java.io

  • IOException
  • CharConversionException
  • EOFException
  • FileNotFoundException
  • InterruptedIOException
  • ObjectStreamException
    • InvalidClassException
    • InvalidObjectException
    • NotActiveException
    • NotSerializableException
    • OptionalDataException
    • StreamCorruptedException
    • WriteAbortedException
  • SyncFailedException
  • UnsupportedEncodingException
  • UTFDataFormatException
  • UncheckedIOException

java.lang

  • ReflectiveOperationException
  • ClassNotFoundException
  • InstantiationException
  • IllegalAccessException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException
  • CloneNotSupportedException
  • InterruptedException
  • 산술 예외
  • IndexOutOfBoundsException
  • ArrayIndexOutOfBoundsException
  • StringIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException
  • EnumConstantNotPresentException
  • IllegalArgumentException
  • IllegalThreadStateException
  • NumberFormatException
  • IllegalMonitorStateException
  • IllegalStateException
  • NegativeArraySizeException
  • NullPointerException
  • SecurityException
  • TypeNotPresentException
  • UnsupportedOperationException

java.net

  • HttpRetryException
  • SocketTimeoutException
  • MalformedURLException
  • ProtocolException
  • SocketException
  • BindException
  • ConnectException
  • NoRouteToHostException
  • PortUnreachableException
  • UnknownHostException
  • UnknownServiceException
  • URISyntaxException

java.text

  • ParseException

 

java.time

  • DateTimeException

 

java.time.zone

  • ZoneRulesException

더욱더 자세한 Java Exception 보고 싶은 변태 멋진 분들은 여기 링크 남깁니다.

https://programming.guide/java/list-of-java-exceptions.html

 

더욱더 자세한 Spring Exception 보고 싶은 변태 멋진 분들은 여기 링크 남깁니다.

https://stackoverflow.com/questions/7561550/list-of-spring-runtime-exceptions

 

 

글은 제가 새로운 Exception 만날 때마다 수정/추가 될 예정입니다.

 

다음은 try catch 정확한 사용법을 알아보겠습니다. 개념 문법 위주

반응형

+ Recent posts