Java DecimalFormat 천단위마다 쉼표 입력





결과

결과





코드

public static void main(String[] args) {
		double num;
		
		num = 1234.5678;
		DecimalFormat df = new DecimalFormat("#.##");
		System.out.println("소수점 아래 2째자리까지(반올림) : " + df.format(num));
		
		num = 12345678;
		df = new DecimalFormat("#,###");
		System.out.println("천단위로 쉼표 : " + df.format(num));
		
		num = -1234567;
		df = new DecimalFormat("+#,###; -#,###");
		System.out.println("마이너스 표시 : " + df.format(num));
		num = 1234567;
		System.out.println("플러스 표시 : " + df.format(num));
		
		df = new DecimalFormat("\u0024 #,###");
		System.out.println("달러 표시 : " + df.format(num));
		
		num = 0.2591;
		df = new DecimalFormat("#.# %");
		System.out.println("퍼센트 표시 : " + df.format(num));
	}





DecimalFormat() : 숫자 표현 클래스

- 날짜를 표시할 때 SimpleDateFormat을 사용하여 포맷팅해주는 것처럼 DecimalFormat은 숫자를 표현할 때 포맷팅할 수 있다.


- 예를 들어 천 단위마다 ","를 사용하여 구분하고자 할 때 사용할 수 있다.


-> # : 10진수 표현, 결과에서 볼 수 있듯이 소수점 아래에서 표현 범위가 넘어갈 때는 반올림하여 표현해준다. 반면 정수 부분은 다 표현된다. 

따라서 천 단위 ","로 구분해주기 위하여는 "#,###" 처럼 작성하면 된다.


-> ; : +와 -를 같이 표현해줄 경우 구분자로 쓸 수 있다.


-> \u0024 : 달러를 표현해주기 위하여 달러문자의 유니코드 입력해준다.


-> % : 100 곱한 후 %를 붙여준다. "#.#" 으로 소수점 아래는 한자리만 표현하였으므로 소수점 아래 2째자리에서 반올림하여 표시된다.







Java Date, Calendar, SimpleDateFormat 시간 구하기





결과

결과





코드

public static void main(String[] args) {
		Date date = new Date();
		System.out.println("시간 확인 : " + date.toString());
		
		SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd, hh:mm:ss, E요일, 올해D일째");
		System.out.println("시간 확인(포맷팅) : " + sf.format(date) + "\n");
		
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);		// 년도
		int month = cal.get(Calendar.MONTH) + 1;	// 월 0~11
		int day = cal.get(Calendar.DAY_OF_MONTH);	// 일
		int yoil = cal.get(Calendar.DAY_OF_WEEK);	// 요일
		int hour = cal.get(Calendar.HOUR_OF_DAY);	// 시 0~23
		int min = cal.get(Calendar.MINUTE);	// 분
		int sec = cal.get(Calendar.SECOND);	// 초
		String[] yo = {"일", "월", "화", "수", "목", "금", "토"};
		// Calendar.SUNDAY : 1 ~ Calendar.SATURDAY : 7
		
		System.out.println("Cal 얻은 값 : " + year + "년" + month + "월" + day + "일 " +
		yo[yoil-1] + "요일 " + hour + "시" + min + "분" + sec + "초");
	}





Date : 날짜 표현 클래스

- 생성자가 여러개 있지만 대부분 비권장(Deprecated) 되어 사용 않는다.


- Date()를 생성하면 컴퓨터의 현재 날짜를 읽어 Date 객체를 생성한다.


- toString() 메소드를 사용하면 날짜를 문자열로 얻을 수 있다.


- 문자열을 특정한 포맷으로 얻고자 한다면 SimpleDateFormat을 사용한다.





SimpleDateFormat : 날짜 포맷 클래스

- 특정 포맷 문자열로 Date 객체의 날짜와 시간을 얻고자할 때 사용한다.


- 문자열 포맷은 SimpleDateFormat 객체를 생성할 때 생성자에서 지정해주며 포맷 기호들을 사용하여서 작성한다.


문자

설명

문자

설명

y

년도

M

d

D

올해 기준 일

H

시(0~23)

h

시(1~12)

k

시(1~24)

