본문 바로가기
학습/JAVA

11. 기본 API 클래스(1)

by Elfen Lied 2022. 10. 26.
반응형

- 자바 API 도큐먼트

  • 자바 API란?
    • ▪ 자바에서 기본적으로 제공하는 라이브러리(library)
    • ▪ 프로그램 개발에 자주 사용되는 클래스 및 인터페이스 모음
  •  API 도큐먼트

 

  • java.lang 패키지
    • 자바 프로그램의 기본적인 클래스를 담은 패키지
    • 포함된 클래스와 인터페이스는 import 없이 사용
    • 주요 클래스

 

  • java.lang 패키지
    • Arrays : 배열을 다루는 여러가지 메소드 제공
    • Calendar, Date : 날짜와 시간 관련 클래스
    • Objects: 객체에 관련된 여러가지 메소드 제공
      1. 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() 메소드)
    • 비교 연산자‘==’와 동일한 결과를 반환한다. (주소 값 비교)
    • 논리적 동등
      1. 객체의 참조 값에 관계 없이 객체의 저장 데이터 동일 할 때
      2. 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())

  • 객체 해시코드란?
    • 객체 식별할 하나의 정수값
    • 객체의 메모리 번지 이용해 해시코드 만들어 리턴
      1. – 개별 객체는 해시코드가 모두 다름
  • 논리적 동등 비교 시 hashCode() 오버라이딩의 필요성
    • 컬렉션 프레임워크의 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

댓글