본문 바로가기

Programming/국비학원

220513 - API - Arrays, Wrapper, Math, Random, Date, Calendar, Format 클래스, Java.time 패키지, 확인문제 + Class 클래스

Arrays 클래스
  • binarySearch() : 배열 내 입력문자 위치 찾아줌
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
 
public class ArraysEx2 {
 
    public static void main(String[] args) {
        
        int[] scores = {96,80,90,60,70};
        int index=Arrays.binarySearch(scores, 60);
        System.out.println(index);
            
    }
 
}
cs

//

-1 => sort 메소드 실행 안 할 때 오류

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Arrays;
 
public class ArraysEx2 {
 
    public static void main(String[] args) {
        
        int[] scores = {96,80,90,60,70};
       Arrays.sort(scores);    
        int index=Arrays.binarySearch(scores, 60);
        System.out.println(index);
            
    }
 
}
cs

//
0

 

 

 

Wrapper 클래스 (포장 클래스)

: 기본 타입 값을 가지는 객체 생성 (참조타입)

ex. Byte, Character, Short, Integer, Long, Float, Double, Boolean 클래스

 

기본타입 값은 외부에서 변경 불가 => 새로운 포장 객체 생성해야

문자열을 기본타입 값으로 변환할 때에도 사용됨

내부 값 비교 => equals() 메소드 사용 (-128~127 int, byte, short => == 연산자로도 비교 가능)

 

※String 등 참조타입 => 크기 없음 (주소만 참조)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class WrapperEx1 {
 
    public static void main(String[] args) {
        
        Integer obj1 = new Integer(10);  //버전 업그레이드되면서 이렇게 쓰이진 않음
        Integer obj2=20;  //자동 Boxing : 기본타입이 객체 안으로 들어감
        System.out.println(obj2.intValue());
        int value = obj1;  //자동 unboxing : 객체가 기본타입으로 재변환
 
        String str1 = "20";
        String str2 = "2.54";
        int value2 = Integer.parseInt(str1); //String -> int
        System.out.println(value2);
        
        double value3 = Double.parseDouble(str2); //String -> double
        System.out.println(value3);
    }
 
}
cs

//
20
20
2.54

 

 

 

Math 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MathEx1 {
 
    public static void main(String[] args) {
 
        int value1=Math.abs(-5);  //절대값
        System.out.println(Math.sqrt(16));  //루트값
 
 
        double dvalue1=Math.round(-5.5);  //반올림값
        System.out.println("반올림 "+dvalue1);
        double dvalue2=Math.ceil(-5.5);  //올림값
        System.out.println("올림 "+dvalue2);
        double dvalue3=Math.floor(-5.5);  //내림값
        System.out.println("내림 "+dvalue3);
        double dvalue4=Math.rint(-5.5);  //가까운 정수의 실수값
        System.out.println("가까운 정수의 실수값 "+dvalue4);
    }
 
}
//
5
4.0
반올림 -5.0 //음수 .5 => 더 큰 값으로 올림
올림 -5.0
내림 -6.0
가까운 정수의 실수값 -6.0 //가까운 값으로
 
 
public class MathEx1 {
 
    public static void main(String[] args) {
 
        int max = Math.max(3015);
        System.out.println(max);
    }
 
}
//
30
cs

 

 

 

Random 클래스

boolean, int, long, float, double 난수 얻을 수 있음

종자값(seed) 설정 가능 => 같은 종자값이면 같은 난수 고정적으로 가짐

 

cf. Math.random() => 0.0~1 사이의 double 난수만 얻기 가능, 종자값 無

 

 

  •  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Random;
 
public class MathEx2 {
 
    public static void main(String[] args) {
 
        Random rand = new Random();
        for (int i=1;i<=6;i++) {
            System.out.println(rand.nextInt(45)+1);  //난수 리턴
        }
        
    }
 
}
//
32
16
31
25
21
26
 
 
import java.util.Random;
 
public class MathEx2 {
 
