2023.03.21 : Java - System 클래스, Java.util, 입력, 컬렉션

이준영·2023년 3월 21일
0

라이브러리(API) -> 패키지 단위로 제공한다.
내장(부) API
모듈(지금은 신경x)

-> 패키지 :
java.lang 패키지(너무 많이 쓰여 import 생략, 문법, Object 중요하다.)
toString(), equals(), String(불변성) / Stringbuffer / StringBuilder ,
Math , Wrapper 클래스(최대, 최소값 / 형변환) ,

-> 클래스 (책 408 자바 랭 패키지)

외부 API



replace / replaceAll 차이

둘 다 차이는 없어보이나 replaceAll은 정규식을 처리할 수 있어 replace에서 처리하지 못한 값들도 처리가 가능하다. (범위가 더 넓다)

--> replaceAll은 []안의 문자들을 모두 1로 변환, replace는 abc라는 값만 1로 치환한다.
replace를 replaceAll처럼 사용하려면 밑의 식과 같다.

= String result1 = str.replace("a", "1").replace("b", "1").replace("c", "1"); --> 이와같이 훨씬 불편하다.




System 클래스

자바 프로그램은 운영체제에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다.
java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제 일부 기능 이용할 수 있다. ( 프로그램 종료, 키보드로부터 입력, 출력, 현재 시간 읽기 등 가능)
System 클래스의 모든 필드와 메소드는 정적(static)으로 구성되어 있다.

시스템 클래스 (420쪽 확인)



프로그램 종료 : exit()

현재 실행하고 있는 프로세스 강제 종료
() int 매개값 지정하도록 되어있는데(종료 상태값) 일반적으로 정상 종료일 경우 0을 준다.

인자가 없을 경우 if문의 비정상 출력하고 exit로 강제종료



시간(타이머 기능) : currentTimeMillis() / nanoTime()

밀리세컨드(1/1000초) / 나노세컨드(1/10의9승 초)

프로그램 시작시 시각읽고 끝날 시 시각 읽어서 차이를 구하면 프로그램 실행 소요 시간이 나온다



환경 정보 얻기 : getProperty / getenv

운영체제 정보 / 실행되는 곳 정보 등 얻을 때 사용 가능



라인 구분자 : lineSeparator()

\n 역할과 동일한 기능 수행



shadow copy / deep copy : 참조값 복사

shadow copy : 어떤 변수 배열의 참조값을 참조한 것 (둘의 참조값이 같음)
deep copy : 참조값 그 자체를 하나 더 복사하는 것 (arraycopy) (둘의 참조값이 다름)

arraycopy 형식 : arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src : 전송할 배열
srcPos : 시작 위치
dest : 전송받을 배열
destPos : 받을 데이터 시작 위치
length : 카피되는 배열 요소 길이

shadow copy


deep copy



브라우저 위치 찾아서 cmd에서 실행하기

edge 위치 -> C:\Program Files (x86)\Microsoft\Edge\Application 의 msedge.exe

"" 쓰는 이유 - 공백이 있으면 안되는데 ""를 통해 하나의 문자열로 만들어 주기 위해서이다.
뒤에 daum사이트 인자를 추가하면 다음으로 가진다.


eclipse에서 브라우저를 실행하기

이클립스나 다른 곳에서도 브라우저를 실행할 수 있다.

메모장을 실행하기




java.util 패키지

Date 클래스


선언


표준시

toString 오버라이딩 되어있는 모습 확인


한글식으로 표시 : toLocaleString()


요일을 한글로 표시하기


직접 넣어서 날짜 구하기

1900 기본값이고 그냥 숫자를 넣으면 +되는 구조라 -1900을 해줘야 한다.




Calendar 클래스

달력을 표현한 클래스
추상 클래스이다.


선언

출력하면 엄청 긴 여러가지 내용들이 함축되어 나온다.


뒤에 더 있다.


캘린더 클래스로 원하는 내용값 가져오기

calender.get(Calendar.내용(상수형식)) 형식으로 가져온다.
요일은 특이하게 일요일이 1 기준이다 (토요일 7)


getTime


내용값 중 최대값 구하기 : getActualMaximum()

이 코드는 현재 일 중의 마지막 일( 31 )


c.set()

마찬가지로 직접 넣어서 현재 시간을 확인 가능하다.
getTime().toLocaleString() 써서 현재시간 한글로 확인


특정 기간의 전 / 지난 후 : add

특정 시간의 과거 , 미래를 설정할 수 있다.



응용 : 달력 만들어보기

import java.util.Calendar;

public class Calender3 {

