Java

05.10 Class복습,String클래스,정규표현식,Math클래스,

amungstudy 2023. 5. 10. 16:26

동적 클래스 할당 

package b_class.action;

 

public interface Action {

void excute();

 

}


package b_class.action;

 

public class SendAction implements Action{

 

@Override

public void excute() {

System.out.println("데이터를 전송합니다.");

}

 

}


package b_class.action;

 

public class ReceiveAction implements Action{

 

@Override

public void excute() {

System.out.println("데이터를 수신합니다.");

}

 

}


package b_class.action;

 

import java.lang.reflect.InvocationTargetException;

import java.util.Scanner;

 

public class ActionExample {

 

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("메세지 전송 : send, 메세지 수신 : receive >");

String action = sc.next();

action(action);

}

 

public static void action(String doAction) {

Class<?> clazz = null;

try {

// 사용자의 입력에 따라서 동적 클래스 할당 가능

if(doAction.equals("send")) {

clazz = Class.forName("b_class.action.SendAction");

}else {

clazz = Class.forName("b_class.action.ReceiveAction");

}

Action action = (Action)clazz.getConstructor().newInstance();

action.excute();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

}

 



package c_string.method;

 

public class String05ReplaceValueOfExample {

 

public static void main(String[] args) {

String oldStr = "자바는 어렵다! 자바는 그래도 해야한다! 자바!";

//기존 문자열은 그대로임.

String newStr = oldStr.replace("자바", "JAVA");

System.out.println(oldStr);

System.out.println(newStr);

 

// valueOf 매개변수로 전달된 모든 데이터 타입을

// 문자열로 치환하는 정적 메소드

String str = String.valueOf(10);

String str2 = String.valueOf(false);

String str3 = String.valueOf(new Object());

System.out.println(str);

System.out.println(str2);

System.out.println(str3);

 

String str4 = 10+""; // 접합연산 해도 문자열로 바꿀 수 있다.대신 메모리문제 발생.

 

 

}

 

}



게시판같이 메모리가 큰 문자열들은 메모리문제가 발생할 수 있다. 

문자열 접합 연산시 아래 내용 사용

StringBuffer, StringBuilder

버퍼(buffer:데이터를 임시로 저장하는 메모리)에 문자열 저장

버퍼 내부에서 추가, 수정, 삭제 작업 가능

멀티 스레드환경: StringBuffer 사용

단일 스레드환경: StringBuilder 사용

 

package c_string.builder;

 

public class StringBuilderExample {

 

public static void main(String[] args) {

String str = "최기근";

System.out.println(str.hashCode());

String str1 = "최기근";

System.out.println(str1.hashCode());

String str2 = "최기근최기근";

System.out.println(str2.hashCode());

String str3 = str+str1;

//해시코드는 중복될 수 있다.연산된 결과로 정수값 표현하니까. 유일한 값x

System.out.println(str3.hashCode());

//접합연산은 새로운 공간에 생성.

System.out.println(str2 == str3);

 

str +=" 천재";

System.out.println(str.hashCode());

str +=" 다";

System.out.println(str.hashCode());

 

//문자열을 하나의 heap 영역에 누적해서 제어하는 class(메모리 낭비 덜함)

StringBuffer sbf = new StringBuffer();

StringBuilder sb = new StringBuilder("초기값 : ");

//기존 값 뒤에 매개변수로 전달받은 문자열을 이어서 추가(타입상관x)

sb.append("자바 ");

sb.append("Programming Study!");

sb.append(11);

String result = sb.toString();

System.out.println(result);

//문자열에서 4번째 인덱스에 두번째 매개변수 값을 삽입

sb.insert(4, 2);

System.out.println(sb);

//해당 인덱스에 있는 문자를 두번째 매개변수의 문자로 변경

sb.setCharAt(4,'8');

System.out.println(sb);

// 시작인덱스 부터 해당 자리전까지 문자열 삭제

sb.delete(4, 6);

System.out.println(sb);

// 해당 인덱스에 있는 한개의 문자 삭제

sb.deleteCharAt(4);

System.out.println(sb);

 

// 문자열 역순 정렬

System.out.println(sb.reverse());

}

 

}

 



package c_string.constructor;

 

import java.io.IOException;

 

public class BytesToStringExxample {

 

public static void main(String[] args) throws IOException {

byte[] bytes = new byte[] {

72,101,108,108,111,32,74,97,118,97

};

 

String str = new String(bytes);

System.out.println(str);

// 저장한 문자열을 byte배열로 반환

bytes = str.getBytes();

for(byte b : bytes) {

System.out.print(b+" ");

}

System.out.println();

 

// 매개변수로 전달받은 배열에서

// 6번째 인덱스부터 4개 만큼의 문자열 생성

String str2 = new String(bytes,6,4);

System.out.println(str2);

 

char[] strs = new char[] {'안','녕','하','세','요'};

str = new String(strs);

System.out.println(str);

str = new String(strs,0,2);

System.out.println(str);

char[] charArray = str.toCharArray();

for(char c : charArray) {

System.out.print(c+" ");

}

System.out.println();

 

str = "한글표현";

System.out.println(str.length());

byte[] bytes1 = str.getBytes();

System.out.println(bytes1.length);

 

byte[] bytes2 = str.getBytes("EUC-KR");

System.out.println(bytes2.length);

//생성자에 문자셋 지정(두번째 매개변수)

String result = new String(bytes2,"EUC-KR");

System.out.println(result);

 

while(true) {

System.out.println("시스템 class를 이용하여 키보드의 값을 입력 > ");

bytes = new byte[100];

//배열안에 값을 저장해놓고 실제 저장한 변수개수 전달해줌.

int read = System.in.read(bytes);

System.out.println("read : " + read);

for(byte b : bytes) {

System.out.print(b+", ");

}

System.out.println();

// System.out.println("문자로변환 : " + (char)read);

result = new String(bytes,0,read-2);

System.out.println(result);

 

if(result.equals("q")) {

System.out.println("시스템 종료");

System.exit(0);

}

}

 

//예시

// String member = "최기근|hap0p9y|12345|부산";

 

}

}



정규표현식

java(정규식).pptx
0.11MB

 

 

package regex;

 

import java.util.Scanner;

import java.util.regex.Pattern;

 

public class RegexExample {

 

public static void main(String[] args) {

/*

* ^ : 문자열의 시작을 알림

* $ : 문자열의 종료를 알림

* . : 임의의 한 문자를 나타냄

* + : 특정 문자가 한번 이상 반복됨.

* | : or 를 나타냄

* [] : 문자열지정

* {} : 범위 개수를 지정

* \w : 알파벳이나 문자

* \W : 알파벳이나 숫자를 제외한 문자

* \d : 숫자를 표현 [0-9] 와 동일

* () : 문자열 조합의 그룹핑

*/

 

String regExp = "(02|010)-\\d{3,4}-\\d{4}";

Scanner sc = new Scanner(System.in);

System.out.println("전화번호를 입력해주세요. ex)010-9486-7166");

String phone = sc.next();

 

//Pattern.matches : 정규표현식에 맞게 작성되었는지 확인하는 메소드

boolean result = Pattern.matches(regExp, phone);

if(result) {

System.out.println("정규식과 일치합니다.");

}else {

System.out.println("정규식과 일치하지 않습니다.");

}

 

}

 

}



문자열 분리 방법 2가지( Stringsplit(), StringTokenizer)

Stringsplit() 메소드 이용

java.util.StringTokenizer 클래스 이용

Stringsplit()

정규표현식을 구분자로 해서 부분 문자열 분리

배열에 저장하고 리턴

 

 

package c_string.split_tokenizer;

 

public class StringSplitExample {

 

public static void main(String[] args) {

String text = "최기근&김유신,홍길동\\페이커-빛강선";

String[] names = text.split("&|,|-|\\\\"); // (정규표현식)

for(String s : names) {

System.out.print(s + " ");

}

System.out.println();

 

}

 

}

 


package c_string.split_tokenizer;

 

import java.util.StringTokenizer; (정규표현식x)

 

public class StringTokenizerExample {

 

public static void main(String[] args) {

String text = "이나영/김희선/박보영/원빈/장동건";

StringTokenizer st = new StringTokenizer(text,"/");

//잘라낸 문자열 몇개인지 나타냄

int count = st.countTokens();

System.out.println("count : "+count);

for(int i = 0; i < count; i++) {

String token = st.nextToken();

System.out.print(token+" ");

}

System.out.println();

System.out.println("=================");

 

//두번째 방법

text = "홍길동|최기근,이순신&손흥민\\김유신\"김민재";

st = new StringTokenizer(text,"|,&\\\""); //정규표현식 아님

while(st.hasMoreTokens()) { //꺼내올 개수가 있으면 true / 없으면 false

String token = st.nextToken();

System.out.print(token+" ");

}

}

 

}

 



Math 클래스

package d_math;

 

public class MathExample {

 

public static void main(String[] args) {

// Math - (수학 관련 계산 처리 class)

 

// 절대값을 알려주는 abs 함수

int v1 = Math.abs(-5);

double v2 = Math.abs(-3.14);

System.out.println("v1 : " + v1);

System.out.println("v2 : " + v2);

 

// 내림

double v3 = Math.floor(5.3);

double v4 = Math.floor(-5.3);

System.out.println("v3 : " + v3);

System.out.println("v4 : " + v4);

 

// 올림

double v5 = Math.ceil(5.3);

double v6 = Math.ceil(-5.3);

System.out.println("v5 : " + v5); // 6.0

System.out.println("v6 : " + v6); //-5.0

 

// 두 개의 값을 매개변수로 전달받아 둘 중 큰 수를 반환

int v7 = Math.max(10, 12);

System.out.println("v7 : "+v7);

double v8 = Math.max(10.1, 10.4);

System.out.println("v8 : "+v8);

 

// 두 개의 값을 매개변수로 전달받아 둘 중 작은 수를 반환

int v9 = Math.min(10, 12);

System.out.println("v9 : "+v9);

double v10 = Math.min(10.1, 10.4);

System.out.println("v10 : "+v10);

 

// 반올림

// 소수점 첫째자리에서 반올림하고

// 값을 double type으로 반환 rint

double v11 = Math.rint(5.3111);

double v12 = Math.rint(5.511);

System.out.println("v11 : "+v11); //5.0

System.out.println("v12 : "+v12); //6.0

 

// 반올림 하고 나서 long타입으로 값을 반환 (정수타입으로 반환)

long v13 = Math.round(5.54352);

System.out.println("v13 : "+v13); // 6

 

// 0 <= random < 1.0

double random = Math.random();

System.out.println("random :" + random);

 

// 거듭 제곱

// pow(a,b)

// a와 b에 대한 제곱 연산

// pow(2,10) == 2의 10승

double v14 = Math.pow(2, 10);

System.out.println("v14 : " + v14); // 1024

 

// 제곱근 - 16의 제곱근은 4

double v15 = Math.sqrt(9);

System.out.println("v15: "+ v15); // 3.0

 

// 두 수의 차이

int v16 = Math.subtractExact(11, -5);

System.out.println("v16: "+v16); // 16

 

System.out.println(Math.cos(10));

System.out.println(Math.sin(10));

System.out.println(Math.tan(10));

}

 

}

 


Random 클래스

boolean, int, long, float, double 난수 입수 가능

난수를 만드는 알고리즘에 사용되는 종자값(seed) 설정 가능

종자값이 같으면 같은 난수

 

package e_random;

 

import java.util.Random;

 

public class RandomExample {

 

public static void main(String[] args) {

//1970 1월 1일 09:00:00

// 천분의 1초

long current = System.currentTimeMillis();

// 10억분의 1초

long nano = System.nanoTime();

 

//종자값이 있는 random클래스 : 동일한 값이 나옴.

Random random = new Random(5);

for(int i = 0; i < 5; i++) {

// nextInt(n) == 0 <= ~ < n

int number = random.nextInt(45)+1;

System.out.print(number+" ");

}

System.out.println();

 

 

random = new Random(nano); // == new Random();

for(int i = 0 ; i < 5; i++) {

System.out.println(random.nextBoolean());

System.out.println(random.nextDouble());

System.out.println(random.nextInt());

System.out.println(random.nextInt(10));

}

 

long endTime = System.nanoTime();

long workTime = endTime - nano;

System.out.println();

double seceonds = workTime / 1000000000.0;

System.out.println(seceonds);

}

 

}


 

형식(Format) 클래스

숫자와 날짜를 원하는 형식의 문자열로 변환

종류

숫자 형식: DecimalFormat

날짜 형식: SimpleDateFormat

매개변수화 된 문자열 형식: MessageFormat

 

숫자 형식 클래스(DecimalFormat)

적용할 패턴 선택해 생성자 매개값으로 지정 후 객체 생성

 

package f_format;

 

import java.text.DecimalFormat;

 

public class DecimalFormatExample {

 

public static void main(String[] args) {

// 숫자 형태의 값을

// 지정한 형식의 문자열로 반환

double num = 1234578.849;

// #(십진법. 남은자리 채우지x), 0(남은자리 0으로 채움)

DecimalFormat df = new DecimalFormat("0");

String str = df.format(num);

System.out.println(str);

// 소수점 첫째 자리까지 표현

df = new DecimalFormat("0.0");

str = df.format(num);

System.out.println(str);

// 포맷 형식 변경

df.applyLocalizedPattern("0.00");

str = df.format(num);

System.out.println(str);

// 10진수의 빈자리를 0으로 채움

df.applyLocalizedPattern("0000000000.00");

str = df.format(num);

System.out.println(str);

 

df.applyLocalizedPattern("##########.##");

str = df.format(num);

System.out.println(str);

// 구분자 넣기

df.applyLocalizedPattern("#,###.##");

str = df.format(num);

System.out.println(str);

// 단위 표현

df.applyLocalizedPattern("$ #,###,###");

str = df.format(num);

System.out.println(str);

// \u20A9 유니코드 원화기호 == 8361

df.applyLocalizedPattern("\u20A9 #,###,###");

str = df.format(num);

System.out.println(str);

 

char c = '\u20A9';

System.out.println(c == 8361);

}

 

}

 

 


날짜 형식 클래스(SimpleDateFormat)

package f_format;

 

import java.text.SimpleDateFormat;

import java.util.Date;

 

public class DateFormatExample {

 

public static void main(String[] args) {

// Date == long 타입의 시간 정보를 저장하는 class

Date date = new Date();

System.out.println(date);

// date.getYear();

SimpleDateFormat sdf = new SimpleDateFormat();

// 시간표현

// HH - 0 ~ 23

// hh - 1 ~ 12

// KK - 0 ~ 11

// kk - 1 ~ 24

// yy.MM.dd. a kk:mm 기본 패턴

String now = sdf.format(date);

System.out.println("now : "+now);

sdf = new SimpleDateFormat("yyyy-MM-dd E요일 a KK:mm:ss");

now = sdf.format(date);

System.out.println(now);

now = sdf.format(new Date(0));

System.out.println(now);

now = sdf.format(new Date(Long.MAX_VALUE));

System.out.println(now);

System.out.println(1000 * 60 * 60 * 24 * 365); // 일년

// ss.sss 초 정보를 밀리세컨까지 출력

// D 년중 날짜

sdf = new SimpleDateFormat("yyyy년MM월dd일 E요일 HH:mm:ss.sss D");

now = sdf.format(System.currentTimeMillis());

System.out.println(now);

}

 

}


 

매개변수화 된 문자열 형식 클래스(MessageFormat)

(다국어 지원시 많이 사용된다.)

import java.text.MessageFormat;

 

public class MessageFormatExample {

 

public static void main(String[] args) {

//1번째 방법

String text = "회원 ID : {0} \n회원 이름 : {1}\n전화 번호: {2}";

String result = MessageFormat.format(text, "id001","최기근","01094867166");

System.out.println(result);

//2번째 방법

String text2 = "학번은 {0}, 이름은 {1}, 전화번호는 {2}";

Object[] arguments = {1, "최기근"};

result = MessageFormat.format(text2, arguments);

System.out.println(result); // 채워지지않은 정보는 그대로 출력됨.

}

 

}

 


Arrays 클래스

 

package g_arrays;

 

import java.util.Arrays;

import java.util.Comparator;

 

public class ArraysSortExample {

 

public static void main(String[] args) {

int[] scores = {100,99,98,60,97};

System.out.println(scores);

String result = Arrays.toString(scores);

System.out.println(result);

 

// sort - 분류 - 오름차순 정렬

Arrays.sort(scores,2,4); // 2번째인덱스부터 4번째 인덱스 이전까지

System.out.println(Arrays.toString(scores));

 

Arrays.sort(scores);

System.out.println(Arrays.toString(scores));

 

String[] names = {"홍길동","최기근","김민재","전지현"};

Arrays.sort(names);

System.out.println(Arrays.toString(names));

 

// 주의

//Comparator : 인터페이스 (오버라이딩시 인스턴스 생성 가능)

Comparator<String> compare = new Comparator<String>() {

@Override

public int compare(String o1, String o2) {

// 문자열을 비교하여 정수값을 반환

int result = o2.compareTo(o1); // 내림차순 (반대는 오름차순)

return result;

}

 

};

Arrays.sort(names,compare);

System.out.println(Arrays.toString(names));

 

//fill - 배열의 값을 매개변수로 전달한 값으로 대체

//1번째 인덱스부터 3번째 인덱스 이전까지 매개변수로 전달된 문자열로 변경

Arrays.fill(names, 1,3,"이인자");

System.out.println(Arrays.toString(names));

//모든 항목의 값을 null로 변경

Arrays.fill(names, null);

System.out.println(Arrays.toString(names));

}

}


 

package g_arrays;

 

import java.util.Arrays;

 

public class ArraysCopyExample {

 

public static void main(String[] args) {

int[] scores = {100,60,70,80,90};

System.out.println(Arrays.toString(scores));

 

int[] scores2 = new int[scores.length+1];

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

scores2[i] = scores[i];

}

System.out.println(Arrays.toString(scores2));

scores2[scores2.length - 1] = 100;

System.out.println(Arrays.toString(scores2));

 

char[] arr1 = {'J','A','V','A'};

System.out.println(Arrays.toString(arr1));

// Arrays.copyOf(원본배열, 복사할 길이);

char[] arr2 = Arrays.copyOf(arr1,arr1.length + 1);

System.out.println(Arrays.toString(arr2));

char[] arr3 = Arrays.copyOf(arr1, arr1.length - 1);

System.out.println(Arrays.toString(arr3));

 

// Arrays.copyOfRange(원본배열,시작인덱스,마지막인덱스 - 1);

char[] arr4 = Arrays.copyOfRange(arr1,1,3);

System.out.println(Arrays.toString(arr4));

 

 

// System.arraycopy(원본배열,시작인덱스,복제배열,시작인덱스,복사할 길이)

// 이미 복제배열이 생성되어있어야함.

char[] arr5 = new char[arr1.length+1];

System.arraycopy(arr1, 0, arr5, 0, arr1.length);

System.out.println(Arrays.toString(arr5));

}

 

}


 

