그렇다면 스택영역과 힙역역을 왜 구지 나누었을까?
-> 그 이유는 인스턴스 소멸시기와 지역변수 소멸시기가 다르기 때문이다.
* Object 클래스
- finalize 메소드
모든 Object 클래스에는 finalize 메소드가 있다. 이 finalize메소드는 함수가 소멸되기 전에 반드시 실행되어야하는 코드다.
인스턴스를 지칭하는 참조변수가 사라진다고해서
바로 사라지는 것은 아니다. 너무 빈번하게 일어나면 프로그램 성능에 문제가 될 수 있기 때문이다.
그래서 finalize를 인스턴스가 사라질때 반드시 실행시키고 싶다면,
System.gc();
System.runFinalization();
이 코드를 적어주면 된다.
- equals 메소드
== 연산자는 참조변수의 참조 값을 비교한다.
문제 19-1
equals 메소드를 삽입해 참조 내용을 비교해보자.
(equal 오버라이딩)
(equal 오버라이딩)
(비교 코드)
(실행 화면)
* 인스턴스 복사 clone
인스턴스를 복사하기 위한 메소드가 정해져있다.
protected Object clone() throws CloneNotSupportedException
이란 메소드로 정해져있다.
이 메소드를 쓰기위해서는 Cloneable 인터페이스를 구현해야한다.
왜냐하면 프로그래밍을 하다보면 복사에 민감한, 인스턴스들도 있다. 그런것과 복사해도 되는 것을 구별하기 위해서 표현하기 위해서
Cloneable 인터페이스를 구현하는지를 확인한다.
여기서 중요한건 clone으로 복사되는데
그 안의 변수들도 복사가 된다.
하지만 그 인스턴스 내부의 인스턴스는 복사되지 않으니 같은 참조값으로써 복삭가 된다.
결론적으로 말하면
인스턴스를 완전히 복사하기 위해서는
내부 인스턴스들 또한 같이 복사해줘야한다.
문제 19-2를 보면 이해가 될것이다.
(Business 클래스 복사)
(PersonalInfo를 복사하고 그 내부의 Business 클래스 복사)
이렇게 내부도 복사해주어야
중간에 값을 변경해도 다른 복사본에 영향을 주지 않는다.
(복사 후 내부 문자열을 바꾸는 내용)
(실행화면)
내부 문자열을 변경했어도 복사본에 영향이 없음을 확인 할 수 있다.
(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)
'Programing > JAVA 일지' 카테고리의 다른 글
JAVA(12일차) - (2) 제네릭(Generics) (0) | 2016.12.23 |
---|---|
JAVA(12일차) - (1)Wrapper, BIgInteger, BigDecimal, 난수 생성 함수, 문자열 토큰 (0) | 2016.12.23 |
JAVA(10일차) - (2) 예외처리 (0) | 2016.12.22 |
JAVA(10일차) - (1) abstract, interface, inner class, 전화번호관리 프로그램(05) (0) | 2016.12.21 |
JAVA(9일차) - (2) 전화번호 관리 프로그램4 (0) | 2016.12.11 |