contents
chapter09
7.사용자 정의 예외
chapter10
1.API란?
2.문자열 클래스
3.시간 처리 Date, Calender
1)System.currentTimeMils( )
2)java.util.Calendar
3)java.util.Date
4.java.util.Random
싱글톤(singleton)
주사위 만들기
로또번호 만들기
------------------------------------------------------------------
chapter09
7.사용자 정의 예외
-자바에서는 예외 클래스를 사용자가 직접 정의할 수도 있음
-기존의 API에서 제공하는 예외 클래스만으로 예외의 경우를 표현할 수 없는 경우 예외인 경우를 직접 만들어서 사용하기도 함
chapter10
1.API란?
-자바 API(Application Programming Interface)는 자바에서 개발자들을 위해 기본적으로 제공하는 클래스들임
-예를 들어 출력을 위해 사용했던 System.out.println( ) 메서드도 java.lang 패키지가 기본적으로 제공되기 때문에 사용할 수 있었던 일종의 API임. 자바에서 제공하는 API를 확인하고 싶다면 http://docs.oracle.com/javase/8/docs/api/index.html 사이트에 접속해서 API 문서를 확인함
1)마우스를 hover 시킨 후 하단의 이미지를 클릭
2)ctrl을 누른 상태에서 마우스 오른쪽 단추를 클릭
2.문자열 클래스
-문자열 클래스는 문자열에 대한 처리를 위한 다양한 메서드가 정의되어 있는 클래스임
-Java에서는 String 클래스를 통해 문자열에 대한 처리를 제공함. 다양한 메서드들이 제공되기 때문에 Java는 문자열을 다루기에 상당히 편리한 언어임
String a = new String("Java"); |
String 인스터스를 생성할 때는 다른 객체의 생성과 마찬가지로 new 키워드로 메모리의 빈 공간을 확보하고 인스턴스를 생성해야함. 하지만 보통의 클래스와는 다르게 문자열은 프로그래밍을 할 때 자주 사용되므로 작업을 더 쉽게 하기 위해 기본 자료형을 선언하는 것처럼 사용하는 것도 허용함
String a = "Java"; //마치 기본 자료형처럼 사용 |
메서드 | 의미 |
concat(문자열) | 문자를 연결함 |
substring(인덱스, 잘라낼 길이) | 문자열을 잘라냄 |
length() | 문자열의 길이를 반환함 |
toUpperCase() | 문자열을 대문자로 변경함 |
toLowerCase() | 문자열을 소문자로 변경함 |
charAt(인덱스) | 인덱스에 해당하는 글자를 반환함 |
indexOf(문자열) | 문자열의 위치를 반환함 |
equals(문자열) | 문자열이 같은지 boolean값으로 반환함 |
trim() | 문자 앞, 뒤의 공백을 제거함 |
replace(바꾸고 싶은 문자열, 바꿀 문자열) | 문자열 내의 특정 부분을 다른 문자열로 변경함 |
replaceAll(변환할 문자열, 변환될 문자열) | 문자열 내의 특정 부분을 다른 문자열로 변경함 |
1)concat
-conat() 메서드를 이용하면 원하는 문자열을 결합함. 하지만 실제로는 문자열 외에 다른 자료형도 결합할 수 있는 +연산자를 더 많이 이용함
package ch10;
public class Exam_10_1 { public static void main(String[] args) { String a = "Hi"; String b = " Java"; System.out.println(a+b); String c = "Hello"; String d = " Java Program"; System.out.println(c.concat(d)); //문자열 연결 } } |
실행 결과
Hi Java
Hello Java Program |
2)charAt
-charAt(index) 메서드는 지정한 인덱스의 위치에 있는 문자를 반환해주는 메서드임
package ch10;
public class Exam_10_2 { public static void main(String[] args) { String a = "hello Java!"; char b = a.charAt(0); //지정된 인덱스 위치 문자 반환 for(int i = 0; i< a.length(); i++) { //11 함수 cf)a.length 변수 System.out.println(a.charAt(i)); } } } |
실행 결과
h
e l l o J a v a ! |
3)length()
-length() 메서드는 해당 문자열의 길이를 반환하는 메서드임. 문자열의 길이를 쉽게 알 수 있기 때문에 문자열 전체에 대해 작업하는 반복문에 사용함
4)indexOf()
-indexOf().메서드는 문자나 문자열이 어디에 위치하는지 알려주는 메서드임. 만약 문자열 내에 없다면 -1을 반환함
package ch10;
public class exam_10_3 { public static void main(String[] args) { String a = "abcdefghijk"; int b = a.indexOf("c"); //문자, 문자열 위치 System.out.println("문자 c는 " + b + "번째 입니다"); } } |
실행 결과
문자 c는 2번째 입니다
|
5)substring()
-substring() 메서드는 문자열을 잘라낼 때 사용함. substring의 파라미터로 인덱스 2개를 사용할 경우에는 첫번째 인덱스부
터 두 번째 인덱스의 전까지 잘라냄
package ch10;
public class Exam_10_4 { public static void main(String[] args) { String a = "012345678"; //인덱스는 0부터 시작입니다. String b = a.substring(4, 8); //4번째 부터 8번째 전까지 짤라준다. System.out.println(b); } } |
실행 결과
4567
|
6)equals()
-equals() 메서드는 문자열의 내용을 비교하는 메서드임. 문자열의 내용이 일치하면 true, 일치하지 않으면 false를 반환함
package ch10;
public class Exam_10_5 { public static void main(String[] args) { String a = "Java"; String b = "Java?"; //주소 == call by reference 객체비교 System.out.println(a.contentEquals(b)); //문자열 내용비교 true, false } } |
실행 결과
false
|
7)split()
-split() 메서드는 문자열의 내용을 비교하는 메서드임. 문자열의 내용이 일치하면 true, 일치하지 않으면 false를 반환함
package ch10;
public class Exam_10_6 { public static void main(String[] args) { String a = "kor,eng,math"; String div[] = a.split(","); for(int i = 0; i < div.length; i++) { System.out.println(div[i]); } } } |
실행 결과
kor
eng math |
8)equalsIgnorcase()
- equalsIgnorcase() 메서드는 영문으로 된 문자열을 대소문자 구분없이 비교하는 메서드임. 대소문자를 구분하지 않고 문자열이 일치하면 true, 일치하지 않으면 false를 반환함
package ch10;
public class Exam_10_7 { public static void main(String[] args) { String a = "Java"; String b = "JAVA"; System.out.println(a.equalsIgnoreCase(b)); //대소문자 구별없이 문자열 일치 true, 불일치 false } } |
실행 결과
true
|
9)join()
-join() 메서드는 배열을 특정한 문자들 사이사이에 넣어서 문자열로 결합하는 메서드임
package ch10;
public class Exam_10_8 { public static void main(String[] args) { String a[] = {"kor","eng","math"}; System.out.println(String.join("-", a)); //배열을 특정 문자들사이에 넣어 문자열 결합 } } |
실행 결과
kor-eng-math
|
10)trim()
-trim() 메서드는 문자열의 앞, 뒤 공백을 제거하는 메서드임
package ch10;
public class Exam_10_9 { public static void main(String[] args) { String a = (" Hello Java "); //앞뒤 공백제거 System.out.println(a); String b = a.trim(); System.out.println(b); } } |
실행 결과
kor-eng-math
|
11)valueOf()
-valueOf() 메서드는 기본형을 String으로 변환시키는 메서드임
package ch10;
public class Exam_10_10 { public static void main(String[] args) { int a = 1; int b = 2; System.out.println(a+b); String c = String.valueOf(a); String d = String.valueOf(b); // 기본형 String으로 변환 System.out.println(c+d); } } |
실행 결과
3
12 |
12)format()
-String은 문자열에 적절한 포맷을 줄 수 있음. 활용방법은 printf() 메서드와 같음. 문자열 내에 정수가 들어갈 자리에는 %d, 실수의 자리에는 %f, 다른 문자열의 자리에는 %s를 작성해놓고 순서대로 파라미터를 추가함
package ch10;
public class Exam_10_11 { public static void main(String[] args) { System.out.println(String.format("%d", 1234+5678)); //정수형 System.out.println(String.format("%s", "1234" + "5678")); //문자열 } } |
실행 결과
6912
12345678 |
13)StringBuilder/StringBuffer/String
-String은 immutable(변하지 않는)한 객체이기 때문에 자주 사용할수록 속도가 느려짐. 왜냐하면 문자열을 작업할 때마다 인스턴스를 만들기 때문임. 이러한 단점을 보완하는 클래스가 StringBuilder/StringBuffer 클래스임/ 이 클래스들은 객체 안의 데이터를 내부적으로 변경할 수 있으므로 새로운 객체를 만들지 않음. 즉 mutable(변할 수 있는)한 객체임
package ch10;
public class Exam_10_12 { public static void main(String[] args) { String a = "java"; String b = "Hello"; System.out.println("a: " + a.hashCode()); System.out.println("b: " + b.hashCode()); a = a + b; System.out.println("a: " + a.hashCode()); StringBuffer c = new StringBuffer(); System.out.println("c: " + c.hashCode()); c.append(2); c.append("+"); c.append(3); c.append("="); c.append(5); System.out.println(c); c.append("TEST StringBuffer"); System.out.println("c: " + c.hashCode()); } } |
실행 결과
a: 3254818
b: 69609650 a: -864844848 c: 1927950199 2+3=5 c: 1927950199 |
◎StringBuffer 클래스의 메서드
메서드 | 의미 |
append() | 매개변수로 입력된 값을 문자열로 바꾸어 더해주는 메서드 |
reverse() | 문자열의 순서를 반대로 나열하는 메서드 |
insert(in pos, Object obj) | 두 번째 매개변수의 값을 문자열로 바꾸어서 pos인 위치에 추가하는 메서드 |
delete(int start, int end) | start의 위치부터 end 직전의 위치의 문자열을 제거하는 메서드 |
deleteCharAt(int index) | index위치에 있는 문자를 제거하는 메서드 |
-StringBuffer는 StringBuilder와 사용하는 방법과 메서드가 똑같음. 두 클래스의 차이는 StringBuffer가 멀티 스레드에서 동기화 처리를 지원함. 다만 이 동기화 처리가 StringBuffer의 성능을 저하하므로 지금과 같이 단일 스레드로 작성할 경우에는 StringBuilder를 사용하는 것이 유리하고 멀티스레드의 경우에는 동기화 처리를 지원하는 StringBuffer를 사용하는 것이 좋음
3.시간 처리 Date, Calender
-JAVA에서는 시간에 대해 처리를 할 수 있도록 몇 가지 클래스를 제공함. JAVA에서 시간을 다루는 자료형의 값은 long이며 java.util.Calender 클래스와 java.util.Date 클래스가 있음
1)System.currentTimeMils( )
-system 클래스의 currentTimeMils( ) 메서드는 현재 운영체제의 시간을 long 타입으로 반환함. 반환하는 시각은 1970년 1월 1일을 기준으로 했을 때 현재까지의 시간이며 1/1000초 단위까지 확산해서 보여줌
package ch10;
public class exam68 { public static void main(String[] args) { long start = System.currentTimeMillis(); System.out.println("시작시간:" + start); int a = 0; for(int i = 1; i < 10000000; i++) { a++; } long end = System.currentTimeMillis(); System.out.println("종료시간:" + end); System.out.println("걸린 작업 시간:" + (end - start)); } } |
실행 결과
시작시간:1737620757657
종료시간:1737620757670 걸린 작업 시간:13 |
2)java.util.Calendar
-JAVA에서는 날짜를 다루기 위한 Calendar 클래스를 제공함. 다만 Calendar는 추상 클래스이기 때문에 직접 인스턴스를 생성하지는 못하고 getInstance( ) 메서드를 통해서 GregorianCalendar 인스턴스를 생성해야 함. 이 방법을 싱글턴 패턴(Singleton Pattern)이라고 함. 싱글턴 패턴은 객체를 사용할 때 각각 인스턴스를 생성해서 사용하는 것이 아니라 하나의 인스턴스만을 가지고 사용하는 방법임. Calendar 클래스는 싱글턴으로 만들어진 대표적인 클래스임. 싱글턴 패턴을 사용하지 않는 방법으로는 직접 GregorianCalendar 인스턴스를 생성하는 방법이 있음. 두 방법 모두 생성되는 인스턴스의 종류는 같음
package ch10; import java.util.Calendar; import java.util.GregorianCalendar; public class exam69 { public static void main(String[] args) { Calendar a = Calendar.getInstance(); //싱글턴 패턴 Calendar b = new GregorianCalendar(); System.out.println(a.toString()); System.out.println(b.toString()); } } |
실행 결과
java.util.GregorianCalendar[time=1737621230036,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2025,MONTH=0,WEEK_OF_YEAR=4,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=23,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=33,SECOND=50,MILLISECOND=36,ZONE_OFFSET=32400000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1737621230051,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2025,MONTH=0,WEEK_OF_YEAR=4,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=23,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=33,SECOND=50,MILLISECOND=51,ZONE_OFFSET=32400000,DST_OFFSET=0] |
◎get() 메서드로 정보 가져오기
-Calendar 클래스에서 데이터를 얻어오려면 get( ) 메서드를 사용함. get( ) 메서드의 반환타입은 int 이며 한 가지 주의할 점은 월(MONTH) 반환 시 실제 월보다 1 작은 값이 반환 됨. (1월 => 0월, 12월 => 11월) 또한 반환타입이 int이므로 요일을 반환할 때도 정수의 형태로 반환하는데 일요일이 시작인 1이고 월요일이 2, 그리고 토요일이 7임
package ch10;
import java.util.Calendar; public class exam70 { public static void main(String[] args) { Calendar a = Calendar.getInstance(); int year = a.get(Calendar.YEAR); int month = a.get(Calendar.MONTH); int date = a.get(Calendar.DATE); System.out.println(year + "년" + month + "월" + date + "일"); System.out.println(a.get(Calendar.DAY_OF_WEEK)); //1=일요일 2=월요일.. 7=토요일 System.out.println("이번 년도에서 오늘이 몇 일째인가?"); System.out.println(a.get(Calendar.DAY_OF_YEAR)); //이번 년도의 며칠인지 System.out.println("이번 달은 며칠까지 있는가?"); System.out.println(a.getActualMaximum(Calendar.DATE)); } } |
실행 결과
2025년0월23일
5 이번 년도에서 오늘이 몇 일째인가? 23 이번 달은 며칠까지 있는가? 31 |
◎set( )으로 날짜 지정하기
-set( ) 메서드는 Calendar 인스턴스의 값을 변경할 때 사용함. 두 개의 파라미터를 필요로 하며 첫 번째 파라미터는 바꿔야 할 항목, 두 번째 파라미터는 바꿀 값을 대입함
set(바꿔야할 항목, 바꿀 값); set(년, 월, 일); |
package ch10;
import java.util.Calendar; public class exam71 { public static void main(String[] args) { Calendar today = Calendar.getInstance(); Calendar endOfYear = Calendar.getInstance(); Calendar Christmas = Calendar.getInstance(); endOfYear.set(Calendar.MONTH, 11); //12월 endOfYear.set(Calendar.DATE, 31); long diff = endOfYear.getTimeInMillis() - today.getTimeInMillis(); System.out.println("연말까지 남은 날:" + diff/(24*60*60*1000)+ "일"); Christmas.set(2025, 11, 25); //2025년 12월 25일 diff = Christmas.getTimeInMillis() - today.getTimeInMillis(); System.out.println("크리스마스까지 남은 날:" + diff/(24*60*60*1000) + "일"); } } |
실행 결과
연말까지 남은 날:342일
크리스마스까지 남은 날:336일 |
-set 메서드를 통해 endOfYear 참조변수의 인스턴스의 값을 변경함. getTimeInMils( ) 메서드를 통해 long 타입의 값을 받아오고 두 시간의 차이를 diff 변수에 저장함. 그 차이를 다시 날짜로 환산하여 출력함. set의 값을 한 번에 설정할 수도 있음. 다만 12월로 지정하기 위해서는 11을 대입해야 하는 것을 주의해야 함
◎long 타입을 일(日)로 변경하는 방법
1)1000으로 나누어서 '초'단위로 만듬. (long 타입은 1/1000까지 보여줌)
26179200039/1000 = 26179200초
2)초를 분으로 바꾸기 위해 60으로 나누어줌(60초 = 1분)
26179200/60 = 436320분
3)분을 시간으로 바꾸어줌(60분 = 1시간)
436320/60 = 7272시간
4)시간을 다시 일로 바꾸어줌(24시간 = 1일)
7272/24 = 303일
3)java.util.Date
-Date 클래스는 JDK 1.0부터 제공되어온 클래스이지만 JDK1.1버전부터 여러 가지 문제가 생겨 대부분의 메서드와 생성자가 사용되지 않게 됨
◎long, Calendar, Date 간의 변환
-시간을 나타내는데 사용했던 long 타입, Calendar 타입, Date 타입은 서로 변환함
4.java.util.Random
-Random 클래스는 무작위의 값을 얻고 싶을 때 사용함
-Random 클래스는 무작위의 값을 추출하기 위한 내부의 알고리즘을 가지고 있음. 이 알고리즘에는 종자 값이라는 수가 이용되는데 이 종자 값에 따라 값을 반환하게 됨. 만약 기본 생성자로 Random 인스천스를 생성하면 현재의 시간 currentTimeMillis( )를 종자 값으로 하여 무작위의 값을 추출함
Random() | 현재 시간을 종자 값으로 인스턴스 생성 |
Random(long seed) | seed를 종자 값으로 하는 인스턴스 생성 |
*seed 값을 넣으면 랜덤이 아니게 됨
-Random 인스턴스의 값을 받아오는 메서드는 다음과 같음
int nextInt() | 무작위의 int 값 반환 |
int nextInt(int n) | 0보다 크고 n보다 작은 int 값을 반환 |
boolean nextBlooean() | 무작위의 boolean 값 반환 |
long nextLong() | 무작위의 long 값 반환 |
double nextDouble() | 무작위의 double 값 반환 |
float nextFloat() | 무작위의 float 값 반환 |
싱글톤(singleton)
package ch10;
public class single { //싱글톤: 클래스의 인스턴스가 오직 하나만 생성되도록 보장 public static void main(String[] args) { time a = new time(); time b = new time(); time x = time.getT(); } } |
package ch10;
public class time { private time() {} //1.생성자 private 전환 //생성자를 private으로 선언하여 외부에서 인스턴스를 생성하지 못하도록 함 private static time t = new time(); //2.객체 생성 및 private/ static 스스로 만듬 public static time getT() { //3. getter 생성 // 인스턴스를 반환하는 정적 메서드 return t; } int a = 10; int b = 20; } |
주사위 만들기
package ch10; import java.util.Random; import java.util.Scanner; public class random { public static void main(String[] args) { // 재료 확보 Scanner sc = new Scanner(System.in); String choice = "Y"; Random rd = new Random(); int count = 0; int point = 5; int a; int b; // 재료 가공 do { count++; System.out.println("주사위 프로그램입니다."); a = rd.nextInt(6) + 1;// (0~5)+1 = 1~6 b = rd.nextInt(6) + 1;// (0~5)+1 = 1~6 System.out.println("첫번째 주사위의 값은:" + a); System.out.println("첫번째 주사위의 값은:" + b); // 제어문 :변수 근거(조건문/반복문) -> 산술, 비교 if (a == b) { point = point+2; System.out.println("떠블입니다."); } else { point--; } System.out.println("현재 포인트는:" + point + "점 입니다."); System.out.println("겜블을 다시 시작하시겠습니까?"); choice = sc.nextLine(); }while(choice.equals("Y")); System.out.println("총 시도횟수는" + count + "번입니다."); // for(int i = 0; i<100; i++) { // System.out.println(rd.nextInt(6)+1); //(0~5)+1 // // } } } |
실행 결과
주사위 프로그램입니다.
첫번째 주사위의 값은:3 첫번째 주사위의 값은:1 현재 포인트는:4점 입니다. 겜블을 다시 시작하시겠습니까? Y 주사위 프로그램입니다. 첫번째 주사위의 값은:6 첫번째 주사위의 값은:6 떠블입니다. 현재 포인트는:6점 입니다. 겜블을 다시 시작하시겠습니까? |
로또번호 만들기
package ch10; import java.util.Arrays; import java.util.Random; public class NumberRandom { public static void main(String[] args) { Random rd = new Random(); int[] lotto = new int[6]; // 로또 번호를 담을 변수 int index = 0; while (index < 6) { Systehttp://m.out.printf("%d번째 로또 추첨을 시작합니다.", index + 1); // for (int i = 0; i < 6; i++) continue 못씀 lotto[index] = rd.nextInt(45) + 1; System.out.println("추첨된 번호는:" + lotto[index]); for (int i = 0; i < index; i++) { // System.out.println("인덱스:" + index + "로또인덱스:" + i); if (lotto[i] == lotto[index]) { System.out.println("다시 시작합니다"); index--;// 4 } } index++;// 5 } System.out.println(Arrays.toString(lotto)); // 정렬 for (int i = 0; i < lotto.length - 1; i++) { for (int j = i + 1; j < lotto.length; j++) { // System.out.println("i값:" + i + "j값:" + j); if (lotto[i] > lotto[j]) { int tmp = lotto[i]; // 더블 정렬 lotto[i] = lotto[j]; lotto[j] = tmp; } } } System.out.println(Arrays.toString(lotto)); } } |
실행 결과
1번째 로또 추첨을 시작합니다.추첨된 번호는:28
2번째 로또 추첨을 시작합니다.추첨된 번호는:42 3번째 로또 추첨을 시작합니다.추첨된 번호는:32 4번째 로또 추첨을 시작합니다.추첨된 번호는:15 5번째 로또 추첨을 시작합니다.추첨된 번호는:34 6번째 로또 추첨을 시작합니다.추첨된 번호는:27 [28, 42, 32, 15, 34, 27] [15, 27, 28, 32, 34, 42] |
'프로그래밍 > java' 카테고리의 다른 글
JAVA 프로그래밍 52일차 (25/1/24) (1) | 2025.01.24 |
---|---|
JAVA 프로그래밍 51일차 (25/1/22) (2) | 2025.01.22 |
JAVA 프로그래밍 50일차 (25/1/21) (0) | 2025.01.21 |
JAVA 프로그래밍 49일차 (25/1/20) (2) | 2025.01.20 |
JAVA 프로그래밍 48일차 (25/1/17) (0) | 2025.01.17 |