JAVA
chapter20 : api
GAWON
2023. 5. 16. 18:35
1.1 java.lang 패키지
- 자바 프로그램의 기본적인 클래스를 담고 있는 패키지
- import 없이 사용 가능
클래스 용도
Object - 자바 클래스의 최상위 클래스
System - 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용
- 표준 출력 장치(모니터)로 출력하기 위해 사용
- 자바 가상 기계를 종료시킬 때 사용
- 쓰레기 수집기를 실행 요청할 때 사용
Class - 클래스를 메모리로 로딩할 때 사용
String - 문자열을 저장하고 여러 가지 정보를 얻을 때 사용
StringBuffer, StringBuilder - 문자열을 저장하고 내부 문자열을 조작할 때 사용
(연산이 많이 일어날때 쓴다)
Math - 수학 함수를 이용할 때 사용
Wrapper(Byte,Short,Character - 기본 타입의 데이터를 갖는 객체를 만들 때 사용
(파싱) Integer, Float, Double - 문자열을 기본 타입으로 변환할 때 사용
Boolean, Long) - 입력값 검사에 사용
* String, StringBuffer, StringBuilder의 차이
String : 문자열 연산이 적고 멀티쓰레드 환경에서 사용
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경에서 사용
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는경우에 사용
1.2 java.lang.Object 클래스
- 모든 클래스의 슈퍼클래스 (super)이다. (=> 단군할배)
- 모든 클래스는 자동으로 Object 클래스를 상속받는다.
- 따라서, 모든 클래스는 Object 클래스의 메소드를 사용 할 수 있다.
- 모든 클래스 및 데이터는 Object 클래스에 저장 할 수 있다.
- 주요 메소드
1) clone() : 인스턴스 복제
- 실제 복제기능은 Object 클래스의 clone()에 정의 되어있다.
- 반드시 Cloneable 인터페이스를 구현(implements)해야 한다.
- CloneNotSupportedException 예외 처리를 해야한다.(try ~ catch)
- 본래 clone() 메소드의 접근지시자 (protected)를 public으로 변경한다.
2) equals() : 인스턴스 동등 비교
3) getClass() : 클래스 알아내기
4) hashCode() : 해시 코드 값 알아내기
5) toString() : 인스턴스 출력 문자열 반환
1.3 java.util 패키지(Ex05_String / Ex05_StringBuffer)
- 유틸리티성 역할을 하는 클래스들을 담고 있다.
- 컬렉션 클래스들이 대부분을 차지하고 있다.
* 컬렉션(Collections) 클래스 = 여러 유용한 알고리즘을 구현한 메소드들의 집합
정렬(Sorting), 섞기(Shuffling), 탐색(Searching) 등이 있다.
★ 클래스 용도
Arrays - 배열을 조작(비교, 복사, 정렬, 찾기)할 때 사용
Calendar - 운영체제의 날짜와 시간을 얻을 때 사용
Date - 날짜와 시간 정보를 저장하는 클래스
Objects - 객체 비교, null 여부 등을 조사할 때 사용
StringTokenizer - 특정 문자로 구분된 문자열을 뽑아낼 때 사용
Random - 난수를 얻을 때 사용
Q1. Test01.java
Score 클래스 필드 : int kor, eng, mat
메소드 : Constructor, toString(), equals()
Score 인스턴스를 2개 생성하고, 동등 비교(세과목이 모두 같으면 동등) 결과 출력
각 인스턴스 정보는 toString 메소드를 통해 출력
package org.joonzis.test;
class Score {
private int kor, eng, mat;
public Score(int kor, int eng, int mat) {
super();
this.kor = kor;
this.eng = eng;
this.mat = mat;
}
@Override
public String toString() {
return "국어 : " + kor + ",영어 :" + eng + " ,수학 : " + mat +"점";
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Score)) {
return false;
}
Score other = (Score) obj;
return kor == other.kor && eng == other.eng && mat == other.mat;
}
}
public class Test01 {
public static void main(String[] args) {
Score score1 = new Score(90, 80, 70);
Score score2 = new Score(85, 75, 70);
System.out.println(score1);
System.out.println(score2);
score1.equals(score2);
}
}
Q2. Test02.java
User 클래스 필드 : String id, password
메소드 : Constructor, toString(), equals()
User 인스턴스를 2개 생성하고, 동등 비교(id, password 모두 같으면 동등) 결과 출력
각 인스턴스 정보는 toString 메소드를 통해 출력
package org.joonzis.test;
class User {
private String id, password;
public User(String id, String password) {
super();
this.id = id;
this.password = password;
}
@Override
public String toString() {
return "User [id= " + id + " , password=" + password + "]";
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof User) {
User tmp = (User) obj;
if (id.equals(tmp.id) && password.equals(tmp.password)) {
return true;
}
}
return false;
}
}
public class Test02 {
public static void main(String[] args) {
User user1 = new User("id1", "password1");
User user2 = new User("id1", "password1");
System.out.println(user1);
System.out.println(user1.equals(user2) ? "같다" : "다르다");
}
}
Q3. Test03. java
Coordinate 클래스 필드 : int x, int y;
메소드 : Constructor, equals()
Circle 클래스 필드 : Coordinate center, double radius
메소드 : Constructor, equals()
new Circle(0, 0, 1.5) // 중심 좌표[0,0], 반지름 : 1.5
package org.joonzis.test;
class Coordinate {
private int x, y;
public Coordinate() {}
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Object obj) {
if (obj != null && obj instanceof Coordinate) {
Coordinate tmp = (Coordinate) obj;
if (x == tmp.x && y == tmp.y) {
return true;
}
}
return false;
}
}
class Circle {
private Coordinate center;
private double radius;
public Circle( int x, int y,double radius) {
this.center = new Coordinate(x,y);
this.radius = radius;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof Circle) {
Circle tmp = (Circle) obj;
if (center.equals(tmp)&& radius == tmp.radius) {
return true;
}
}
return false;
}
}
public class Test03 {
public static void main(String[] args) {
Circle cir1 = new Circle(0, 0, 1.5);
Circle cir2 = new Circle(0, 0, 1.5);
System.out.println(cir1.equals(cir2));
}
}
Q4. Test04.java
Student 클래스 필드 : String no(학번), String name, int[] scores(국,영,수)
double average, char grade, 상수 int COURSE_COUNT(과목수)
메소드 : Student(String no, String name)
setter{
setScores(int kor, int eng, int mat) - 직접 입력
setScores(int[] scores) - 랜덤 입력
setAverage()
setGrade()
}
toString() 학번, 성명, 평균, 학점 출력
equals() 학번이 같으면 같은 학생으로 비교
package org.joonzis.test;
import java.util.Random;
class Student{
private String no, name;
private int[] scores;
private double average;
private char grade;
public static final int COURSE_COUNT = 3; // 상수 : 값이 변할수 없음, 항상 초기값을 넣어놔야함
// 상수는 프라이빗으로 하면 안됌
public Student(String no, String name){
this.no = no;
this.name = name;
scores = new int[COURSE_COUNT]; // 배열의 크기가 3인걸 알고 있으니 사용함(그냥 숫자 적어도됌)
}
// 저장
// 배열하는 이유는 setAverage()에서 배열을 통해서 저장할 수 있다.
public void setScores(int kor, int eng, int mat) {
scores[0] = kor;
scores[1] = eng;
scores[2] = mat;
setAverage();
setGrade();
}
public void setScores(int[] scores) {
for(int i=0; i<COURSE_COUNT; i++) { // 배열의 길이로 넣어도가능 scores.length
this.scores[i] = scores[i];
}
setAverage();
setGrade();
}
private void setAverage() { //외부에서는 setScores만 노출
int total = 0;
for (int i=0; i< COURSE_COUNT; i++) {
total += scores[i];
}
average = (double)total / COURSE_COUNT;
}
private void setGrade() {
if(average>=90) {grade = 'A';}
else if(average>=80) {grade = 'B';}
else if(average>=70) {grade = 'C';}
else if(average>=60) {grade = 'D';}
else {grade = 'F';}
}
@Override
public String toString() {
return "학번 : " + no + ", 이름 : " + name + ", 평균 : " + average + ", 학점 : " + grade;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof Student) {
Student other = (Student)obj;
return no.equals(other.no);
}else {
return false;
}
}
}
public class Test04 {
public static void main(String[] args) {
Student stu1 = new Student("230001", "강돼지");
stu1.setScores(70, 85, 44);
System.out.println(stu1.toString());
System.out.println("----------------");
Student stu2 = new Student("230002", "박토끼");
int[] sco = new int[Student.COURSE_COUNT]; // static은 객체가아닌 클래스로 접근해야함
Random ran =new Random();
for (int i=0; i<sco.length; i++) {
sco[i] = ran.nextInt(100)+1; // 100은 점수, 0점부터하고 싶으면 101로 할것
}
stu2.setScores(sco);
System.out.println(stu2.toString());
if(stu1.equals(stu2)) {
System.out.println("같은 학생입니다.");
}else {
System.out.println("다른 학생입니다.");
}
}
}
Q5.Test05.java
성(lastName), 이름(firstName)을 각각 입력 받아
하나의 이름(fullName)을 완성하시오. StringBuffer 클래스를 이용하시오.
위의 방식으로 두 이름을 입력 받아 두 이름(fullName)의 동등 비교를 진행하시오.
package org.joonzis.test;
import java.util.Scanner;
public class Test05 {
static java.util.Scanner sc = new Scanner(System.in);
private static String lastName;
private static String firstName;
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
System.out.println("성(lastName) >>");
lastName = sc.nextLine();
System.out.println("성(firstName) >>");
firstName = sc.nextLine();
sb1.append(lastName).append(firstName);
System.out.println("성(lastName) >>");
lastName = sc.nextLine();
System.out.println("성(firstName) >>");
firstName = sc.nextLine();
sb2.append(lastName).append(firstName);
System.out.println("첫 번쨰 이름 : " + sb1);
System.out.println("두 번쨰 이름 : " + sb2);
// StringBuffer 객체가 아닌 String 값의 비교
if (sb1.toString().equals(sb2.toString())) {
System.out.println("같은 이름");
} else {
System.out.println("다른 이름");
}
}
}
Q6.Test06.java
1! ~ 99! 까지 전체 결과를 출력하시오.
1! (1 팩토리얼) = 1
2! (2 팩토리얼) = 1 * 2 = 2
3! (3 팩토리얼) = 1 * 2 * 3 = 6
4! (4 팩토리얼) = 1 * 2 * 3 * 4 = 24
...
n!: (n-1) * n
ex)
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
...
99!
package org.joonzis.test;
import java.math.BigInteger;
public class Test06 {
public static void main(String[] args) {
// 1. int
// for (int i = 1; i < 100; i++) {
// int sum = 1;
// System.out.print(i + "! = ");
// for (int j = 1; j <= i; j++) {
// sum *= j;
//
// }
// System.out.println(sum);
// }
// 2. long
// for (int i = 1; i < 100; i++) {
// long sum = 1;
// System.out.print(i + "! = ");
// for (int j = 1; j <= i; j++) {
// sum *= j;
//
// }
// System.out.println(sum);
// }
//
// 3. BigInteger
for (int i = 1; i < 100; i++) {
BigInteger sum = new BigInteger("1");
System.out.print(i + "! = ");
for (int j = 1; j <= i; j++) {
//sum *= j;
//sum = sum *= j;
sum = sum.multiply(BigInteger.valueOf(j));
}
System.out.println(sum);
}
}
}
Q7.Test07.java
현재 날짜를 StringBuffer, Calendar 클래스를 이용하여
"2019년 10월 21일 월요일 오후 1시 10분" 과 같은 형식으로 완성하고 출력하시오.
StringBuffer.append() 이용
String[] weeks = {"","일","월","화","수","목","금","토"};
package org.joonzis.test;
import java.util.Calendar;
public class Test07 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
Calendar cal = Calendar.getInstance();
String[] weeks = {"","일","월","화","수","목","금","토"};
sb.append(cal.get(Calendar.YEAR)+ "년 ");
sb.append((cal.get(Calendar.MONTH)+1) + "월 ");
sb.append(cal.get(Calendar.DATE)+ "일 ");
sb.append(weeks[cal.get(Calendar.DAY_OF_WEEK)]+ "요일 ");
sb.append(cal.get(Calendar.AM_PM) == 0 ? "오전 " : "오후 ");
sb.append(cal.get(Calendar.HOUR)+ "시 ");
sb.append(cal.get(Calendar.MINUTE)+ "분 ");
System.out.println(sb);
}
}