반응형
- 자바 API 도큐먼트
- 자바 API란?
- ▪ 자바에서 기본적으로 제공하는 라이브러리(library)
- ▪ 프로그램 개발에 자주 사용되는 클래스 및 인터페이스 모음
- API 도큐먼트
- 쉽게 API 찾아 이용할 수 있도록 문서화한 것
- HTML 페이지로 작성되어 있어 웹 브라우저로 바로 볼 수 있음
- http://docs.oracle.com/javase/8/docs/api/
- java.lang 패키지
- 자바 프로그램의 기본적인 클래스를 담은 패키지
- 포함된 클래스와 인터페이스는 import 없이 사용
- 주요 클래스
- java.lang 패키지
- Arrays : 배열을 다루는 여러가지 메소드 제공
- Calendar, Date : 날짜와 시간 관련 클래스
- Objects: 객체에 관련된 여러가지 메소드 제공
- java.lang의 Object 다른 클래스이다.
- StringTokenizer : 특정문자로 구분된 문자열 뽑아 낼 때
- Random : 난수 관련 클래스
import java.util.Arrays;
public class ArraysExample {
public static void main(String[] args) {
String[] arr = {"b", "a", "f", "d"};
String[] strArr = {"b", "a", "f", "d"};
String[][] arr2 = {
{"1", "2", "3"},
{"4", "7"}
};
String[][] arr3 = {
{"1", "2", "3"},
{"4", "7"}
};
System.out.println(arr); // 참조값
System.out.println(Arrays.toString(arr)); // 배열의 내용
System.out.println(arr2); // 참조값
System.out.println(Arrays.toString(arr2)); // 참조값
System.out.println(Arrays.deepToString(arr2)); // 2차원 배열의 내용
System.out.println(arr == strArr);
System.out.println(arr.equals(strArr));
System.out.println(Arrays.equals(strArr, arr));
System.out.println(Arrays.deepEquals(arr2, arr3));
}
}
값
[Ljava.lang.String;@2d363fb3
[b, a, f, d]
[[Ljava.lang.String;@7d6f77cc
[[Ljava.lang.String;@5aaa6d82, [Ljava.lang.String;@73a28541]
[[1, 2, 3], [4, 7]]
false
false
true
true
- Object 클래스
- 자바의 최상위 부모 클래스
- 모든 클래스는 묵시적으로 java.lang.Object 상속함
- Object의 메소드는 모든 클래스에서 사용 가능
- 객체 비교(equals() 메소드)
- 비교 연산자‘==’와 동일한 결과를 반환한다. (주소 값 비교)
- 논리적 동등
- 객체의 참조 값에 관계 없이 객체의 저장 데이터 동일 할 때
- Object의 equals() 메소드를 재정의하여 논리적 동등 비교
public class ObjectExample {
public static void main(String[] args) {
Object aa = new Object();
Object bb = aa;
Object cc = new Object();
System.out.println(aa == bb); // 비교연산자
System.out.println(aa.equals(bb)); // equals
System.out.println(aa.equals(cc));
System.out.println(aa == cc);
String str1 = "abc";
String str2 = "abc";
// str1 str2의 각각의 참조값 다름
// str1 str2의 실제값이 같음 -> 논리적 동등
System.out.println(str1.equals(str2));
}
}
값
true
true
false
false
true
- Map 인터페이스
- 키(Key)와 값(Value)을 하나의 쌍으로 묶어 하나의 데이터로 저장
- 구현 클래스 : HashMap, TreeMap, LinkedHashMap 등
- Key는 중복을 허용하지 않고 Value는 중복을 허용한다.
- 가장 많이 활용하는 HashMap만 알아본다.
- 객체 해시코드(hashCode())
- 객체 해시코드란?
- 객체 식별할 하나의 정수값
- 객체의 메모리 번지 이용해 해시코드 만들어 리턴
- – 개별 객체는 해시코드가 모두 다름
- 논리적 동등 비교 시 hashCode() 오버라이딩의 필요성
- 컬렉션 프레임워크의 HashSet, HashMap, Hashtable 과 같은 클래스는
두 객체가 동등한 객체인지 판단할 때 아래와 같은 과정을 거침
- 컬렉션 프레임워크의 HashSet, HashMap, Hashtable 과 같은 클래스는
import java.util.Objects;
public class Member {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
// Getter & Setter 생성
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
return id == other.id && Objects.equals(name, other.name);
}
@Override
public String toString() {
return "Member [번호 : " + id + ", 이름 : " + name + "]";
}
}
========================================================\
public class MapDemo {
public static void main(String[] args) {
Member member1 = new Member(1, "김길동");
Member member2 = new Member(2, "나길동");
Member member3 = new Member(3, "박길동");
Map<Member, String> map = new HashMap<>();
map.put(member1, "김길동당");
map.put(member2, "나길동당");
map.put(member3, "박길동당");
System.out.println(map.get(member1));
System.out.println(map.get(member2));
System.out.println(map.get(member3));
System.out.println("===========================================");
// hashCode() 오버라이딩 해줘야 함
// hashCode() 오버라이딩 전 값은 null
System.out.println(map.get(new Member(1, "김길동")));
System.out.println(member1.hashCode());
System.out.println(new Member(1, "김길동").hashCode()); // null
System.out.println(member1.toString());
}
}
값
김길동당
나길동당
박길동당
===========================================
김길동당
44297921
44297921
Member [번호 : 1, 이름 : 김길동]
- 객체 복제(clone())
- 원본 객체의 필드 값과 동일한 값을 가지는 새로운 객체 생성하는 것
- 복제 종류
- 얕은 복제(thin clone): 필드 값만 복제 (참조 타입 필드는 번지 공유)
- 깊은 복제(deep clone): 참조하고 있는 객체도 복제
- Object의 clone() 메소드
- 동일한 필드 값 을 가진 얕은 복제된 객체 리턴
- java.lang.Cloneable 인터페이스 구현한 객체만 복제 가능
- 깊은 복제 -
- clone() 메소드 재정의하고 참조 객체도 복제해야 한다.
import java.util.Arrays;
public class Sample01 {
public static void main(String[] args) {
// 얕은 복제
int[] arr = {1,2,3,4,5};
int[] copyArr = arr;
// System.out.println(Arrays.toString(copyArr)); // [1, 2, 3, 4, 5]
arr[0] = 100;
System.out.println(Arrays.toString(copyArr)); // [100, 2, 3, 4, 5]
// 깊은 복제
String[] strArr = {"a", "b", "c"};
String[] copyStrArr = new String[strArr.length];
for (int i = 0; i < strArr.length; i++) {
copyStrArr[i] = strArr[i];
}
System.out.println(Arrays.toString(copyStrArr)); // [a, b, c]
strArr[0] = "가";
//수정후
System.out.println(Arrays.toString(strArr)); // [가, b, c]
System.out.println(Arrays.toString(copyStrArr)); // [a, b, c]
}
}
clone메소드로 복사하기 위해 Cloneable을 구현한다.
clone메소드를 사용하여 Member 객체 복사
public class Member implements Cloneable {
private int id;
private String name;
private String email;
private boolean adult;
public Member(int id, String name, String email, boolean adult) {
this.id = id;
this.name = name;
this.email = email;
this.adult = adult;
}
'
'
// Getter & Setter 생성
'
'
@Override
public Member getCloneMember() throws CloneNotSupportedException {
Member cloned = null;
cloned = (Member) clone();
cloned.setAddress(new Address(
address.getState(),
address.getCity(),
address.getZip())
);
return cloned;
}
}
===========================================================
public class Address {
private String state;
private String city;
private String zip;
public Address(String state, String city, String zip) {
this.state = state;
this.city = city;
this.zip = zip;
}
'
'
// Getter & Setter 생성
'
'
@Override
public String toString() {
return "Address [state=" + state + ", city=" + city + ", zip=" + zip + "]";
}
}
===========================================================
메인 클래스
public class MemberDemo2 {
public static void main(String[] args) throws CloneNotSupportedException {
Member member1 = new Member(1, "홍길동", "hong@example.com", true);
Address addr = new Address("서울특별시", "성북구", "123123");
member1.setAddress(addr);
Member member2 = member1.getCloneMember();
member2.setName("둘리"); // member2 이름 수정
member2.setEmail("dooli@hoi.com"); // member2 이름 수정
member2.setId(100); // member2 이름 수정
member2.getAddress().setState("대구광역시"); // member2 도시이름 수정
// 복사가 되었다면 member1의 도시이름은 서울특별시 여야함
System.out.println(member1); // member1 도시이름 확인
}
}
값
Member [id=1, name=홍길동, email=hong@example.com, adult=true, address=Address [state=서울특별시, city=성북구, zip=123123]]
Member 클래스에서 getCloneMember() 메소드에 cloned.setAddress 부분을 추가 하지않으면
Address는 복사가 안됨. (얕은 복사만 되는중)
getCloneMember() 메소드에 cloned.setAddress 부분을 추가해주면 복사가 됨
반응형
'학습 > JAVA' 카테고리의 다른 글
11. 기본 API 클래스(3) (0) | 2022.10.31 |
---|---|
11. 기본 API 클래스(2) (0) | 2022.10.27 |
10. 예외처리 (0) | 2022.10.25 |
9. 중첩 클래스와 중첩 인터페이스 (0) | 2022.10.24 |
8. 인터페이스 (0) | 2022.10.17 |
댓글