1. lang 패키지
Object, String, StringBuilder ... 와 같은 클래스가 들어있는 패키지.
자바 언어의 기본적인 클래스를 담고 있는 패키지.
이 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.
클래스 | 용도 | ||
Object | 자바 클래스의 최상위 클래스로 사용 | equals() hashCode() toString() ... |
|
System | - 키보드로부터 데이터를 입력받을 때 사용 - 모니터(콘솔)로 출력하기 위해 사용 - 프로세스를 종료시킬 때 사용 - 진행시간을 읽을 때 사용 - 시스템 속성(프로퍼티)을 읽을 때 사용 |
||
문자열 관련 | String | 문자열을 저장하고 조작할 때 사용 | |
StringBuilder | 요율적인 문자열 조작 기능이 필요할 때 사용 | ||
java.util.StringTokenizer | 구분자로 연결된 문자열을 분리할 때 사용 | ||
포장 관련 (랩퍼 클래스) |
Byte, Short, Character, Integer, Float, Double, Boolean | - 기본 타입의 값을 포장할 때 사용 - 문자열을 기본 타입으로 변환할 때 사용 |
auto boxing / auto unboxing 생겨서 자동으로 타입 변환됨. Object[] arr = new Object[5]; arr[2] = new Integer(1); => arr[2] = 1; |
Math | 수학 계산이 필요할 때 사용 | ||
Class | 클래스의 메타 정보(이름, 구성 멤버) 등을 조사할 때 사용 |
(출처: <이것이 자바다> 신용권, 임경균 지음)
1-1. Object 클래스
: 자바의 모든 클래스가 상속받는 대모 클래스.
- 멤버변수 없이 메서드로만 구성된 클래스.
=> Object 클래스가 갖는 메서드는 모든 클래스가 갖고 있다.
※ Object 클래스가 갖는 메서드
clone -- 메모리 복사, 객체 복사.
equals() -- 객체의 번지를 비교. 같으면 true, 다르면 false 반환.
----- boolean equals(Object obj) {}
(※ A.equals(B) -- 문자열 (String A와 String B의 값이 같은지) 비교)
hashCode() -- 참조값 반환.
getClass -- Class를 반환하는 메서드. Class 클래스 정보객체.
toString() -- 객체 설명 문자열 반환. (재정의 안 할 경우 클래스명@참조값 형태로 리턴)
wait -- 쓰레드 잠재우기
notify -- 쓰레드 1개 깨우기
notifyAll -- 쓰레드 전부 깨우기
...
▼ 예시1) clone & hashCode
package langTest;
class MyClone implements Cloneable {
int a;
int b;
public MyClone() {
}
public MyClone(int a, int b) {
// TODO Auto-generated constructor stub
this.a = a;
this.b = b;
}
// 객체 메모리 복사
// 바꿀 필요 없이 그대로 사용하면 됨!
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
@Override
public String toString() {
return "MyClone [a=" + a + ", b=" + b + "]";
}
}
public class CloneTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClone m1 = new MyClone(4, 5);
MyClone m2 = new MyClone();
m2.a = m1.a;
m2.b = m1.b;
System.out.println(m1 + " / 참조값:" + m1.hashCode());
System.out.println(m2 + " / 참조값:" + m2.hashCode());
// clone()으로 객체 복사.
try {
MyClone m3 = (MyClone) m1.clone();
System.out.println(m1 + " / 참조값:" + m1.hashCode());
System.out.println(m3 + " / 참조값:" + m3.hashCode());
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
=======================================
MyClone [a=4, b=5] / 참조값:2060468723
MyClone [a=4, b=5] / 참조값:622488023
MyClone [a=4, b=5] / 참조값:2060468723
MyClone [a=4, b=5] / 참조값:1933863327
-------------------------------------------
▼ 예시2) equals() 재정의
1) int값 비교
@Override
public boolean equals(Object obj) { //업캐스팅됨
// TODO Auto-generated method stub
//instanceof: 타입 비교 연산자. 타입 같으면 true, 다르면 false 반환
if (obj instanceof Product2) {
Product2 p = (Product2)obj;
if (p.num == this.num) { //제품번호만 같으면 같은 객체로 처리
return true;
}
}
return false;
}
2) String값 비교
package langTest;
class Member {
String id;
String pwd;
public Member() {
}
public Member(String id, String pwd) {
this.id = id;
this.pwd = pwd;
}
//모든 타입을 다 받아올 수 있게 Object 타입으로 업캐스팅됨.
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
//instanceof: 타입 비교 연산자. 타입 같으면 true, 다르면 false 반환
if (obj instanceof Member) { //Member 타입이 맞느냐 비교.
Member m = (Member)obj; // 다운캐스팅
if (this.id.equals(m.id) && this.pwd.equals(m.pwd)) {
return true;
}
}
return false;
}
@Override
public String toString() {
return "Member [id=" + id + ", pwd=" + pwd + "]";
}
}
public class EqualsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Member m1 = new Member("aaa", "111");
Member m2 = new Member("aaa", "123");
Member m3 = new Member("aaa", "111");
Member m4 = m1;
// == 으로 객체를 비교하면 -> 참조값 비교
// equals 로 객체를 비교하면 -> 객체의 값(멤버변수 값) 비교
// Object 클래스의 equals는 ==으로 객체 비교. (재정의 하지 않으면!)
System.out.println("m1 == m2: " + (m1 == m2));
System.out.println("m1.equals(m2): " + m1.equals(m2));
System.out.println("m1 == m3: " + (m1 == m3));
System.out.println("m1.equals(m3): " + m1.equals(m3));
System.out.println("m1 == m4: " + (m1 == m4));
System.out.println("m1.equals(m4): " + m1.equals(m4));
}
}
========================================
m1 == m2: false
m1.equals(m2): false
m1 == m3: false
m1.equals(m3): true
m1 == m4: true
m1.equals(m4): true
-------------------------------------------
1-2. String 클래스
: 문자열 처리 클래스
문자열 -> byte[] 변환 --- getBytes();
byte[] -> 문자열 변환 --- new String(byte[]);
String data = "자바"
//String -> byte[] (UTF-8 인코딩)
byte[] arr1 = data.getBytes(); //== data.getBytes("UTP-8")
System.out.println("arr1: " + Arrays.toString(arr1));
//byte[] -> String (UTF-8 디코딩)
String str1 = new String(arr1); //== new String(arr1, "UTF-8")
System.out.println("str1: " + str1);
//String -> byte[] (EUC-KR 인코딩)
byte[] arr2 = data.getBytes("EUC-KR");
System.out.println("arr2: " + Arrays.toString(arr2));
//byte[] -> String (UTF-8 디코딩)
String str2 = new String(arr2, "EUC-KR");
System.out.println("str2: " + str2);
=====================================
arr1: [-20, -98, -112, -21, -80, -108]
str1: 자바
arr2: [-64, -38, -71, -39]
str2: 자바
(출처: <이것이 자바다> 신용권, 임경균 지음)
▽ String 생성 예시
package langTest;
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// String 생성의 다양한 종류
String s1 = "asdf";
String s2 = new String(s1); // 기존의 객체를 생성자에 넣음.
String s3 = new String("345"); // 새로운 값을 생성자에 넣음.
char[] ch = {'h', 'e', 'l', 'l', 'o'};
String s4 = new String(ch);
byte[] b = {'h', 'e', 'l', 'l', 'o'}; // 문자도 정수타입에 속함(아스키코드값)
String s5 = new String(b);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
}
}
=============================
asdf
asdf
345
hello
hello
-------------------------------------------
▽ String API 예시
public class StringMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "abcgafghju";
String b = "def,ghj,jkl,asd";
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("a.charAt(1): " + a.charAt(1)); // charAt(i): i번째 문자 한 개 출력
System.out.println("a.concat(b): " + a.concat(b));
System.out.println("a.indexOf(\"c\"): " + a.indexOf("c"));
System.out.println("a.lastIndexOf(\"a\"): " + a.lastIndexOf("a"));
System.out.println("a.length(): " + a.length());
System.out.println("a.replace(\"cg\", \"kkk\"): " + a.replace("cg", "kkk"));
System.out.println("a.toUpperCase(): " + a.toUpperCase());
System.out.println("a.substring(2, 6): " + a.substring(2, 6));
String[] arr = b.split(",");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
====================================
a: abcgafghju
b: def,ghj,jkl,asd
a.charAt(1): b
a.concat(b): abcgafghjudef,ghj,jkl,asd
a.indexOf("c"): 2
a.lastIndexOf("a"): 4
a.length(): 10
a.replace("cg", "kkk"): abkkkafghju
a.toUpperCase(): ABCGAFGHJU
a.substring(2, 6): cgaf
def
ghj
jkl
asd
-------------------------------------------
1-2. StringBuailder
: 문자열 처리 클래스
- 내부 버퍼(데이터를 저장하는 메모리) 있음. --- String 클래스는 없음!
- StringBuilder는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계됨.
--- String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있음!
리턴 타입 | 메소드 | |
StringBuilder | append(문자열) | 문자열을 끝에 추가 |
StringBuilder | insert(위치, 문자열) | 문자열을 지정 위치에 추가 |
StringBuilder | delete(시작위치, 끝위치) | 문자열 일부를 삭제 |
StringBuilder | replace(시작위치, 끝위치, 문자열) | 문자열 일부를 대체 |
String | toString() | 완성된 문자열을 리턴 StringBuilder 값을 String으로 변환
|
String data = new StringBuilder()
// 메소드 체이닝 패턴: 연이어서 다른 메소드 호출
// toString()을 제외한 다른 메소드는 StrindBuilder를 다시 리턴하기 때문.
.append("DEF")
.insert(0, "ABC")
.delete(3, 4)
.toString();
System.out.println(data);
▽ 파일 읽기 메서드 -- StringBuilder, 문자스트림(Reader) 예시
// 파일 읽기 메서드. 파라메터로 읽을 파일의 경로를 받음
public String fileRead(String path) {
StringBuilder sb = new StringBuilder(); // 파일에서 읽은 내용을 저장.
try {
FileReader fr = new FileReader(path); // 파일 읽기 스트림 생성
char[] buf = new char[100]; // 문자 100개씩 읽어서 담을 배열
while (fr.read(buf) > 0) { // read(): 읽은 문자 수 반환
sb.append(buf);
// (while 마지막 턴에 100개보다 적게 읽혔을 때 나머지는 쓰레기값으로 채워짐)
Arrays.fill(buf, ' '); // buf에 남은 쓰레기값 삭제
}
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 파일 전체내용 반환
return sb.toString(); //StringBuilder 값을 String으로 변환
}
-------------------------------------------
▽ StringBuilder API 예시
package langTest;
import java.util.Scanner;
public class StringBuilderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append("aaa"); // 문자열 끝에 추가
sb.append("bbb");
sb.append("ccc");
System.out.println(sb.toString()); //문자열 결합해 toString으로 변환.
System.out.println("sb.indexOf(\"ab\"): " + sb.indexOf("ab"));
sb.insert(2, "kkk");
System.out.println(sb.toString());
sb.delete(3, 5);
System.out.println(sb.toString());
Scanner sc = new Scanner(System.in);
String txt = "";
StringBuilder sb2 = new StringBuilder ();
while (true) {
System.out.println("멈추려면 stop 입력");
txt = sc.next();
if (txt.startsWith("stop")) {
break;
}
sb2.append(txt + "\n");
}
System.out.println(sb2.toString());
}
}
-------------------------------------------
1-3. 랩퍼클래스
: 기본 타입의 값을 클래스 타입으로 감싸주는 클래스.
(Integer, Float, Boolean, Double.... 처럼 써줘야 하는데, 요즘은 auto boxing / auto unboxing 기능이 생겨 자동으로 해줌.)
arr[2] = new Integer(1); => arr[2] = 1;
모든 타입을 담을 수 있는 배열을 만들고 싶다 =>
Object[] arr = new Object[5];
arr[0] = "asdf";
arr[1] = new StringBuilder();
arr[2] = 1; //int 타입은 기본타입이어서 업캐스팅 불가. -> 클래스 타입으로 변환해줘야 함(랩퍼클래스) -> 자동처리!
arr[3] = 3.24f;
public class ObjArrTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object[] arr = {1, 2, 45f, "asdfg", new ObjArrTest() };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
========================================
1
2
45.0
asdfg
langTest.ObjArrTest@1dbd16a6