✔메모리 영역(Method Area)
메소드의 바이트코드와 static 변수와 static이 할당되는 메모리 공간.
이 영역에 저장된 내용은 프로그램 종료 시 소멸된다.
✔스택 영역(Stack Area)
지역변수, 매개변수가 할당되는 영역.
작은 데이터 저장되는 곳.
이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다.
➡ LIFO(Last In First Out)의 구조
✔힙 영역(Heap Area)
참조형 데이터 타입을 갖는 객체(인스턴스), 배열등이 저장되는 영역.
객체를 생성 시 객체가 저장되는 곳.
가비지 컬렉터의 대상이 되는 영역이다.
public static void main(String[] args) {
String s1 = new String("아아아");
String s2 = new String("아아아");
if(s1.equals(s2)) {
System.out.println("true");
}else {
System.out.println("false");
class INum extends Object {
private int num;
public INum(int num) {
this.num = num;
}
public boolean equals(Object obj) {
if (this.num == ((INum) obj).num)
return true;
else
return false;
}
}
public class Equalrs1 {
public static void main(String[] args) {
INum num1 = new INum(10);
INum num2 = new INum(12);
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, num3 내용 동일하다.");
else
System.out.println("num1, num3 내용 다르다");
}
}
[결과]
num1, num2 내용 다르다
num1, num3 내용 동일하다.
위의 예제에서
public boolean equals(Object obj) { if (this.num == ((INum) obj).num) return true; else return false; }
를 주석처리 안해도 돌아가는 이유, 원리는?
class INum extends Object {
private int num;
public INum(int num) {
this.num = num;
}
public class Equalrs1 {
public static void main(String[] args) {
INum num1 = new INum(10);
INum num2 = new INum(12);
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, num3 내용 동일하다.");
else
System.out.println("num1, num3 내용 다르다");
}
}
[결과]
num1, num2 내용 다르다
num1, num3 내용 다르다
모든 클래스는 Object클래스를 상속받고 있고, INum클래스도 물론 Object클래스의 변수를 불러올 수 있고, 함수를 호출할 수 있다.
INum클래스안의 기능(내용)들은 직접 우리가 구현을 하기 때문에 equals메소드를 오버라이딩 하지 않고, main함수에서 호출을 하면 자동으로 Object클래스의 equals메소드 기능을 사용하게된다.
class Person {
private String name;
Person(String name) {
this.name = name;
}
public boolean equals(Object obj) {
if (this.name.equals(((Person) obj).name))
// 형 변환 (자기(자식)꺼 아니라서) // 문자열 비교라서 ==사용하면 안된다
return true;
else
return false;
}
}
public class Equals2 {
public static void main(String[] args) {
Person p1 = new Person("홍길동");
System.out.println(p1.equals(new Person("홍길동")));
System.out.println(p1.equals(new Person("최명태")));
}
}
기본 자료형 타입(Primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스라고 한다.
박싱은 기본 자료형의 데이터를 래퍼 클래스의 객체로 만드는 과정이다.
ex) int ➡ Integer (박싱)
📌박싱 방법
✔new연산자를 이용하여 생성하는 방법
표 출처
기본 자료형에는 wrapper클래스에 해당되는 기본 자료형의 데이터가 와야 된다.
✔valueOf( )메소드를 이용하는 방법
래퍼 클래스에서 static으로 제공하는 valueOf( )메소드를 사용하여 래퍼 클래스를 생성한다.
언박싱은 레퍼 클래스의 데이터를 기본 자료형으로 얻어내는 과정이다.
ex) Integer ➡ int (언박싱)
📌언박싱 방법
각 래퍼 클래스에서 갖고 있는 메소드를 사용하면 된다.
메소드는 기본 자료형ValueOf(); 형태로 되어있다.
ex) byteValueOf(); / intValueOf();
String s1 = new String("java"); String s2 = new String("java"); String s3 = s2; System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(s2 == s3); System.out.println(s2.equals(s3)); if(s1 == s2) System.out.println("s1, s2 참조 대상 같다."); else System.out.println("s1, s2 참조 대상 다르다. "); if(s2 == s3) System.out.println("s2, s3 참조 대상 같다."); else System.out.println("s2, s3 참조 대상 다르다. "); if(s1.equals(s2)) System.out.println("s1, s2 내용 동일하다."); else System.out.println("s1, s2 내용 다르다."); if(s2.equals(s3)) System.out.println("s2, s3 내용 동일하다."); else System.out.println("s2, s3 내용 다르다."); } }
[결과]
s1, s2 참조 대상 다르다.
s2, s3 참조 대상 같다.
s1, s2 참조 대상 같다.
s2, s3 참조 대상 같다.
s1와 s2의 내용("java")는 같지만, 따로 객체를 생성했기 때문에 참조 값(주소 값)은 다르다. ➡ ==연산자의 결과는 false
s2와 s3는 같은 객체를 가리키고 있기 때문에 참조 값이 같고, 내용도 같다. ➡ ==연산자와 equals()의 결과는 true