(JVM)자바 가상머신은 메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 3개의 영역으로 구분했다.

(Method Area)(static) 변수를 저장하는 메모리 영역class Boy {
static int age = 0;
public void Run() {...}
}
Class MyMain {
public static void main(String[] agrs) {
Boy b = new Boy(); // Boy 인스턴스 생성
Boy.age += 10; // 클래스 변수에 접근
}
}
(Stack Area)public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
adder(num1, num2);
System.out.println("프로그램 종료");
}
public static void adder(int n1, int n2) {
int result = n1 + n2;
return result;
}
(args, num1, num2) , (n1, n2, result)(args, num1, num2)(n1, n2, result)(n1, n2)와 지역변수(result)가 스택에서 전부 소멸된다.(Heap Area)(Garbage Collection)이 일어나는 메모리 공간이다.🔎 인스턴스를 스택이 아닌 힙이라는 별도의 영역에 할당하는 이유가 뭘까 ?
public static void simple() {
String str1 = new String("First String")
String str2 = new String("Second String")
...
str1 = null; // 참조관계 소멸
str2 = null; // 참조관계 소멸
}
str1, str2는 참조변수이자 지역변수로 스택에 할당object 클래스의 메소드finalize 메소드 (인스턴스 소멸)protected void finalize() throws Throwable🔎 관련 예제
package ch19;
/* object클래스의 메소드 (finalize)
* 아무도 참조하지 않는 인스턴스가 가비지 컬렉션에 의해 소멸되기 전 자동으로 호출되는 메소드
* 인스턴스 소멸 시 반드시 실행해야 할 코드가 있다면 이 메소드를 오버라이딩 해서 실행 할 수 있음
*
*/
class Person {
String name;
public Person(String name) {
this.name = name;
}
// finalize 메소드 오버라이딩
@Override
protected void finalize() throws Throwable {
super.finalize(); // 상위 클래스의 finalize 메소드 호출
System.out.println("소멸 : " + name);
}
}
public class ObjectFinalizeMethod {
public static void main(String[] args) {
Person p1 = new Person("anne");
Person p2 = new Person("wuga");
p1 = null; // 참조대상을 가비지 컬렉션의 대상으로 만듦
p2 = null; // 참조대상을 가비지 컬렉션의 대상으로 만듦
// System.gc(); // 가비지 컬렉션의 수행을 요청 (명령이 아닌 요청)
// System.runFinalization(); // 소멸이 보류된 인스턴스의 finalize 메소드 호출을 요청 (명령이 아닌 요청)
System.out.println("프로그램 종료");
}
}
// 실행 결과
프로그램 종료
finalize 메소드를 호출한 결과가 나타나지 않는다.finalize 메소드의 호출을 어느정도 보장받을 수있다.System.gc();System.runFinalization();equals 메소드 (인스턴스 비교)equals 메소드에 담아 정의한다.class Inum {
private int num;
public Inum(int num) {
this.num = num;
}
@Override
public boolean equals(Object obj) {
if(this.num == ((Inum)obj).num)
return true;
else
return false;
}
}
class ObjectEqualityMethod {
public static void main(String[] args) {
Inum num1 = new Inum(10);
Inum num2 = new Inum(15);
Inum num3 = new Inum(10);
if (num1.equals(num2))
System.out.println("num1, num2 내용이 동일합니다.");
else
System.out.println("num1, num2 내용이 다릅니다.");
if (num1.equals(num3))
System.out.println("num1. num2 내용이 동일합니다.");
else
System.out.println("num1, num3 내용이 다릅니다.");
}
}
// 실행 결과
num1, num2 내용이 다릅니다.
num1. num2 내용이 동일합니다.
🔎 String 클래스의 equals 메소드
equals 메소드를 오버라이딩 하고 있다.==연산자 사용equals메소드 사용package ch19;
/* String 클래스의 Equals 메소드
* ==연산자는 참조변수의 참조값을 비교
* equals메소드는 인스턴스의 내용을 비교
*/
public class StringEqualityMethod {
public static void main(String[] args) {
String str1 = new String("Simple");
String str2 = new String("Simple");
// 참조 값을 비교
if (str1 == str2)
System.out.println("str1, str2 참조 값이 동일");
else
System.out.println("str1, str2 참조 값이 다름");
// 두 인스턴스의 내용을 비교
if (str1.equals(str2))
System.out.println("str1, str2 내용이 동일");
else
System.out.println("str1, str2 내용이 다름");
}
}
// 실행 결과
str1, str2 참조 값이 다름
str1, str2 내용이 동일
clone 메소드 (인스턴스 복사)protected Object clone() throws CloneNotSupportedExceptionobject 클래스에 정의되어 있는 clone 메소드가 호출되면 인스턴스의 복사가 이뤄진다.interface CloneableCloneNotSupportedException 예외가 발생class Point implements Cloneable { // Point가 Cloneable 인터페이스를 구현
private int xPos;
private int yPos;
public Point (int x, int y) {
xPos = x;
yPos = y;
}
public void showPostion() {
System.out.printf("[%d, %d]", xPos, yPos);
System.out.println();
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ObjectCloneMethod {
public static void main(String[] args) {
Point p1 = new Point(3,5);
Point p2;
try {
p2 = (Point)p1.clone();
p1.showPostion();
p2.showPostion();
}
catch(CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
// 실행 결과
[3, 5]
[3, 5]
clone 메소드를 호출하기 위해서는 오버라이딩을 통해 접근 수준 지시자를 protected에서 public으로 바꿔줘야 한다.clone메소드는 object클래스의 메소드로 java.lang 패키지에 있기 때문에 public으로 접근을 열어줘야 하기 때문이다.🔎 얕은 복사 (Shallow Copy)

🔎 깊은 복사 (Deep Copy)

🔎 String 인스턴스 대상의 깊은 복사
🔎 clone 메소드의 반환형 수정
class AAA {
public AAA method() {...} // 반환형이 자신이 속한 AAA클래스 형이다.
class ZZZ extends AAA {
@Override
public ZZZ methoe() {...} // 반환형이 자신이 속한 ZZZ 클래서 형이다.
}
ZZZ인 경우 반환형은 ZZZ로만 수정가능하다.