K

시(0~11)

m

s

E

요일

a

오전 / 오후

W

이번달 몇 번째 주

w

올해 몇 번째 주





Calendar : 이름처럼 달력을 표현하는 클래스

- 지역이나 나라마다 날짜를 계산하는 방법이 다르므로 Calendar는 인스턴스를 생성할 수 없도록 추상 클래스로되어 있다.


- Calendar cal = Calendar.getInstance(); 로 한다면 현재 OS의 설정된 시간을 갖는 객체를 얻을 수 있다.


- Calendar.MONTH 는 리턴값이 0~11로서 0부터 시작하므로 결과의 1을 더해주어야 원하는 값을 얻을 수 있다.


- Calendar.DAY_OF_WEEK는 요일을 얻을 수 있으며 리턴형은 int이다. 

값을 확인해보면 Calendar.SUNDAY : 1 ~ Calendar.SATURDAY : 7 이다.

따라서 위 코드에서는 요일을 갖는 문자열 배열을 만들어 간단하게 표현하였다.


- Calendar.HOUR = 0~11 이며 Calendar.HOUR_OF_DAY = 0~23 이므로 HOUR을 사용하고자 한다면 따로 AM/PM을 표시해주어야 한다.







Java max, min, random - 랜덤 수 구하기




결과

결과





코드

public static void main(String[] args) {
		int a = 5, b = 3;
		double x = 4.52, y= 3.45;
		System.out.println("a와b 중 큰 값 : " + Math.max(a, b) );
		System.out.println("x와y 중 작은 값 : " + Math.min(x, y) +"\n" );
		
		for(int i=0; i<6; i++) {
			System.out.println("1~6 랜덤 값 : " + ((int) (Math.random()*6) + 1 )  );
		}
	
	}





Math 메소드


int max(int a, int b) | double max(double x, double y) : 큰 값 구하기

- 인자로 받은 2개의 값을 비교하여 더 큰값을 리턴해준다.





int min(int a, int b) | double min(double x, double y) : 작은 값 구하기

- 인자로 받은 2개의 값을 비교하여 더 작은값을 리턴해준다.





double random() : 랜덤한 실수 얻기

- random 메소드는 0.0 <= Math.random() < 1.0 범위의 값을 얻어온다.


- 이 실수형의 랜덤한 값을 가지고 랜덤한 정수를 얻을 수 있다.


- (int)( Math.random()* n) + s  =>  s<= <s+n 사이의 수를 얻을 수 있다.


- 만약 n=6이고, s=1이면은 "0 <= Math.random() * 6 < 6" 의 범위를 갖는다.

여기의 s=1을 더한다면 "1 <= Math.random() * 6 +1 < 7" 의 범위를 갖는다.

이를 int로 형변환해줌으로써 1~6까지의 정수만을 얻을 수 있다.






Java 반올림, 내림, 올림 - round, ceil, floor






결과

결과





코드

public static void main(String[] args) {
		double num = 3.14;
		System.out.println("절대값 : " + Math.abs(num*-1));
		
		System.out.println("올림 : " + Math.ceil(num));
		System.out.println("내림 : " + Math.floor(num));
		
		System.out.println("반올림 : " + Math.round(num));
		System.out.println("소수점 아래 2째에서 반올림 : " + Math.round(num*10)/10.0);
	
	}





Math 메소드


int abs(int num) | double abs(double num) : 절대값을 얻는다.

- int형 double형 둘다 사용할 수 있다.


- 절대값이므로 양수일 때는 그대로며 음수일 때는 -1을 곱한 결과와 같다.





double ceil(double num) : 올림값을 얻는다.

- 올림값을 얻어 double형으로 리턴해준다.





double floor(double num) : 내림값을 얻는다.

- 내림값을 얻어 double형으로 리턴해준다.





long round(double num) : 반올림 값을 얻는다.

- 넘겨받은 값을 반올림하여 long형으로 리턴한다.


- round() 메소드는 항상 소수점 1째 자리에서 반올림해준다.


- 소수점 아래 n번 째에서 반올림을 시도하고자 한다면 먼저 10n-1를 곱해준 후 round로 반올림한다.

