개발자 끄적끄적

String Tokenizer, Math, Format 클래스, 중첩 클래스 본문

JAVA

String Tokenizer, Math, Format 클래스, 중첩 클래스

햏치 2023. 3. 4. 18:45

<StringTokenizer>
- 지정된 문자열을 구분자를 사용하여 token이라는 조각으로 분리하는 기능
- 구분자를 2개 이상의 문자로 지정하더라도 한자씩 사용하여 token으로 분리


[주요 생성자]
1. StringTokenizer(String source, String delim)
- delim에 들어있는 문자 하나 하나 따로 사용하여 
  source문자열을 토큰으로 만든다

2. StringTokenizer(String source, String delim, boolean b)
- Boolean값이 true이면, delim문자들로 토큰이 된다 

3. int countTokens()
- 꺼내지 않고 남아 있는 토큰의 갯수

4. boolean hasMoreTokens()
- 남아 있는 토큰이 있으면 참

5. String nextToken()
- 토큰을 하나 꺼내옴




<StringTokenizer와 String.split의 차이>
- StringTokenizer는 무효의 값은 버려진다
- String.split은 무효의 값도 배열로 처리되며, 문자열로 쪼갤 수 있다


ex)StringTokenizer VS String.split
package lang;

import java.util.StringTokenizer;

public class TokenVSSplit {


public static void main(String[] args) {
String str = "abc,abc,def.123-456/789";
StringTokenizer st = new StringTokenizer(str,",.-/");
System.out.println("token count :" + st.countTokens()); 

출력 : token count : 6

while(st.hasMoreTokens()) {
Object o = st.nextElement();
String t = (String)o;
System.out.println(t);
출력 :
abc
abc
def
123
456
789
}
System.out.println("split------------------");
String[] sp = str.split(",|\\.|-|/"); //정규식이기 때문에 .(반점)은 \\로 표시
System.out.println("split length :" + sp.length);
출력 : split length :6
for(int i=0; i<sp.length; i++) {
String s = String.format("%d ] = %s", i, sp[i]);
System.out.println(s);
출력 :
0 ] = abc
1 ] = abc
2 ] = def
3 ] = 123
4 ] = 456
5 ] = 789
}
}
}




<Math>
- 수학과 관련한 함수들이 들어 있는 클래스
- 메서드는 모두 static형이므로 클래스명을 사용하여 바로 사용이 가능하다
  즉, new ~로 생성하지 않고 바로 사용이 가능하다( Math.메소드명(변수) )

[주요 메서드]
int abs(int a)
double abc(double d) : 절대값 반환
ex)Math.abs(-10)=10

double ceil(double d) :  소숫점 이하를 올림값(절상)
ex)Math.ceil(3.01)=4
    Math.ceil(-3.01)=-3

double floor(double d) : 소숫점 이하를 내림값(절하)
ex)Math.floor(3.01)=3
   Math.floor(-3.01)=-4

int max(int x, int y)
double max(double x, double y)
int min(int x, int y)
double min(double x, double y) : x, y중 큰 값 또는 작은 값

double random() : 난수값(0<=r<1)

long round(double x) : 반 올림 값



ex)Math.random()함수를 이용
[서로 중복되지 않는 로또 번호 6개 추출하기]
요구사항 :
1) 1~45까지를 배열에 저장
2) 난수 1개 발생
3) 배열의 0번째와 난수로 발생된 위치의 값을 교환
4) 앞에서부터 6개씩 선택
package lang;

import java.util.Arrays;

public class Lotto {

public static void main(String[] args) {
int temp = 0;
int[] lo = new int[45];
for(int i=0; i<lo.length; i++) lo[i] = (i+1);
System.out.println(Arrays.toString(lo));
출력 :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
 41, 42, 43, 44, 45]

for(int i=0; i<100; i++) {
int r = (int)(Math.random()*44+1); 
//random은 double형
//곱한 숫자(44)는 max, 1은 최소값(즉, 1~44의 난수 발생)
temp = lo[0];
lo[0] = lo[r];
lo[r] = temp;
}
System.out.println("after...............");
System.out.println(Arrays.toString(lo));
}
}
출력 :
[11, 26, 29, 4, 38, 39, 3, 12, 32, 44, 40,
 31, 14, 35, 5, 18, 16, 36, 37, 19, 22, 
27, 2, 24, 20, 8, 28, 7, 10, 30, 1, 33, 
13, 15, 41, 43, 25, 23, 21, 45, 34, 6,
 42, 9, 17]






<Wapper 클래스>
- 기본형 8가지에 대한 객체를 만들거나 값을 반환할 수 있는 클래스들
- 데이터의 반환은 자동으로 boxing(기본형 8가지->객체형), 
  unboxing(객체형->기본형 8가지)이 된다


[종류]
- Byte, Character, Short, Integer, Long, Float, Double, Boolean


[주요 메서드]
Byte.ParseByte(str)
Short.parseShort(str)
Integer.parseInt(str)
Long.parseLong(str)
Float.parseFloat(str)
Double.parseDouble(str) : 문자열 str을 해당 타입의 숫자로 바꿔준다

int Charact.getNumeticValue(Char c) : c값을 정수형으로 반환 - 잘 안 씀






<기본 API 클래스>

<Format클래스>
1. DecimalFormat : 천단위 분리기호나 소숫점 자리를 지정
2. MessageFormat : DM등 메시지를 발송할 때의 포멧 지정
3. SimpleDateFormat : 날짜 형식 지정
4. ChoiceFormat : 범위 내에 있는 값을 선택