	public static void main(String[] args) {
		
		int year = 2023;
		int month = 12;
		
		Calendar startCalendar = Calendar.getInstance();
		Calendar endCalendar = Calendar.getInstance();
		
		startCalendar.set(year, month-1, 1);
		endCalendar.set(year, month, 1-1);
		
		// 첫 일의 요일을 알기 위함
		int startDayOfWeek = startCalendar.get(Calendar.DAY_OF_WEEK);
		// 끝 일의 숫자를 알기 위함
		int endDate = endCalendar.get(Calendar.DATE);
		
		System.out.println(" SU MO TU WE TH FR SA");
		
		for(int i = 1; i<startDayOfWeek; i++) {
			System.out.print("   ");  //공백 3개
		}
		
		for(int i = 1, n = startDayOfWeek; i <= endDate; i++, n++) {
			System.out.print( (i < 10) ? "  " + i : " " + i);
			if(n % 7 == 0) {
				System.out.println();
			}
		}
	}
}




문자열 쪼개기 : StringTokenizer

(473,474 페이지)

문자열을 우리가 지정한 구분자로 쪼개주는 클래스
쪼개진 문자열을 Token이라고 부름

선언

		String strData1 = "사과 자몽 수박 딸기";
		StringTokenizer st1 = new StringTokenizer(strData1);
        
		String strData2 = "사과자몽&수박딸기";
		StringTokenizer st2 = new StringTokenizer(strData2, "&");
        
		String strData3 = "x=100*(200+300)/2";
		//여러개를 쓰게되면 하나하나가 구분자가 되어 분리된다.
		StringTokenizer st3 = new StringTokenizer(strData3, "+-*/=()");
        



남아있는 토큰 개수 구하기 : countTokens()

현재 남아있는 토큰의 개수를 출력한다.
토큰이 몇 개 빠진 상태면 빠지고 난 후의 개수를 출력함.

	public static void main(String[] args) {
		String strData1 = "사과 자몽 수박 딸기";
		StringTokenizer st1 = new StringTokenizer(strData1);
		
		//안에 있는 것이 몇 개로 잘렸는지 알 수 있다.
		System.out.println(st1.countTokens());



토큰 출력하기 : nextToken() / nextElement()

nextToken()은 String 반환 / nextElement()은 Object 반환
기능은 같다.
한 조각씩 얻고 싶을 때 사용(출력할 수록 인덱스를 건너가면서 실행해줌, 범위 넘어가서 출력하면 에러 발생)
보통 while문을 통해 전체를 뽑는다.

import java.util.StringTokenizer;

public class StringTokenizer1 {

	public static void main(String[] args) {
		String strData1 = "사과 자몽 수박 딸기";
		StringTokenizer st1 = new StringTokenizer(strData1);
		
		//안에 있는 것이 몇 개로 잘렸는지 알 수 있다.
		System.out.println(st1.countTokens());
		
		//한 조각씩 얻고 싶을 때 사용(출력할 수록 인덱스를 건너가면서 실행해줌, 범위 넘어가서 출력하면 에러 발생)
//		System.out.println(st1.nextToken());
//		System.out.println(st1.nextToken());
//		System.out.println(st1.nextToken());
//		System.out.println(st1.nextToken());

		//반복문으로 차례대로 가져오기 hasMoreTokens
		while(st1.hasMoreTokens()) {
			System.out.println(st1.nextToken());
		}
        
		System.out.println(st1.countTokens()); --> 다 뽑았기 때문에 0 출력



hasMoreElements() / hasMoreTokens()

다음의 토큰이 있는지를 반환 반환값은 모두 boolean
StringTokenizer는 내부적으로 어떤 위치의 토큰을 사용하였는지 기억하고 있고 그 위치를 다음으로 옮긴다.

위의 코드에서 while문을 통하여 false가 반환될 때 까지 nextToken을 사용하여 꺼내는 것



StringTokenizer와 split 차이

StringTokenizer = 같은 구분자는 제거키시고 자른다.
split = 상관없이 다 자른다.

import java.util.StringTokenizer;

public class StringTokenizer2 {

	public static void main(String[] args) {
		String strData = "사과&자몽&&수박&&딸기";
		StringTokenizer st = new StringTokenizer(strData, "&");
		
		while(st.hasMoreTokens()) {
			System.out.println(st.nextElement());  --> 중복 구분자 제거하고 자름
		}
		
		String[] arrData = strData.split("&");
		for(String data : arrData) {   --> 중복 구분자 상관없이 다 자름
			System.out.println(data);
		}
	}
}



문자열 연결 : StringJoiner

각 문자열 연결 종류 ( 원하는 거 쓰기 )

import java.util.StringJoiner;

public class StringJoiner1 {

	public static void main(String[] args) {
		//문자열 연결 : +
		String str1 = "사과" + ",수박" + ",딸기" + ",자몽";
		System.out.println(str1);
		
		//문자열 연결 : concat()
		String str2 = "사과".concat(",수박").concat(",딸기").concat(",자몽");
		System.out.println(str2);
		
		//문자열 연결 : format()
		String str3 = String.format("%s,%s,%s,%s", "사과", "수박", "딸기", "자몽");
		System.out.println(str3);
		
		//문자열 연결 : 배열화
		String[] arrStr = { "사과", "수박", "딸기", "자몽" };
		String str4 = String.join(",", arrStr);
		System.out.println(str4);
		
		//문자열 연결 : StringJoiner
		StringJoiner sj = new StringJoiner(",");
		sj.add("사과");
		sj.add("수박");
		sj.add("딸기");
		sj.add("자몽");
		System.out.println(sj.toString());
	}
}



Random

선언

import java.util.Random;

public class Random1 {

	public static void main(String[] args) {
		//Random r1 = new Random();       
		
        //seeding 값 집어넣기 (실행할때마다 초기화시키기)
		Random r1 = new Random(System.currentTimeMillis());
	}

}



랜덤 뽑기 : nextInt()

import java.util.Random;

public class Random1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//Random r1 = new Random();
		//seeding 값 집어넣기 (실행할때마다 초기화시키기)
		Random r1 = new Random(System.currentTimeMillis());
		
		//일반 랜덤: 범위가 엄청남
//		System.out.println(r1.nextInt());
//		System.out.println(r1.nextInt());
		
		//랜덤의 범위 정하기
		System.out.println(r1.nextInt(10));
		
		//로또
		System.out.println(r1.nextInt(45) + 1);
	}
}




Scanner : 입력

선언

import java.util.Scanner;

public class Scanner2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
        }
  }