그리고 다시 10n-1을 나누어줌으로써 얻을 수 있다.


 주의할점으로는 round의 리턴형이 long이므로 이를 int형으로 나누어 버리면는 변수가 정수형이되어버린다.

따라서, 위에서 코드를 보면 10.0 나누어준 것처럼 Double형으로 나누어줌으로써 Double형으로 자동 형변환이 일어나도록하여야 소수점 아래 값들을 얻을 수 있다.





Java StringBuilder, StringBuffer




결과

결과





코드

public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();	// 초기화
		sb.append("abcd");	// abcd
		sb.insert(2, "zzzz");	// abzzzzcd
		sb.delete(6,8);			// abzzzz
		sb.replace(0, 2,  "xxxx");	// xxxxzzzz
		sb.reverse();	// zzzzxxxx
		sb.setCharAt(4, 'y');	// zzzzyxxx
		
		String s = sb.toString();
		String s2 = sb.substring(5);
		
		System.out.println("String : " + s);
		System.out.println("String2 : " + s2);
		
	}





StringBuilder()

이미지1

- String은 덧셈 연산처럼 수정하였을 때는 이미지1 처럼 기존의 String 객체를 수정하는 것이 아니라 수정한 새 String 객체를 만들어 연결한다.


- 위 같은 과정이 빈번히 반복되다보면 쓰레기 객체가 늘어나 성능을 안좋게 한다.


- 때문의 StringBuilder를 사용하면 버퍼(데이터를 임시로 저장)에 문자열을 저장, 추가, 수정, 삭제 작업을 추가적인 객체를 생성않으며 할 수 있다.


- 사용할 수 있는 메소드는 String에서도 있는 replace, substring들도 있다. 그리고 append, delete, insert와 같은 추가, 삭제하는 메소드들이 있다.


- 수정 작업이 끝난 후 String 변수에 저장하고자 하면은 toString()을 사용하면 된다.





StringBuffer() vs. StringBuilder()

- StringBuffer()와 StringBuilder()의 사용법은 동일하다.


- 단, StringBuffer()은 멀티 스레드 환경에서 사용할 수 있어 스레드에 safe(안전)하다.


- 반면에 StringBuilder()는 단일 스레드 환경에서 사용하도록 설계되어있다.


- 멀티 스레드 환경이 아니라면 StringBuilder()를 사용하는 것이 더 성능이 좋다.





참조

https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html


https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html







Java int, double -> String, String -> int, double




결과

결과





코드

public static void main(String[] args) {
		String s = "100";
		int num = 10;
		double num2 = 12.34;
		
		System.out.println("--- String -> int, double ---");
		System.out.print("변환 전 덧셈 : ");
		System.out.println(s+5);
		System.out.print("변환 후 덧셈 : ");
		System.out.println(Integer.parseInt(s)+5);
		System.out.print("Double로 변환 : ");
		
		System.out.println(Double.parseDouble(s));
		
		System.out.println("\n--- int -> String ---");
		if(String.valueOf(num) instanceof String)
			System.out.println("num은 String이다.");
		if(num2+"" instanceof String)
			System.out.println("num2은 String이다");
		
	}





String -> int, double

- int형으로 변환할 때는 Integer.parseInt(String s) 를 사용한다.


- double형으로 변환할 때는 Double.parseDouble(String s) 를 사용한다.


- "String + int =" 일경우 int가 String으로 자동으로 변환되어 연산된다.

 따라서, 형변환 전 연산한 값과 형변환 후 연산 값은 다른 결과를 얻는다.  





int, double -> String

- String.valueOf( int num)를 사용하여서 String으로 형변환할 수 있다. 

 valueOf 메소드는 오버로드로 여러 타입이 선언되어 있어 Double형이나 Char형으로도 변환할 수 있다.


- 또는, 간단하게 ""를 더해주면 String형으로 변환된다.









Java 문자열 변경, 자르기 replace(), substring(), split()





결과

결과





코드

