1. JVM의 메모리

메모리 영역(Method Area)
메소드의 바이트코드와 static 변수와 static이 할당되는 메모리 공간.
이 영역에 저장된 내용은 프로그램 종료 시 소멸된다.

스택 영역(Stack Area)
지역변수, 매개변수가 할당되는 영역.
작은 데이터 저장되는 곳.
이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다.
LIFO(Last In First Out)의 구조

힙 영역(Heap Area)
참조형 데이터 타입을 갖는 객체(인스턴스), 배열등이 저장되는 영역.
객체를 생성 시 객체가 저장되는 곳.
가비지 컬렉터의 대상이 되는 영역이다.

2. equals메소드

2-1. String클래스의 equals메소드

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");
		
  • String클래스(Object클래스를 상속받고 있는)의 오버라이딩 된 equals메소드 사용.
  • String클래스로 선언하면 String클래스의 equals메소드 기능을 사용하기 때문에 문자열 비교를 한다.

2-2. Object클래스의 equals메소드

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 내용 동일하다.
  • Object클래스의 기본 equals메소드의 기능을 우리가 오버라이딩 하였기 때문에 주소값이 아니라 내용을 비교한다.

위의 예제에서

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메소드 기능을 사용하게된다.

2-3. 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("최명태")));
	}

}

3. 래퍼(Wrapper) 클래스

기본 자료형 타입(Primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스라고 한다.

3-1. 래퍼 클래스의 종류

  • java.lang 패키지에 포함되어 있다.

3-2. 래퍼 클래스의 구조

  • 래퍼 클래스의 조상은 Object클래스.
  • Boolean클래스과 Character클래스 이외의 래퍼 클래스는 Number클래스를 상속받고 있다.

4. 박싱 / 언박싱

4-1. 박싱(boxing)

박싱은 기본 자료형의 데이터를 래퍼 클래스의 객체로 만드는 과정이다.
ex) int ➡ Integer (박싱)

📌박싱 방법
new연산자를 이용하여 생성하는 방법

표 출처

기본 자료형에는 wrapper클래스에 해당되는 기본 자료형의 데이터가 와야 된다.

valueOf( )메소드를 이용하는 방법
래퍼 클래스에서 static으로 제공하는 valueOf( )메소드를 사용하여 래퍼 클래스를 생성한다.

4-2. 언박싱(un-boxing)

언박싱은 레퍼 클래스의 데이터를 기본 자료형으로 얻어내는 과정이다.
ex) Integer ➡ int (언박싱)

📌언박싱 방법
각 래퍼 클래스에서 갖고 있는 메소드를 사용하면 된다.
메소드는 기본 자료형ValueOf(); 형태로 되어있다.
ex) byteValueOf(); / intValueOf();

4-3. 기타

  • 래퍼 클래스에 대입된 값은 ==, != 과 같은 연산자를 이용하여 값의 비교가 불가능.
    ➡ 인스턴스를 생성하면서 heap메모리에 값이 저장되고 객체 변수는 참조 값을 갖기 때문이다.
  • equals()메소드를 이용하거나 데이터를 언박싱하여 값을 비교해야 된다.

5. 다음 출력 결과를 예측하고 그렇게 되는 이유를 설명하시오.

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

0개의 댓글

Powered by GraphCDN, the GraphQL CDN