next() / nextLine()

next() - 공백까지 입력을 받아들임
nextLine() - 엔터키까지 입력을 받아들임

import java.util.Scanner;

public class Scanner1 {

	public static void main(String[] args) {
		//생성할 때 System.in 써줘야 함
		Scanner sc = new Scanner(System.in);
		
		System.out.print("입력 : " );
		//공백까지 입력을 받아들임
		//String msg = sc.next();
		//엔터키까지 입력을 받아들임
		String msg = sc.nextLine();
		
		
		System.out.println("msg : " + msg);
		
		sc.close();  --> 마지막에 꼭 써줘야 함
	}
}



ex > 아이디 비밀번호 입력받기

import java.util.Scanner;

public class Scanner2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		System.out.print("아이디 : " );
		String msg1 = sc.nextLine();
		System.out.print("비밀번호 : " );
		String msg2 = sc.nextLine();
		
		System.out.println("msg1 : " + msg1);
		System.out.println("msg2 : " + msg2);
		
		sc.close();
	}
}



무한입력 / exit 누르면 빠져나가게 하기

명령프롬포트에서의 입력 : nslookup / exit - nslookup으로 무한입력을 받고 exit로 빠져나온다

eclipse에서 만들어보기

import java.util.Scanner;

public class Scanner3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		String msg = "";
		
		while(true) {
			System.out.print("입력 : ");
			msg = sc.nextLine();
			
			if(!msg.equals("exit")) {
				System.out.println("msg : " + msg);
			}
			else {
				System.out.println("종료");
				break;
			}
		}
		
		sc.close();
	}
    }



구구단 단 입력받아서 출력하기

import java.util.Scanner;

public class Scanner4 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String cols = "";
		
		while(true) {
			System.out.print("단 입력 : ");
			cols = sc.nextLine();
			if(!cols.equals("exit")) {
				int colsP = Integer.parseInt(cols);
				for(int i = colsP; i == colsP; i++) {
					for(int j = 1; j<10; j++) {
					System.out.printf("%d X %d = %d \n", i, j, i*j);
					}
				}
			}
			else {
				System.out.println("종료");
				break;
			}
		}
		sc.close();
	}
}




컬렉션 프레임 워크

사용 방법을 정의한 인터페이스와 실제 객체를 저장하는 다양한 컬렉션 클래스를 제공
주요 인터페이스로는 List, Set, Map이 있다.


List 컬렉션

배열과 비슷하게 객체를 인덱스로 관리
저장 용량이 자동으로 증가하고 객체를 저장할 때 자동 인덱스가 부여된다는 점이 배열과 차이점

ArrayList

List 인터페이스의 대표적인 구현 클래스

크기(길이)를 size로 구하고 값을 가져올 때 get()을 사용한다는 점이 배열과 다르다.


선언과 추가, 값 출력

object 형으로 형변환이 되어 값을 대입하거나 할 경우 String으로 다시 강제 형변환을 시켜줘야 한다.

import java.util.ArrayList;

public class ArrayList1 {