public static void main(String[] args) {
		String s = "aaaabbbb";
		String s2 = "aa-aa,bb-bb";
		
		System.out.println("문자열 : " + s);
		System.out.println("a를 c로 바꾸기 : " + s.replace("a", "c"));
		System.out.println("ab를 c로 바꾸기 : " + s.replace("ab", "c"));
		
		System.out.println("substring(4): " + s.substring(4));
		System.out.println("substring(0,4): " + s.substring(0, 4));
		System.out.println("\n문자열 : " + s2 + "\n---,로 문자열 분리---");
		String[] srr = s2.split(",");
		for(String temp : srr) System.out.println(temp);
		
		System.out.println("\n문자열 : " + s2 + "\n---,와-로 문자열 분리---");
		String[] srr2 = s2.split(",|-");
		for(String temp : srr2) System.out.println(temp);
	}





String replace(String old, String new) : 문자열 내 문자(열) 바꾸기

- old 문자(열) 을 new 문자(열) 로 변환한다.


- old 문자(열)이 없을 경우에는 본래 문자열을 받는다.





String substring(int begin [, int end]) : 문자열 잘라서 가져오기

- begin만 주었을 경우 begin부터 문자열 끝까지를 잘라서 리턴한다.


- end도 입력하였을 때는 index가 begin <= index < end 의 문자열을 가져온다.


- 범위를 벗어난 index를 입력하였을 때는 StringIndexOutOfBoundsException 에러가 발생한다.





String[] split(String tok) : 특정 문자를 경계로 문자열 자르기

- 구분자에 따라 문자열을 분리한 문자열 배열을 리턴한다.


- 구분자가 여럿 있을 경우 |을 사용하여서 추가로 지정하면 된다.


- 결과를 보면 ","로 잘랐을 때와 ",|-"로 잘랐을 시 다른 결과를 갖는것을 볼 수 있다.





Java 바이트 변환 getBytes(), equals(), trim()




결과

결과




코드

public static void main(String[] args) {
		String s = new String(" ab cde");
		String s2 = new String(" ab cde");
		
		System.out.println("문자열 : " + s);
		System.out.println("앞뒤 공백 제거 전 : " + s);
		System.out.println("앞뒤 공백 제거 후 : " + s.trim());
		System.out.print("객체 비교 : ");
		System.out.println(s == s2);
		System.out.println("문자열 비교 : " + s.equals(s2) + "\n");
		
		System.out.println("--- 바이트 변환 ---");
		try {
		// byte[] b = s.getBytes("EUC-KR");
		byte[] b = s.getBytes("UTF-8");
		
		System.out.print("바이트 형식 : ");
		for(byte t : b) {
			System.out.print(t + ", ");
		}
		
		String re = new String(b, "UTF-8");
		System.out.println("\n복구 : " + re);
		
		}catch(Exception e) {
			e.printStackTrace();
		}
	}





String trim() : 앞뒤 공백 제거

- 문자열 앞과 뒤의 있는 공백을 제거해 준다.


- 이후 입력 받은 문자열을 비교하거나 할 때 공백이 포함되어 원하는 결과를 얻을 못 얻을 수 있다.

 따라서 이같은 가능성이 있는 곳에는 사용해주어야 좋다. 단, 무분별한 사용은 낭비이다.





boolean equals(Object obj) : 문자열 비교

- 위 결과를 보면 '=='를 사용하여 객체를 비교하였을 시 false로 두 문자열이 다르다고 나온다. 이는 new를 사용하여서 다른 객체로 만들어주었기 때문이다.


- 대신 equals를 사용하면 그 객체의 문자열만을 비교하여서 true가 나오게 된다.





byte[] getBytes(String cs) : 받은 문자형식으로 변환된 byte 배열 생성

- 네트워크로 문자열을 전송하거나, DB의 이미지를 저장하거나 할 때 byte 배열 형식으로 변환할 때 사용한다.


- 'EUC-KR'은 영어는 1byte, 한글은 2byte로 변환한다.


- 'UTF-8'은 영어는 1byte, 한글은 3byte로 변환한다.


- 특정 형식으로 변환할 때는 UnsupportedEncodingException이 발생할 수 있어 try~catch문으로 예외처리를 해야만 사용할 수 있다.


- 다시 String으로 만들 때는 new String(byte[] b, String cs) 으로 디코딩하면 된다.





+ Recent posts