    public static void main(String[] args) {
 
        Random rand = new Random(8); //괄호 안 숫자=종자값 => 같은 난수 계속 얻음
        for (int i=1;i<=6;i++) {
            System.out.println(rand.nextInt(45)+1); 
        }
        
    }
 
}
//
20
17
11
17
43
24
=> 고정된 난수값
cs

 

 

  • 로또 번호-내 번호 비교 후 결과 리턴 문제 (Random 클래스, 종자값 사용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.Arrays;
import java.util.Random;
 
public class MathEx2 {
 
    public static void main(String[] args) {
 
        int[] lotto=new int[6]; //배열 6슬롯 생성
        int[] myNum=new int[6];
        Random rand;
        
        rand=new Random(10); //종자값
        System.out.print("추첨 번호 : ");
        for (int i=0;i<lotto.length;i++) {
            lotto[i]=rand.nextInt(45)+1//1~45 랜덤 리턴    
            System.out.print(lotto[i]+" ");
        }
        
        rand=new Random(5);  //종자값 일치시키면 동일 난수값 출력됨
        System.out.print("\n내 번호 : ");
        for (int i=0;i<myNum.length;i++) {
            myNum[i]=rand.nextInt(45)+1;
            System.out.print(myNum[i]+" ");
        }
        
        Arrays.sort(lotto);
        Arrays.sort(myNum);
        boolean result = Arrays.equals(lotto, myNum);
        System.out.println("\n\n***추첨 결과***\n");
        if (result) {
            System.out.println("1등에 당첨되셨습니다");
        }else {
            System.out.println("꽝");
        }
        
    }
 
}
cs

 

 

 

Date 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class DateEx1 {
 
    public static void main(String[] args) {
 
        Date now = new Date();  //인스턴스 객체 생성
        System.out.println(now);
       SimpleDateFormat sdf; //Format 클래스
        sdf=new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(now));
        sdf=new SimpleDateFormat("yyyy년 MM월 dd일 (E요일)");
        System.out.println(sdf.format(now));
        sdf=new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초(S)");
        System.out.println(sdf.format(now));
        sdf=new SimpleDateFormat("yyyy년 MM월 dd일 a HH시 mm분 ss초");
        System.out.println(sdf.format(now));
        sdf=new SimpleDateFormat("yyyy년 D일째 W주차");
        System.out.println(sdf.format(now));
        sdf=new SimpleDateFormat("yyyy년 w주차");
        System.out.println(sdf.format(now));
        
    }
 
}
cs

//
Fri May 13 17:38:08 KST 2022
2022-05-13
2022년 05월 13일 (금요일)
2022년 05월 13일 05시 38분 08초(232)    // S : 1/1000초
2022년 05월 13일 오후 17시 38분 08초
2022년 133일째 2주차    //W : 해당 월의 현재 주차 //w : 올해년도 중 현재 주차
2022년 20주차

 

 

 

Calendar 클래스

추상 클래스 => 직접 객체 생성 불가 => getInstance() 메소드 사용 (싱글톤과 유사)

 

 

  •  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.util.Calendar;
 
public class CalendarEx1 {
 
    public static void main(String[] args) {
 
        Calendar now = Calendar.getInstance();  
        //Calendar: 싱글톤& getinstance: static 메소드 (클래스로 바로 접근)
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH)+1;  //월은 0부터 시작
        int day = now.get(Calendar.DAY_OF_MONTH);
        int week=now.get(Calendar.DAY_OF_WEEK);  //일요일: 1
        int hour = now.get(Calendar.HOUR);
        int minute = now.get(Calendar.MINUTE);
        int second= now.get(Calendar.SECOND);
        
        switch(week) {
        case Calendar.SUNDAY:
            System.out.println("오늘은 일요일");
            break;
        case Calendar.MONDAY:
            System.out.println("오늘은 월요일");
            break;
        case Calendar.TUESDAY:
            System.out.println("오늘은 화요일");
            break;
        case Calendar.WEDNESDAY:
            System.out.println("오늘은 수요일");
            break;
        case Calendar.THURSDAY:
            System.out.println("오늘은 목요일");
            break;
        case Calendar.FRIDAY:
            System.out.println("오늘은 금요일");
            break;
        case Calendar.SATURDAY:
            System.out.println("오늘은 토요일");
            break;
            
        }
        
