* 이 포스팅은 hyeonstorage.tistory.com/님의 포스팅과 www.tutorialspoint.com/java/java_object_classes.htm 학습한 뒤 추가로 공부한 후 재정리한 글입니다.
* 2차 가공 및 재배포를 금지합니다.
- 재배포시 출처를 남겨주세요.
* 오탈자 및 잘못된 내용은 댓글달아주세요.
0. JAVA 기본 개념
* 자바는 Polymorphism, Inheritance, Encapsulation, Abstraction, Classes, Objects, Instance, Method, Message Passing 의 기능을 가지고 있다.
* Object : 객체에는 상태와 동작이 있다.
- 예 : 개는 꼬리를 흔드는 것, 짖는 것, 먹는 것 등의 상태를 가지고 있다. 그래서 객체는 클래스의 인스턴스다.
* Class : 해당 유형의 객체가 지원하는 동작, 상태를 설명하는 템플릿
1. Object 클래스
* Java.lang 패키지
- 자바 프로그램에서 가장 많이 사용되는 패키지
- 자바 프로그램 내에 'import' 문을 사용하지 않아도 자동으로 포함
- java.lang 패키지의 클래스 구조도
* Object 클래스
- 자바 API의 모든 클래스와 사용자가 정의한 모든 클래스의 최상위 클래스
- java.lang 패키지 내의 최상위 클래스
- 모든 자바 클래스들은 Object 클래스로부터 상속받음
- 주요 메소드
메소드 | 설명 |
boolean equals(Object obj) | 두 개의 객체가 같은지 비교하여 같으면 true를 같지 않으면 false를 반환 |
String toString() | 현재 객체의 문자열을 반환 |
protected Object clone() | 객체를 복사 |
protected void finalize() | 가비지 컬렉션 직전에 객체의 리소스를 정리할 때 호출 |
Class getClass() | 객체의 클래스형을 반환 |
int hashCode() | 객체의 코드값을 반환 |
void notify() | wait된 스레드 실행을 재개할 때 호출 |
void wait() | 스레드를 일시적으로 중지할 때 호출 |
void wait(long timeout) | 주어진 시간만큼 스레드를 일시적으로 중지할 때 호출 |
void wait(long timeout, int nanos) | 주어진 시간만큼 스레드를 일시적으로 중지할 때 호출 |
2. Clone()
* Object 클래스에 clone() 메소드가 protected로 정의되어있다.
- 기본적으로 메모리를 복사함
- clone()을 지원하려면 그 클래스는 Cloneable 인터페이스를 implements 해야 함
- clone()을 지원할 클래스라면 Object 클래스에 정의되어있는 protected Object clone() 메서드를 public으로 재정의해서 사용해야 함
* 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성
- 본질적으로 clone 메소드는 또 다른 종류의 생성자나 마찬가지다. 원본 객체에 피해를 주면 안되고, 복제본 객체는 클래스의 불변 규칙을 지켜야함
[ 예시 코드 - Deep Copy ]
public class Test{
public static void main(String[] args) throws CloneNotSupportedException {
Parent parent = new Parent();
P.setName("나는 부모의 값");
Parent child = (Parent) parent.clone();
System.out.println("P의 결과 : " + parent.getName());
System.out.println("C의 결과 : " + child.getName());
parent.setName("나는 새로운 부모의 값");
System.out.println("P의 결과 : " + parent.getName());
System.out.println("C의 결과 : " + child.getName());
}
}
[ 결과 ]
P의 결과 : 나는 부모의 값
C의 결과 : 나는 부모의 값
P의 결과 : 나는 새로운 부모의 값
C의 결과 : 나는 부모의 값
2-1. 얕은 복사 (Shallow Copy)
* 정의
- 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성
- 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조
- 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경
public class Test{
public static void main(String[] args) throws CloneNotSupportedException {
Parent parent = new Parent();
P.setName("나는 부모의 값");
Parent child = Parent;
System.out.println("P의 결과(원본) : " + parent.getName());
System.out.println("C의 결과(얇은 복사) : " + child.getName());
parent.setName("나는 새로운 부모의 값");
System.out.println("P의 결과(원본) : " + parent.getName());
System.out.println("C의 결과(얇은 복사) : " + child.getName());
}
}
[ 결과 ]
P의 결과(원본) : 나는 부모의 값
C의 결과(얇은 복사) : 나는 부모의 값
P의 결과(원본) : 나는 새로운 부모의 값
C의 결과(얇은 복사) : 나는 새로운 부모의 값
2-2. 깊은 복사 (Deep Copy)
* 정의
- 객체를 복사할 때 해당 객체와 인스턴스 변수까지 복사하는 방식
- 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않는다.
public class Test{
public static void main(String[] args) throws CloneNotSupportedException {
Parent parent = new Parent();
P.setName("나는 부모의 값");
Parent child = (Parent) parent.clone();
System.out.println("P의 결과 : " + parent.getName());
System.out.println("C의 결과 : " + child.getName());
parent.setName("나는 새로운 부모의 값");
System.out.println("P의 결과 : " + parent.getName());
System.out.println("C의 결과 : " + child.getName());
}
}
[ 결과 ]
P의 결과 : 나는 부모의 값
C의 결과 : 나는 부모의 값
P의 결과 : 나는 새로운 부모의 값
C의 결과 : 나는 부모의 값
* 얇은 복사와 깊은 복사 코드 차이
- 얇은 복사 : Parent child = Parent;
- 깊은 복사 : Parent child = (Parent) parent.clone();
'programming > Java' 카테고리의 다른 글
MyBatis (0) | 2024.01.16 |
---|---|
JAVA) MyBatis와 JPA의 차이 (1) | 2021.10.05 |
JAVA) JNDI DB 연결 소스코드 (0) | 2021.01.06 |
JAVA) JDBC 동작 순서 및 DB 연결( 소스코드 포함 ) - 최종 (0) | 2021.01.06 |
JAVA) JDBC, DBCP, JNDI 차이점 (1) | 2020.12.31 |
댓글