	public static void main(String[] args) {
		// 선언
		ArrayList al1 = new ArrayList();
		ArrayList al2 = new ArrayList(100);
		
		// String -> Object 형변환 돼서 들어감
		al1.add("홍길동");
		al1.add("박문수");
		al1.add("이몽룡");
		
		//배열과 유사한 형식으로 저장되어 있음
		System.out.println(al1);
		//데이터의 개수 출력
		System.out.println(al1.size());
		
		// al1이 object라 형이 안맞음 , 강제형변환 필요
		//String data1 = al1.get(0);
		String data1 = (String)al1.get(0); // al1[0] 출력
		
		System.out.println(data1);

		
		//전체 데이터 출력
		for(int i = 0; i<al1.size(); i++) {
			System.out.println((String)al1.get(i));
		}
	}
}



다양한 메서드( 크기, 추가, 변경, 삭제, 전부삭제)

크기 : size()
추가 : add() , add(n, "~~");
변경 : set(n, "~~");
삭제 : remove(n)
전부 삭제 : clear();
import java.util.ArrayList;

public class ArrayList2 {

	public static void main(String[] args) {
		ArrayList a1 = new ArrayList();
		a1.add("홍길동");
		a1.add("박문수");
		a1.add("이몽룡");
		
		System.out.println(a1.toString());
		
		//추가 삭제가 자유로움
		//추가
		a1.add(2, "장길산");
		System.out.println(a1);
		
		//변경
		a1.set(0, "이몽룡");
		System.out.println(a1);
		
		//삭제
		a1.remove(3);
		System.out.println(a1);
		
		//전부 지우기
		a1.clear();
		System.out.println(a1);
		System.out.println(a1.size());
		
	}
}



클래스를 ArrayList에 집어넣어 출력해보기

Person 클래스

import java.util.ArrayList;

public class ArrayList3 {

	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		
		Person p1 = new Person("1001", "홍길동");
		Person p2 = new Person("1002", "박문수");
		
		// Person이 Object로 형변환
		al.add(p1);   --> al에 추가
		al.add(p2);
		
		//toString 재정의 한 값 나온다.
		System.out.println(al);
		
		//전체 데이터 값 뽑기
		for(int i =0; i<al.size(); i++) {
			Person p = (Person)al.get(i);  --> al 전체값 뽑기 위함
			System.out.println(p.getHakbun());
			System.out.println(p.getName());
		}
	}
}



Generic

ArrayList로 객체 생성을 하고 add로 추가를 해주면 Object로 형변환이 돼어, 무엇이든 넣을 수 있으나, 그럴 경우 데이터를 출력, 가공할 때 문제가 생긴다.

이 경우를 보완하기 위하여 ArrayList 생성 시<E>라는 파라미터에 자료형 형태를 집어넣게 되면 추가하는 과정에서 E에 집어넣은 자료형 형태로 추가된다.

import java.util.ArrayList;

public class ArrayList4 {

	public static void main(String[] args) {
		ArrayList al1 = new ArrayList();
		
		al1.add("홍길동");
		al1.add(new Person("1001", "이몽룡")); --> 추가는 가능하나 문제가 생김
		
		// 데이터 출력 / 가공할 때 문제가 생김
//		for(int i = 0; i < al1.size(); i++) {
//			String s = (String) al1.get(i);
//			System.out.println(s);
//		}

		//<E>에다가 자료형 형태를 집어넣어주기 = Generic
		//Generic = 컬렉션( or 클래스, 메서드) 내부의 자료형 선언
		ArrayList<String> al2 = new ArrayList<>();
		
		//Object 형태가 String으로 바뀜
		al2.add("홍길동");
		al2.add("박문수");
		//형태가 맞지 않아 에러 발생
		//al2.add(new Person("1001", "이몽룡"));
		
		for(int i = 0; i<al2.size(); i++) {
			String s =al2.get(i);  //String형이기 때문에 형변환 필요없다.
			System.out.println(s);
		}
	}
}



remove()

import java.util.ArrayList;

public class ArrayList6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> al = new ArrayList<>();
		al.add(1);
		al.add(2);
		al.add(3);
		al.add(4);
		al.add(5);
		
		for(int i = 0; i<al.size(); i++) {
			if(al.get(i) instanceof Integer) {
				//System.out.println(al.get(i));
				//remove의 특이성 때문에 배열이 줄어든 상태에서 
				//i는 증가하기 때문에 출력 결과가 이상하게 나옴
				al.remove(i);
			}
		}
		System.out.println(al);
	}

}

여기서 remove가 작동하는 원리는
1. 0번째 숫자 1이 삭제됨, 2,3,4,5로 배열이 정렬됨
2. i++로 i = 1인 상태에서 1번째 숫자 3이 삭제됨, 2,4,5로 배열 정렬
3. i = 2 인 상태에서 2번째 숫자 5가 삭제됨, 2,4 로 배열 정렬
4. 배열 길이가 2이므로 i = 3 은 실행되지 않고 종료.

따라서 [2,4] 가 출력된다

profile
끄적끄적

0개의 댓글