        System.out.println(year+"년 "+month+"월 "+day+"일");
        int amPm = now.get(Calendar.AM_PM);  //0:am 1:pm
        String strAmPm;
        if (amPm==0) {  //(amPm==Calendar.AM) 도 가능  //AM은 상수
            strAmPm="오전 ";
        }else {
            strAmPm="오후 ";
        }
        System.out.println(strAmPm+hour+"시 "+minute+"분 "+second+"초");
        
        Calendar calNow = Calendar.getInstance();
        year=now.get(Calendar.YEAR);
        month = now.get(Calendar.MONTH)+1;  
        day = now.get(Calendar.DAY_OF_MONTH);
        hour = now.get(Calendar.HOUR);
        minute = now.get(Calendar.MINUTE);
        System.out.println(calNow);
        System.out.println(year+"년 "+month+"월 "+day+"일 "+hour+"시 "+minute+"분 ");
 
    }
 
}
cs

//
오늘은 금요일


2022년 5월 13일
오후 6시 8분 43초


java.util.GregorianCalendar[time=1652440061077,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=2022,MONTH=4,WEEK_OF_YEAR=20,WEEK_OF_MONTH=2,DAY_OF_MONTH=13,DAY_OF_YEAR=133,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=7,SECOND=41,MILLISECOND=77,ZONE_OFFSET=32400000,DST_OFFSET=0]
2022년 5월 13일 8시 7분 

 

 

  • Timezone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.util.TimeZone;
 
public class TimeZoneEx1 {
 
    public static void main(String[] args) {
 
        String[] timeZoneID = TimeZone.getAvailableIDs()//timezone id 다 가져옴
        for (String id: timeZoneID) {
            System.out.println(id);
        }
        
    }
 
}
//
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
~
 
 
import java.util.Calendar;
import java.util.TimeZone;
 
public class CalendarEx1 {
 
    public static void main(String[] args) {
 
        Calendar now = Calendar.getInstance();  //싱글톤
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH)+1;  //월은 0부터 시작
        int day = now.get(Calendar.DAY_OF_MONTH);
        int week=now.get(Calendar.DAY_OF_WEEK);  //일요일: 1
        int hour = now.get(Calendar.HOUR);
        int minute = now.get(Calendar.MINUTE);
        int second= now.get(Calendar.SECOND);
        
        switch(week) {
        case Calendar.SUNDAY:
            System.out.println("오늘은 일요일");
            break;
        case Calendar.MONDAY:
            System.out.println("오늘은 월요일");
            break;
        case Calendar.TUESDAY:
            System.out.println("오늘은 화요일");
            break;
        case Calendar.WEDNESDAY:
            System.out.println("오늘은 수요일");
            break;
        case Calendar.THURSDAY:
            System.out.println("오늘은 목요일");
            break;
        case Calendar.FRIDAY:
            System.out.println("오늘은 금요일");
            break;
        case Calendar.SATURDAY:
            System.out.println("오늘은 토요일");
            break;
            
        }
        
        System.out.println(year+"년 "+month+"월 "+day+"일");
        int amPm = now.get(Calendar.AM_PM);  //1 pm 2 am
        String strAmPm;
        if (amPm==Calendar.AM) {
            strAmPm="오전 ";
        }else {
            strAmPm="오후 ";
        }
        System.out.println(strAmPm+hour+"시 "+minute+"분 "+second+"초");
        
        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");    
        Calendar calNow = Calendar.getInstance(tz);    
        year=calNow.get(Calendar.YEAR);
        month = calNow.get(Calendar.MONTH)+1;  
        day = calNow.get(Calendar.DAY_OF_MONTH);
        hour = calNow.get(Calendar.HOUR);
        minute = calNow.get(Calendar.MINUTE);
        amPm = calNow.get(Calendar.AM_PM);
        if (amPm==Calendar.AM) {
            strAmPm="오전 ";
        }else {
            strAmPm="오후 ";
        }
        System.out.println(year+"년 "+month+"월 "+day+"일 "+strAmPm+hour+"시 "+minute+"분 ");
        
 
    }
 
}
//
2022년 5월 13일 오전 4시 11분 
cs

 

※상수 AM
class Calendar {
  static final int AM=0;
}

 

 

 

Format 클래스

1. DecimalFormat (숫자형식 클래스)

  • 1234567.89 변환
