동적 클래스 할당
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|부산";
}
}
정규표현식
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가지( String의 split(), StringTokenizer)
String의 split() 메소드 이용
java.util.StringTokenizer 클래스 이용
String의 split()
정규표현식을 구분자로 해서 부분 문자열 분리
배열에 저장하고 리턴
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));
}
}
'Java' 카테고리의 다른 글
05.12실습 (0) | 2023.05.12 |
---|---|
05.11 컬렉션 프레임워크 (0) | 2023.05.11 |
05.09 예외처리 (0) | 2023.05.09 |
05.08 제네릭 와일드카드, Object, 예외처리 (0) | 2023.05.08 |
generic (0) | 2023.05.04 |