API(Application Programming Interface)란?
- 라이브러리를 접근하여 사용할 수 있도록 규칙을 정의해 놓은 것
- 자바 언어에서도 API를 보고, 필요한 클래스들을 활용할 수 있음
학습목표
Object 및 Wrapper 클래스를 활용하여 프로그래밍을 할 수 있다.
기초적인 클래스들을 활용하여 프로그래밍을 할 수 있다.
Object 클래스
- 모든 자바 클래스의 최상위 부모 클래스
- 패키지 : java.lang
- 자바 컴파일러가 자동으로 상속처리 함
- 자바의 모든 클래스들은 Object 클래스와 동일한 메소드들을 가짐
Object 클래스의 주요 메소드
(1) toString() 메소드
- 객체에 대한 정보를 문자열로 반환
- 오버라이딩하여 원하는 객체 정보로 수정하여 활용함
public class Object {
public String toString(){
return "A";
}
}
class Robot {
public String toString(){ // 오버라이딩
return "B";
}
(2) equals 메소드
- 두 객체를 비교하여 동일한지 판단함
- 동일하면 true, 동일하지 않으면 false 반환
- 두 객체가 참조하는 객체가 동일한지 판단
- 오버라이딩하여 활용
Robot a = new Robot();
Robot b = new Robot();
if(a.equals(b)){ // 객체 a와 b가 동일한지 판단
true
} else {
false
}
class Robot {
int x, y;
public boolean equals(Object obj){
// 매개변수 Object 클래스의 객체를 Robot 클래스의 객체 r로 다운 캐스팅
Robot r = (Robot)obj;
if(r.x == x && r.y == y) {
return true;
else
return false;
}
}
}
Robot a = new Robot();
Robot b = new Robot();
a.x = 10;
b.x = 20;
// Robot 객체 a와 b의 멤버 변수 x의 값이 다르므로 false
if (a.equals(b)) {
true
} else {
false
}
클래스와 객체 비교 연산자
- '==' 연산자 : 오버라이딩하지 않은 Object 클래스의 equals() 메소드와 동일
- 'instanceof' 연산자 : 객체가 해당 클래스로 생성된 객체인지 판단
Robot a = new Robot();
Robot b = new Robot();
if (a == b) // 객체 a와 b가 동일한지 판단 (false)
if (a instanceof Robot) // 객체 a가 Robot 클래스의 객체인지 판단 (true)
if (a instanceof Object) // 객체 a가 Object 클래스의 객체인지 판단 (true)
Object 클래스 실습
package objectclass;
public class ObjectClass {
public static void main(String[] args) {
System.out.println("[toString() 메소드 오버라이딩 안함]");
Robot a = new Robot(10, 20, 30, 40);
Robot b = new Robot(10, 20, 30, 40);
System.out.println(a.toString());
System.out.println(b.toString());
System.out.println();
System.out.println("[equals() 메소드 오버라이딩 안함]");
if(a.equals(b)) {
System.out.println("[a.equals(b)] : true");
} else {
System.out.println("[a.equals(b)] : false");
}
System.out.println();
System.out.println("[클래스 및 객체 비교]");
a = new Robot();
b = new Robot();
System.out.println("[a == b] : "+(a==b));
System.out.println("[a != b] : "+(a!=b));
System.out.println("[a instanceof Robot] : "+(a instanceof Robot));
System.out.println("[b instanceof Robot] : "+(b instanceof Robot));
System.out.println("[a instanceof Object] : "+(a instanceof Object));
System.out.println("[b instanceof Object] : "+(b instanceof Object));
}
}
[toString() 메소드 오버라이딩 안함]
objectclass.Robot@3f8f9dd6
objectclass.Robot@aec6354
[equals() 메소드 오버라이딩 안함]
[a.equals(b)] : false
[클래스 및 객체 비교]
[a == b] : false
[a != b] : true
[a instanceof Robot] : true
[b instanceof Robot] : true
[a instanceof Object] : true
[b instanceof Object] : true
Wrapper 클래스
- 기본 자료형에 대응하는 클래스
- 패키지 : java.lang
- 클래스의 다양한 메소드 활용 가능
기본 자료형 | Wrapper 클래스 |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char, int 형은 이름이 다르므로 주의!
오토 박싱과 오토 언박싱
- 오토 박싱(auto boxing) : 기본 자료형 값을 Wrapper 클래스의 객체로 자동 변환해 주는 것
int a = 100;
// 변수 a를 Integer 클래스의 객체로 자동 변환(오토 박싱)
Integer b = a;
- 오토 언박싱(auto unboxing) : Wrapper 클래스의 객체에 있는 값을 기본 자료형으로 자동 변환해 주는 것
// Integer 클래스의 객체 a 생성(오토 박싱)
Interger a = 100;
int b = a;
Wrapper 클래스 구성
멤버 | 유형 | 예 | 설명 |
상수 | 클래스 특성에 맞는 상수들 존재 | ||
대표적인 멤버 메소드 |
xxxValue() | intValue() floatValue() ... |
기본 자료형의 값으로 반환 |
isXXX() | isFinite() isNan() ... |
값을 검사 | |
toXXXString() | toString() toHexString() ... |
값을 문자열로 표현 | |
valueOf(xxx) | valueOf(int) valueOf(float) ... |
기본 자료형을 Wrapper 클래스의 객체로 변환 |
Wrapper 클래스 사용하기
(1) Integer 클래스
// 문자열 숫자("123")를 숫자(123)로 변환하는 경우
int a = Integer.parseInt("123");
// 숫자(123)을 문자열 숫자("123")로 변환하는 경우
String a = Integer.toString(123);
(2) Character 클래스
char a = '5';
boolean a1 = Character.isDigit(a); // 숫자인지 판단 (true)
boolean a2 = Character.isLetter(a); // 문자인지 판단 (false)
boolean a3 = Character.isUpperCase(a); // 대문자인지 판단 (false)
boolean a4 = Character.isSpace(a); // 공백인지 판단(false)
Wrapper 클래스 실습
package wrapperclass;
public class WrapperClass {
public static void main(String[] args) {
// Wrapper 클래스 객체 생성(오토 박싱)
Boolean bn = true;
Byte be = 100;
Character cr = 'a';
Short st = 200;
Integer ir = 300;
Long lg = 400L;
Float ft = 10.5f;
Double de = 10.5;
// Wrapper 클래스 객체 출력(오토 언박싱)
System.out.println("Boolean : "+bn);
System.out.println("Byte : "+be);
System.out.println("Character : "+cr);
System.out.println("Short : "+st);
System.out.println("Integer : "+ir);
System.out.println("Long : "+lg);
System.out.println("Float : "+ft);
System.out.println("Double : "+de);
// 문자열 숫자를 숫자 자료형으로 변환
int num = Integer.parseInt("300");
Integer in = num; // 오토 박싱
// Integer 값을 float 값으로 변환
float fin = in.floatValue();
System.out.println("Integer --> float : "+fin);
System.out.println("Binary : "+Integer.toBinaryString(in));
System.out.println("Octal : "+Integer.toOctalString(in));
System.out.println("Hexdecimal : "+Integer.toHexString(in));
char[] data = {'a', 'A', '3', ' '};
for(int i=0; i<data.length; i++) {
if (Character.isDefined(data[i])) // 유니코드 값이냐
System.out.println(data[i]+"=Unicode");
if (Character.isDigit(data[i])) // 숫자인가
System.out.println(data[i]+"=Digit");
if (Character.isLetter(data[i])) // 문자인가
System.out.println(data[i]+"=Letter");
if (Character.isLetterOrDigit(data[i])) // 문자 또는 숫자인가
System.out.println(data[i]+"=Letter or Digit");
if (Character.isLowerCase(data[i])) // 소문자인가
System.out.println(data[i]+"=LowerCase");
if (Character.isUpperCase(data[i])) // 대문자인가
System.out.println(data[i]+"=UpperCase");
}
Double value = 11.0;
double result = value.doubleValue() / 3.0; // 0으로 나누면 무한대
System.out.println("result="+result);
System.out.println("Infinite="+Double.isInfinite(result)); // 무한대 값이냐
System.out.println("MAX="+Double.MAX_VALUE);
System.out.println("MIN="+Double.MIN_VALUE);
}
}
Boolean : true
Byte : 100
Character : a
Short : 200
Integer : 300
Long : 400
Float : 10.5
Double : 10.5
Integer --> float : 300.0
Binary : 100101100
Octal : 454
Hexdecimal : 12c
a=Unicode
a=Letter
a=Letter or Digit
a=LowerCase
A=Unicode
A=Letter
A=Letter or Digit
A=UpperCase
3=Unicode
3=Digit
3=Letter or Digit
=Unicode
result=3.6666666666666665
Infinite=false
MAX=1.7976931348623157E308
MIN=4.9E-324
String 클래스
- 문자열 처리를 위한 클래스
- 한번 지정된 문자열은 변경이 불가능함
String 클래스 객체 생성
- 문자열 상수를 직접 지정하는 방법
- String 클래스의 생성자 메소드를 이용하는 방법
String s1 = ""; // 빈 문자열
Stirng s2 = null; // null을 지정한 s2는 객체 생성 안됨
if(s1 == "") // true
if(s2 == null) // true
String s1 = "AAA";
String s2 = "AAA";
if(s1 == s2) // true
if(s1 == "AAA") // 동일한 문자열 상수(s1, s2)는 동일한 메모리가 할당됨
// 생성자 메소드를 이용하여 객체 생성
String s1 = new String("AAA");
String s2 = new String("AAA"); // s1과 s2는 별도의 메모리를 참조
if (s1 == s2) // false
if (s1 == "AAA") // false
if (s1.equals(s2)) // true
String 클래스의 주요 메소드
주요 메소드 | 설명 |
int length() | 문자열 길이 |
boolean equals(Object obj) | 객체의 내용을 비교 |
boolean eqaulsIgnoreCase(String) | 대소문자 구분없이 비교 |
String subString(int index) | index부터 마지막까지 문자열 반환 |
String concat(String str) | 문자열을 연결하여 문자열 반환 |
String replace(char old, char new) | 문자를 교체하여 문자열 반환 |
String toLowerCase() | 소문자로 변경한 문자열 반환 |
String toUpperCase() | 대문자로 변경한 문자열 반환 |
char charAt(int index) | idex 위치의 문자를 반환 |
int indexOf(String str) | 처음부터 str 문자열의 위치를 반환 |
int lastIndexOf(Stirng str) | 뒤에서부터 str 문자열의 위치를 반환 |
String trim() | 문자열의 시작과 끝 공백을 삭제한 문자열 반환 |
StringBuffer 클래스
- 버퍼 메모리를 확보해 놓고 문자열을 처리
- String 클래스 보다 처리 속도가 빠름
- 저장된 문자열을 수정 및 변경할 수 있어서 다양한 문자열 처리가 가능함
StringBuffer 클래스의 주요 메소드
주요 메소드 | 설명 |
int length() | 문자열 개수 반환 |
int capacity() | 현재 할당된 버퍼의 크기 반환 |
StringBuffer append(Stirng str) | str문자열을 뒤에 붙여서 추가 |
StringBuffer insert(int offset, String str) | str을 offset 위치에 끼워넣기 |
StringBuffer delete(int start, int end) | start부터 end-1 사이의 문자열 삭제 |
StringBuffer replace(int s, int e, String c) | s에서 e-1위치의 문자열 삭제 후 c 삽입함 |
StringBuffer reverse() | 문자열의 순서를 뒤집음 |
문자열 관련 클래스 실습
package stringclass;
public class StringClass {
public static void main(String[] args) {
System.out.println("[빈 문자열과 NULL]");
String s1;
String s2 = "";
String s3 = null;
System.out.println("빈 문자열 비교 : "+ (s2==""));
System.out.println("NULL 문자 비교 : "+ (s3==null));
System.out.println("[문자열 상수를 직접 지정하여 객체 생성]");
String s4 = "AAA";
String s5 = "AAA";
System.out.println("s4 == s5 : " + (s4 == s5));
System.out.println("s4 == 'AAA' : "+ (s4=="AAA"));
System.out.println("[생성자 메소드를 이용하여 객체 생성]");
String s6 = new String("AAA");
String s7 = new String("AAA");
System.out.println("s6 == s7 : "+(s6 == s7));
System.out.println("s6 == 'AAA' : "+(s6=="AAA"));
System.out.println("s6.equals(s7) : " + s6.equals(s7));
System.out.println("s6.equals('AAA') : " + s6.equals("AAA"));
System.out.println("[주요 메소드 사용]");
String s8 = " Java Program ";
System.out.println("length() : "+s8.length());
System.out.println("subString(6) : "+s8.substring(6));
System.out.println("concat('Coding') : "+s8.concat("Coding"));
System.out.println("replace('a', 'A') :"+s8.replace('a', 'A'));
System.out.println("toLowerCase() : "+s8.toLowerCase());
System.out.println("toUpperCase() : "+s8.toUpperCase());
System.out.println("charAt(9) : "+s8.charAt(6));
System.out.println("indexOf('Pro') : "+s8.indexOf("Pro"));
System.out.println("lastIndexOf('Pro') : "+s8.lastIndexOf("Pro"));
System.out.println("trim() : "+s8.trim());
System.out.println("== StringBuffer 클래스 ==");
StringBuffer sb = new StringBuffer("Java Programming");
System.out.println("length() : "+sb.length());
System.out.println("capacity() : "+sb.capacity());
System.out.println("append(' Study ') : "+sb.append(" Study "));
System.out.println("insert(5, 'Application ') : "+sb.insert(5, "Application "));
System.out.println("toString() : "+sb.toString());
System.out.println("delete(17, 28) : "+sb.delete(17, 28));
System.out.println("replace(0, 4, '자바') : "+sb.replace(0, 4, "자바"));
System.out.println("reverse() : "+sb.reverse());
}
}
[빈 문자열과 NULL]
빈 문자열 비교 : true
NULL 문자 비교 : true
[문자열 상수를 직접 지정하여 객체 생성]
s4 == s5 : true
s4 == 'AAA' : true
[생성자 메소드를 이용하여 객체 생성]
s6 == s7 : false
s6 == 'AAA' : false
s6.equals(s7) : true
s6.equals('AAA') : true
[주요 메소드 사용]
length() : 14
subString(6) : Program
concat('Coding') : Java Program Coding
replace('a', 'A') : JAvA ProgrAm
toLowerCase() : java program
toUpperCase() : JAVA PROGRAM
charAt(9) : P
indexOf('Pro') : 6
lastIndexOf('Pro') : 6
trim() : Java Program
== StringBuffer 클래스 ==
length() : 16
capacity() : 32
append(' Study ') : Java Programming Study
insert(5, 'Application ') : Java Application Programming Study
toString() : Java Application Programming Study
delete(17, 28) : Java Application Study
replace(0, 4, '자바') : 자바 Application Study
reverse() : ydutS noitacilppA 바자
Random 클래스
- 임의의 값을 발생시키는 메소드를 가진 클래스
- 객체 생성 후 여러 번 임의의 값을 가져올 수 있음
- 패키지 : java.util
주요 메소드 | 설명 |
int nextInt() | 정수형 임의의 값을 반환 |
int nextInt(int n) | 0에서 n 사이의 임의의 값 반환 (n은 포함하지 않음) |
float nextFloat() double nextDouble() |
0.0에서 1.0 사이의 임의의 값 반환 (1.0은 포함하지 않음) |
Math 클래스
- 수학과 관련된 메소드를 제공하는 클래스
- 대부분 정적 멤버 메소드로 정의되어 있음(객체 생성 없이 클래스 이름으로 사용 가능)
주요 메소드 | 설명 |
static int abs(int a) | 절대값 반환(자료형 별로 오버로딩) |
static int max(int a, int b) | 큰 값을 반환(자료형 별로 오버로딩) |
stiatic int min(int a, int b) | 작은 값을 반환(자료형 별로 오버로딩) |
static double log(double a) | 로그 함수값 반환 |
static long round(double a) | 반올림 값을 반환 |
static double sqrt(double a) | 제곱근 값을 반환 |
static double pow(double a, double b) | a의 b승을 반환 |
static double sin(double a) | sin 값을 반환 |
Calender 클래스
- 날짜와 시간을 표현하는 클래스
- 시스템의 날짜와 시간을 가져오기 위해서 getInstance() 메소드로 객체를 생성
- 패키지 : java.util
Calender now = Calender.getInstance();
주요 메소드 | 설명 |
int get(int field) | filed 값에 따라 해당 값을 반환 |
주요 상수 | 설명 |
YEAR | 년 |
MONTH | 월 |
DATE | 일 |
DAT_OF_WEEK | 요일 SUNDAY=1, MONDAY=2, ... SATURDAY=7 |
HOUR | 시 - 12시간 기준 |
HOUR_OF_DAY | 시 - 24시간 기준 |
MINUTE | 분 |
SECOND | 초 |
AM_PM | 오전(Calender.AM), 오후(Calender.PM) |
Random, Math, Calender 클래스 실습
package rmcclass;
import java.util.Calendar;
import java.util.Random;
public class RMCClass {
public static void main(String[] args) {
System.out.println("[Random 클래스]");
Random r = new Random();
for(int i=0; i<5; i++)
System.out.println("nextInt(100) : "+r.nextInt(100)); // 0~99 사이
for(int i=0; i<5; i++)
System.out.println("nextDouble() : "+r.nextDouble()); // 0~1 사이
System.out.println("[Math 클래스]");
System.out.println("abs(-20) : "+Math.abs(-20));
System.out.println("max(10, 20) : "+Math.max(10, 20));
System.out.println("min(10, 20) : "+Math.min(10, 20));
System.out.println("log(10) : "+Math.log(10));
System.out.println("round(10.567) : "+Math.log(10));
System.out.println("sqrt(2) : "+Math.sqrt(2));
System.out.println("pow(2, 10) : "+Math.pow(2, 10));
System.out.println("sin(360) : "+Math.sin(360));
System.out.println("[Calender 클래스]");
Calendar now = Calendar.getInstance();
char[] dow = {' ', '월', '화', '수', '목', '금', '토' };
String[] ap = {"AM", "PM"};
String result = "Today : ";
result += now.get(Calendar.YEAR) + "년 ";
result += now.get(Calendar.MONTH) + "월 ";
result += now.get(Calendar.DATE) + "일(";
// DAY_OF_WEEK()은 숫자로 반환함 (목=4)
result += dow[now.get(Calendar.DAY_OF_WEEK)] + ")";
System.out.println(result);
result = "Time : ";
result += ap[now.get(Calendar.AM_PM)]+" ";
result += now.get(Calendar.HOUR) + "시(";
result += now.get(Calendar.HOUR_OF_DAY) + ") ";
result += now.get(Calendar.MINUTE) + "분 ";
result += now.get(Calendar.HOUR) + "초 ";
System.out.println(result);
}
}
[Random 클래스]
nextInt(100) : 64
nextInt(100) : 67
nextInt(100) : 82
nextInt(100) : 96
nextInt(100) : 50
nextDouble() : 0.7973920561207821
nextDouble() : 0.041279840000760126
nextDouble() : 0.9626759619328098
nextDouble() : 0.6331520112004843
nextDouble() : 0.5100996208329094
[Math 클래스]
abs(-20) : 20
max(10, 20) : 20
min(10, 20) : 10
log(10) : 2.302585092994046
round(10.567) : 2.302585092994046
sqrt(2) : 1.4142135623730951
pow(2, 10) : 1024.0
sin(360) : 0.9589157234143065
[Calender 클래스]
Today : 2023년 6월 12일(목)
Time : PM 1시(13) 37분 1초
적용하기
1) Random 클래스를 이용한 임의의 수(1에서 100사이) 맞추는 게임
2) 키보드로 숫자를 입력 받아 임의의 수를 몇 번에 맞추는지 출력
(내 답)
import java.util.Random;
import java.util.Scanner;
public class GuessGame {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Random r = new Random();
System.out.println(" ==== 숫자 맞추기 게임 ==== ");
int random = r.nextInt(11);
int count = 0;
int input;
do {
System.out.print("1~10사이 숫자를 입력하세요 : ");
input = s.nextInt();
count++;
} while(input == random);
System.out.println("숫자를 맞추셨습니다!");
System.out.println(count+"번만에 맞추셨습니다!");
}
}
==== 숫자 맞추기 게임 ====
1~10사이 숫자를 입력하세요 : 10
1~10사이 숫자를 입력하세요 : 7
숫자를 맞추셨습니다!
2번만에 맞추셨습니다!
(해설)
import java.util.Random;
import java.util.Scanner;
public class NumberGame {
int random_number;
int count;
public NumberGame() {
Random r = new Random();
random_number = r.nextInt(100) + 1;
count = 0;
}
int findNumber(int num) {
return num - random_number;
}
void incrementCount() {
count++;
}
int getCount() {
return count;
}
public static void main(String[] args) {
Scanner kbd = new Scanner(System.in);
NumberGame ng = new NumberGame();
do {
System.out.print("숫자를 입력하세요! : ");
String value = kbd.nextLine();
int int_value = Integer.parseInt(value); // 문자열 숫자를 숫자로 변환
ng.incrementCount();
int result = ng.findNumber(int_value);
if(result < 0) {
System.out.println(int_value+" 보다 커야 합니다! ("+ng.getCount()+")");
} else if (result > 0) {
System.out.println(int_value+" 보다 작아야 합니다! ("+ng.getCount()+")");
} else if (result == 0) {
System.out.println(ng.getCount()+"번 만에 맞추셨습니다.");
break;
}
} while(true);
}
}
숫자를 입력하세요! : 11
11 보다 커야 합니다! (1)
숫자를 입력하세요! : 50
50 보다 작아야 합니다! (2)
숫자를 입력하세요! : 33
33 보다 작아야 합니다! (3)
숫자를 입력하세요! : 22
22 보다 커야 합니다! (4)
숫자를 입력하세요! : 30
30 보다 작아야 합니다! (5)
숫자를 입력하세요! : 28
28 보다 작아야 합니다! (6)
숫자를 입력하세요! : 27
27 보다 작아야 합니다! (7)
숫자를 입력하세요! : 26
8번 만에 맞추셨습니다.
1~100 사이니까 숫자를 입력했을 때 "입력한 숫자보다 작게 or 크게 입력하세요" 라는 메세지 주는 것까지 하려다 간단하게 do-while 문으로만 짰는데 ^-ㅠ..
findNumber(int num) {
return num - random_number;
}
내가 입력한 값보다 random값이 작으면, if (result < 0)이 실행되고
내가 입력한 값보다 random값이 크면, else if (result > 0)이 실행되고
두 값이 같다면 (num-random_number = 0) , else if (result == 0)이 실행된다.
class에 함수를 정의할 때 main에서 어떻게 써야할지 생각하는게 참 관건인듯..
..??
뭐야 17시간 아니예요 어디서 강의듣다 안끈듯..
'온라인 강좌 > 안드로이드 프로그래밍을 위한 자바기초' 카테고리의 다른 글
9차시 컬렉션 프레임워크 활용 (0) | 2023.07.12 |
---|---|
7차시 상속을 활용한 객체지향 프로그래밍 기본 문법 이해하기 (0) | 2023.07.11 |
6차시 클래스를 이용한 객체지향 프로그래밍 기본 문법 이해하기 (0) | 2023.07.10 |
5차시 배열의 기본 문법 이해하기 (0) | 2023.07.09 |
4차시 조건문과 반복문의 기본 문법 이해하기 (0) | 2023.07.08 |