0 10진수 (빈자리 0으로 채움) 0
0.0
0000000000.00000
1234568
1234567.9
0001234567.89000
# 10진수 (빈자리 채우지 않음) #
#.#
##########.#####
1234568
1234567.9
1234567.89
. 소수점 #.0 1234567.9
- 음수 +#.0
-#.0
+1234567.9
-1234567.9
, 단위 구분 #,###.0 1,234,567.0
E 지수 0.0E0 1.2E6
; 양수, 음수 구분 +#,###;-#,### +1,234,568
-1,234,568

 

 

  •  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.text.DecimalFormat;
 
public class NumberFormatEx1 {
 
    public static void main(String[] args) {
 
        double dnum = 5123.2634;
        DecimalFormat df;
        df = new DecimalFormat("0.00");  
        // 0 : 지정된 자리수만 적용됨 (입력값이 더 크면 앞자리에 0 채워짐, 강제성 있음)
        System.out.println(df.format(dnum));
        int num1=7560000;
        df=new DecimalFormat("#,###원");  
        //# : 유동적 (네자리 넘으면 패턴 반복시키고, 네자리 보다 작으면 형식 미지정)
        System.out.println(df.format(num1));
        double dnum2=0.1;
        df=new DecimalFormat("##.0%");
        System.out.println(df.format(dnum2));
    }
 
}
cs

//

5123.26
7,560,000원
10.0%

 

 

2. SimpleDateFormat (날짜형식 클래스)

=> Date 클래스 예제 참고

 

 

3. MessageFormat (문자열형식 클래스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.text.MessageFormat;
 
public class MessageFormatEx1 {
 
    public static void main(String[] args) {
 
        String id = "hong";
        String name = "홍길동";
        String tel = "010-1234-5678";
        String text = "회원ID : {0} \n회원이름 : {1} \n전화번호 : {2}";
        String result = MessageFormat.format(text, id,name,tel,text);  //출력할 문자열,0,1,2
        System.out.println(result);
 
        text="{0}회원님 오늘 부탁하신 제품은 {0}회원님이 원하신 제품이 아니라";
        result=MessageFormat.format(text, name);
        System.out.println(result);
                
    }
 
}
cs

//
회원ID : hong 
회원이름 : 홍길동 
전화번호 : 010-1234-5678


홍길동회원님 오늘 부탁하신 제품은 홍길동회원님이 원하신 제품이 아니라

 

 

Java.time 패키지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.text.Format;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
 
public class DateTimeEx1 {
 
    public static void main(String[] args) {
        //날짜
        LocalDate currentDate = LocalDate.now();  //현재
        System.out.println("오늘은 "+currentDate);
        LocalDate EndDate = LocalDate.of(2022125);  //특정 년월일
        System.out.println("수료일자: "+EndDate);
        int year = currentDate.getYear();
        int month = currentDate.getMonthValue();
        int day = currentDate.getDayOfMonth();
        if (currentDate.isLeapYear()) { //윤년 여부 판단
            System.out.println("올해는 윤년: 2월 29일까지");
        }else {
            System.out.println("올해는 평년: 2월 30일까지");
        }
        System.out.println(year+"년 "+month+"월 "+day+"일");

        //시간
        LocalTime currentTime = LocalTime.now();
        System.out.println("지금 시간은 "+currentTime);
        LocalTime endTime = LocalTime.of(2140);
        System.out.println("수업 종료 시간: "+endTime);

        //날짜와 시간
        LocalDateTime currentDT = LocalDateTime.now();
        System.out.println("현재 날짜와 시간 : "+currentDT);
        LocalDateTime endDT = LocalDateTime.of(2022,12,5,21,40);  //특정 날짜와 시간
        System.out.println("수료 날짜와 시간 : "+endDT);

        ZonedDateTime zdate = ZonedDateTime.now(ZoneId.of("Canada/Eastern"));
        System.out.println("캐나다 시간존 : "+zdate);
        
    }
 
}
cs

//
오늘은 2022-05-13
수료일자: 2022-12-05


올해는 평년: 2월 30일까지
2022년 5월 13일


지금 시간은 19:45:32.244469300
수업 종료 시간: 21:40


현재 날짜와 시간 : 2022-05-13T20:24:16.500247500
수료 날짜와 시간 : 2022-12-05T21:40
캐나다 시간존 : 2022-05-13T07:26:39.113367900-04:00[Canada/Eastern]

 

 

 

확인문제
  • Object 클래스

=> 모든 자바클래스의 최상위 부모클래스
=> Object.equals()==연산자와 동일하게 번지 비교  cf. String.equals : 값내용 가져옴
=> Object의 clone 메소드는 얕은 복사
=> toString메소드는 객체의 필드값을 문자 정보로 리턴

 

 

  • 3번 문제 - Object의 equals(), hashCode() 오버라이딩해 studentNum 같으면 동등 객체 되도록
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Student {
    //필드
    private String studentNum;
    //생성자
    public Student(String studentNum) {
        this.studentNum=studentNum;
    }
    //메서드
    public String getStudentNum() {  //getter
        return studentNum;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            Student student = (Student)obj;
            if (student.getStudentNum().equals(studentNum)){
                return true;
            }        
        }
        return false;
    }
    
    @Override
    public int hashCode() {
        return studentNum.hashCode();
    }
    
}
 
 
import java.util.HashMap;
 