<DecimalFormat>
- 천단위 분리기호를 만들어 준다
- 소숫점 이하의 자릿수가 부족하면 반올림한다

0 : 빈자리는 0으로 채운다
# : 빈자리는 공백으로 채운다
E : 지수 표현
; : 음수, 양수를 구분하여 표현
% : 백분율로 표시
\u00a4 : 통화 기호



<MessageFormat>
- DM과 같은 일정한 문자열에 특정 값들이 변경될 때 사용



<SimpleDateFormat>
- 날짜 데이터를 일정한 형식으로 바꾸어 준다
   yyyy,MM,dd : 년(year), 월(Month), 일(day)
   hh:mm:ss : 시(hour), 분(minute), 초(second)
   SS : 천분의 1초(1/1000초)
   HH : 24시각
   E : 요일
   a : 오후

<ChoiceFormat>
- 체크할 값이 특정 영역이면 그에 해당하는 문자를 리턴한다
- 영역을 지정할 값은 오름차순으로 정렬되어 있어야 한다



<Pattern 클래스>
- 문자열을 효과적으로 검색하거나 일정한 패턴의 문자열인지 판별하기 위해 사용


[주요 메소드]
[] : 하나의 문자 [abc]->a, b, c이면 참
[^] : 문자가 아니면 참 [^abc]->a, b, c가 아니면 참
* : 0개 이상
+ : 1개 이상
? : 0 또는 1개
. : 한개 문자
\d : [0-9]의 의미
\w : [a-zA-Z_0-9]의 의미
() : 그룹
{n,}{n, m}{n} : n~m개 까지, {n,}->n개 이상
*(Java에서)\\. : .


ex)Format 클래스
package lang;

import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormatEx {

public static void main(String[] args) {
//천단위 분리 기호
DecimalFormat df1 = new DecimalFormat("00,000,000.00");
DecimalFormat df2 = new DecimalFormat("##,###,###.##");
double num = 1234567.89923;
System.out.println(df1.format(num));
출력 : 01,234,567.90
System.out.println(df2.format(num));
출력 : 1,234,567.9
//변수값을 사용한 DM발송
String fmt = "{0} 고객님 방가. 고객님은 연이율 {1}로 {2}원율 오백년 만기 대출 가능요~";
String[] info = {"홍길동", "2.5%", "100억"};
String dm = MessageFormat.format(fmt, info);
System.out.println(dm);
출력 : 
홍길동 고객님 방가. 고객님은 연이율 2.5%로 100억원율 오백년 만기 대출 가능요~

String fmt2 = String.format("%s 고객님 방가. 고객님은 연이율 %s로 %s원율 오백년 만기 대출 가능요~",
info);
System.out.println(fmt2);
출력 :
홍길동 고객님 방가. 고객님은 연이율 2.5%로 100억원율 오백년 만기 대출 가능요~
//SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 (E요일) a HH:mm:ss");
System.out.println(sdf.format(new Date()));
출력 : 2022년 04월 25일 (월요일) 오후 17:51:55
}
}




ex)Pattern 클래스
package lang;

import java.util.regex.Pattern;

public class PatternEx {

public static void main(String[] args) {
//이메일 테스트
String email = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
String[] test = {"hipwg@", "hipwg@naver", "hipwg@naver.com",
"hipwg@naver.co.kr", "hipwg@naver.com.co.kr", "@naver.com"
};

for(String s : test) {
boolean b = Pattern.matches(email, s);
System.out.println(s + ">>>" + b);
출력 :
hipwg@>>>false
hipwg@naver>>>false
hipwg@naver.com>>>true
hipwg@naver.co.kr>>>true
hipwg@naver.com.co.kr>>>false
@naver.com>>>false
}

//연락처 테스트
String phone = "\\d{2,3}-\\d{3,4}-\\d{4}$";
String[] test_1 = {
"02-12-1234", "02-123-1234", "02-1234-123", "0321-123-1234",
"010-6351-3491"
};
for(String s : test_1) {
boolean b = Pattern.matches(phone, s);
System.out.println(s + ">>>" + b);
출력 :
02-12-1234>>>false
02-123-1234>>>true
02-1234-123>>>false
0321-123-1234>>>false
010-6351-3491>>>true
}
       }
}


<중첩 클래스> - 잘 안 씀
- 클래스 안에 클래스를 선언하여 사용하는 방법
- 이벤트를 처리할 목적이나 간단한 쓰레드를 처리할 목적으로 중첩 클래스를 
  사용하지만, 그 외의 사용은 최대한 사용하지 않는 편이 좋다
이유 : 클래스가 갖고 있는 일반적인 객체의 특성을 대부분 사용을 어렵게 
  하거나 특성이 회손되기 때문이다

[중첩 클래스의 유형]
1. 인스턴스형
class A{
  class B{ ... } 
}

2. 정적형
class A{
  static class B{ ... }
}

3. 로컬형
class A{
  void method(){
    class B{ ... }
  }
}


ex)이벤트 처리를 내부 클래스를 만들어 처리
import java.awt.*;
import java.awt.event.*;

class innerClass4 extends Frame{
  Button b = new Button("exit");
  myActionListener myAction = new myActionListener();

public innerClass4(){
  setLayout(null);
  setSize(400, 400);
  b.setBounds(100, 100, 100, 100);
  b.addActionListener(myAction);
  add(b);
}

public static void main(String args[]){
  innerClass4 ic4 = new innerClass4();
  ic4.SetVisible(true);
}

//method type inner class
class myActionListener implements ActionListener{
  public void actionPerformed(ActionEvent ev){
    System.exit(0);
    }
  }
}