프로그래밍/java

JAVA 프로그래밍 52일차 (25/1/23)

wkun 2025. 1. 23. 17:58

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]