라이브러리(API) -> 패키지 단위로 제공한다.
내장(부) API
모듈(지금은 신경x)
-> 패키지 :
java.lang 패키지(너무 많이 쓰여 import 생략, 문법, Object 중요하다.)
toString(), equals(), String(불변성) / Stringbuffer / StringBuilder ,
Math , Wrapper 클래스(최대, 최소값 / 형변환) ,
-> 클래스 (책 408 자바 랭 패키지)
외부 API
둘 다 차이는 없어보이나 replaceAll은 정규식을 처리할 수 있어 replace에서 처리하지 못한 값들도 처리가 가능하다. (범위가 더 넓다)
--> replaceAll은 []안의 문자들을 모두 1로 변환, replace는 abc라는 값만 1로 치환한다.
replace를 replaceAll처럼 사용하려면 밑의 식과 같다.
= String result1 = str.replace("a", "1").replace("b", "1").replace("c", "1"); --> 이와같이 훨씬 불편하다.
자바 프로그램은 운영체제에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다.
java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제 일부 기능 이용할 수 있다. ( 프로그램 종료, 키보드로부터 입력, 출력, 현재 시간 읽기 등 가능)
System 클래스의 모든 필드와 메소드는 정적(static)으로 구성되어 있다.
시스템 클래스 (420쪽 확인)
현재 실행하고 있는 프로세스 강제 종료
() int 매개값 지정하도록 되어있는데(종료 상태값) 일반적으로 정상 종료일 경우 0을 준다.
인자가 없을 경우 if문의 비정상 출력하고 exit로 강제종료
밀리세컨드(1/1000초) / 나노세컨드(1/10의9승 초)
프로그램 시작시 시각읽고 끝날 시 시각 읽어서 차이를 구하면 프로그램 실행 소요 시간이 나온다
운영체제 정보 / 실행되는 곳 정보 등 얻을 때 사용 가능
\n 역할과 동일한 기능 수행
shadow copy : 어떤 변수 배열의 참조값을 참조한 것 (둘의 참조값이 같음)
deep copy : 참조값 그 자체를 하나 더 복사하는 것 (arraycopy) (둘의 참조값이 다름)
arraycopy 형식 : arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src : 전송할 배열
srcPos : 시작 위치
dest : 전송받을 배열
destPos : 받을 데이터 시작 위치
length : 카피되는 배열 요소 길이
edge 위치 -> C:\Program Files (x86)\Microsoft\Edge\Application 의 msedge.exe
"" 쓰는 이유 - 공백이 있으면 안되는데 ""를 통해 하나의 문자열로 만들어 주기 위해서이다.
뒤에 daum사이트 인자를 추가하면 다음으로 가진다.
이클립스나 다른 곳에서도 브라우저를 실행할 수 있다.
메모장을 실행하기
toString 오버라이딩 되어있는 모습 확인
1900 기본값이고 그냥 숫자를 넣으면 +되는 구조라 -1900을 해줘야 한다.
달력을 표현한 클래스
추상 클래스이다.
출력하면 엄청 긴 여러가지 내용들이 함축되어 나온다.
뒤에 더 있다.
calender.get(Calendar.내용(상수형식)) 형식으로 가져온다.
요일은 특이하게 일요일이 1 기준이다 (토요일 7)
이 코드는 현재 일 중의 마지막 일( 31 )
마찬가지로 직접 넣어서 현재 시간을 확인 가능하다.
getTime().toLocaleString() 써서 현재시간 한글로 확인
특정 시간의 과거 , 미래를 설정할 수 있다.
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();
}
}
}
}
(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, "+-*/=()");
현재 남아있는 토큰의 개수를 출력한다.
토큰이 몇 개 빠진 상태면 빠지고 난 후의 개수를 출력함.
public static void main(String[] args) {
String strData1 = "사과 자몽 수박 딸기";
StringTokenizer st1 = new StringTokenizer(strData1);
//안에 있는 것이 몇 개로 잘렸는지 알 수 있다.
System.out.println(st1.countTokens());
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 출력
다음의 토큰이 있는지를 반환 반환값은 모두 boolean
StringTokenizer는 내부적으로 어떤 위치의 토큰을 사용하였는지 기억하고 있고 그 위치를 다음으로 옮긴다.
위의 코드에서 while문을 통하여 false가 반환될 때 까지 nextToken을 사용하여 꺼내는 것
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);
}
}
}
각 문자열 연결 종류 ( 원하는 거 쓰기 )
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());
}
}
import java.util.Random;
public class Random1 {
public static void main(String[] args) {
//Random r1 = new Random();
//seeding 값 집어넣기 (실행할때마다 초기화시키기)
Random r1 = new Random(System.currentTimeMillis());
}
}
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);
}
}
선언
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() - 엔터키까지 입력을 받아들임
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(); --> 마지막에 꼭 써줘야 함
}
}
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();
}
}
명령프롬포트에서의 입력 : 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 인터페이스의 대표적인 구현 클래스
크기(길이)를 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());
}
}
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());
}
}
}
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);
}
}
}
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] 가 출력된다