package g_arrays;

 

import java.util.Arrays;

 

public class ArraysSearchExample {

 

public static void main(String[] args) {

int[] scores = {1, 10, 5, 8, 7};

// 0 1 2 3 4

// -1 -2 -3 -4 -5 -6

// 값을 찾지 못했을 때는 마지막 검색 위치를 음수로 반환

Arrays.sort(scores);

// 이진탐색이라서 정렬필수

int index = Arrays.binarySearch(scores, 10);

System.out.println("찾은 인덱스:" + index);

 

}

 

}


 

package g_arrays;

 

import java.util.Arrays;

 

public class ArraysEqualsExample {

 

public static void main(String[] args) {

int[][] original = {

{1,2},

{3,4}

};

int[][] copy = Arrays.copyOf(original, original.length);

// original == copy : false

System.out.println(original.equals(copy));

// 2차원 배열의 각 인덱스 항목을 비교(1차원배열 주소값이 같음) : true

// original[0] == copy[0]

// original[1] == copy[1]

System.out.println(Arrays.equals(original, copy));

// 2차원 배열 안의 1차원 배열의 항목의 값을 비교

// original[0][0] == copy[0][0]

// original[0][1] == copy[0][1]

// original[1][0] == copy[1][0]

// original[1][1] == copy[1][1]

System.out.println(Arrays.deepEquals(original, copy));

 

System.out.println("깊은 복제");

int[][] copy2 = Arrays.copyOf(original, original.length);

copy2[0] = Arrays.copyOf(original[0], original[0].length);

copy2[1] = Arrays.copyOf(original[1], original[1].length);

System.out.println(Arrays.toString(original));

System.out.println(Arrays.toString(copy));

copy[0][1] = 70;

copy2[0][1] = 100;

System.out.println(Arrays.toString(copy2));

//2차원배열의 1차원배열의 값 출력

System.out.println(Arrays.deepToString(original));

System.out.println(Arrays.deepToString(copy2));

System.out.println(original.equals(copy2));

System.out.println(Arrays.equals(original, copy2));

System.out.println(Arrays.deepEquals(original, copy2));

}

 

}