자바 언어로 우테코 5기 프리코스 1주차 미션을 진행하면서
여러 궁금증이 생겨서 공부하다가 새로 알게 된 점을 공유하고자 한다.
위 포스팅에서도 아래 내용을 정리했지만, 배운점만 따로 깔끔하게 보고 싶어서 새로 포스팅도 작성한다.
int는 null값을 가질 수 없고 Integer는 null값을 가질 수도 있다.
그래서 Integer는 언박싱을 안하면 연산을 할 수 없다. (자바에선 대부분 자동으로 해준다)
그리고 int는 4바이트고 Integer는 16바이트라서 메모리를 더 사용한다.
쉽게 말하면 == 연산은 주소를 비교하고 equals()는 주소도 비교하고 다르면 값도 비교한다.
좀 더 자세하게 말하면
== 연산은 int,boolean primitive type에 대해서는 값을 비교하고 reference type에 대해서는 주소값을 비교한다.
String은 객체니까 reference type이므로 ==를 사용하면 주소를 비교하게 된다.
String 객체의 equals()는 변수로 들어온 객체가 자기 자신과 주소값이 같으면 true를 리턴한다.
주소값이 다르다면 내부의 Char를 하나씩 비교해 보면서 끝까지 같다면 true, 다르면 false를 리턴한다.
참고로, equals()는 Object타입에서는 ==연산을 사용하는데 String객체에서만 이렇게 오버라이딩한 것이다.
그래서 코드로 설명하면 아래와 같다.
public static void main(String[] args){
Stirng A = "Java"; // 리터럴(literal) 주소값 : 1000
Stirng B = "Java"; // 리터럴(literal) 주소값 : 1000
Stirng C = new Stirng("Java"); // new 연산자 주소값 : 2000
Stirng D = new Stirng("Java"); // new 연산자 주소값 : 3000
}
리터럴(literal)을 사용해서 String을 생성하면 객체가 String Constant Pool 영역에 만들어지고,
new 연산자를 통해 String을 생성하면 Heap 영역에 만들어진다.
그래서 A와 B는 String Constant Pool 영역에 만들어진 하나의 객체를 참조하고,
C와 D는 Heap 영역에 각각 개별의 객체가 생성된다.
즉, 객체 개수는 A와 B 합쳐서 1개 + C 1개 + D 1개 = 총 3개가 나온다.
그림으로 표현하면 이렇게 된다.
System.out.println( A == B ); // true 주소값 : 1000 == 1000
System.out.println( B == C ); // false 주소값 : 1000 == 2000
System.out.println( C == D ); // false 주소값 : 2000 == 3000
그래서 == 연산을 사용하면 결과가 이렇게 나오게 되는 것이다.
하지만 equals()같은 경우에는 값도 비교하기 때문에 모두 true를 반환한다.
참고로 링크드 리스트와 배열의 차이점에 대해 이전에 포스팅한 적이 있으니 이걸 참고해도 좋을 것 같다.