public class StudentExample {
 
    public static void main(String[] args) {
 
        //Student 키로 총점을 저장하는 HashMap 객체 생성
        HashMap<Student, String> hashMap = new HashMap<Student, String>();
        
        //new Student("1")의 점수 95를 저장
        hashMap.put(new Student("1"), "95");
        
        //new Student("1")로 점수를 읽어옴
        String score = hashMap.get(new Student("1"));
        System.out.println("1번 학생의 총점: "+score);
        
    }
 
}
cs

 

 

  • 4번 문제 - toString() 오버라이딩해 예제 결과 나오도록
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Member3 {
 
    private String id;
    private String name;
    
    public Member3 (String id, String name) {
        this.id=id;
        this.name=name;
    }
    
    @Override
    public String toString() {
        return id+" : "+name;
    }
    
}
 
 
public class Member3Example {
 
    public static void main(String[] args) {
        
        Member3 member = new Member3("blue","이파란");
        System.out.println(member);
        
    }
 
}
cs

 

 

  • Class 객체

=> Class.forName() 또는 Class.getClass() 로 얻음

=> 클래스의 생성자, 필드, 메소드 정보 얻음

=> newInstance() => 기본 생성자 이용해 객체 생성 / 리턴 타입: Object 타입

 

 

 

+ Class 클래스
  • Class 객체 얻기 - getClass(), forName()

1. getClass()

Object.getClass 이용해 Class 객체 생성 가능

ex. Class clazz = obj.getClass();

 

2. forName()

객체 생성 전 직접 Class 객체 얻음

정적 메소드

매개값 => 패키지 포함한 클래스 전체 이름

Class 객체 리턴

ex. try{Class clazz = Class.forName(String className)} catch(ClassNotFoundException e){}

 

 

  • 리플렉션 - getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods()

: Class 객체 이용해 클래스의 생성자, 필드, 메소드 정보 알아냄

 

ex.

Constructor[] constructors = clazz.getDeclaredConstructors();

Field[] fields = clazz.getDeclaredFields();

Method[] methods = clazz.getDeclared.Methods();

 

 

  • 동적 객체 생성 - newInstance()

Class 객체 이용하면 new 연산자 없이 동적으로 객체 생성 가능

코드작성X 런타임O 시 클래스 이름 결정되는 경우 유용

Class.forName() 으로 Class 객체 얻음 -> newInstance() 호출해 Object 객체 얻음

 

기본생성자 호출 후 객체 생성하기 때문에 반드시 클래스에 기본생성자 필요

두가지 예외 발생 가능 (InstantiationException : 추상클래스 또는 인터페이스, IllegalAccessException : 접근제한자로 접근 불가)

리턴 타입 Object ->클래스 타입으로 변환해야만 메소드 사용 가능 => 인터페이스 사용해 강제 타입 변환

 

ex.

try{

  Class clazz = Class.forName("런타임시 결정되는 클래스 이름);

  Object obj = clazz.newInstance();

}catch(~