220713 TIL 안다고 착각하지 말자

오늘은 짝프로그래밍 하면서 느낀 점들을 써보려고 한다. 오늘 짝프로그래밍으로 만드는 주제는 마카오뱅크였다. 

매일 하는 짝프로그래밍이지만 오늘 짝프로그래밍은 동료분의 끝없는 질문이 나의 말문을 막히게 했다.

"이거는 왜 이렇게 쓰이죠?", "이거는 왜 그런가요?" 등등 코드에 대해 이해를 할 수 있어야만 대답할 수 있는 질문들을 계속 받았다. 사실 마카오뱅크의 코드를 이해하기보다는 외웠기 때문에 저 질문에 답을 명확하게 할 수 없었다.

 

만약 동료분이 질문을 해주지 않았다면 나는 매일 반복 인출 학습으로 코드를 외웠기 때문에 코드를 치면서 안다고 착각했을것이 분명하다.

하지만 동료분이 질문을 해서 질문에 대한 대답을 못하는 나를 보고 이 코드에 대해서 모르고 있다는 것을 인지할 수 있었다.  우리가 매일 짝프를 하는 이유 중 하나도 서로 질문을 함으로써 알고 있는지 모르고 있는지 계속 메타인지를 하는 게 핵심이라고 생각한다.

 

모르는걸 인지했으면 공부를 해야지!

 

equals메서드에 대한 개념 정리

우선 내가 기존에 알던 equals메서드는 두 객체의 내용이 같은지 비교를 해서 같으면 true 다르면 false를 리턴한다.

String name1 = "seungjun";
String name2 = "seungjun";

System.out.println(name1.equals(name2));

// 실행 결과
true

name1의 값도 "seungjun"이고 name2의 값도 "seungjun"이라 같은 것으로 판단해 true를 반환한다.

결국 비교하는 값이 똑같은 모양이면 같다고 판단한다고 볼 수 있다.

 

근데 마카오뱅크의 equals는 내가 아는 equals랑 달라서 약간 혼돈을 일으켰다.

밑에 마카오 뱅크의 사용 예시를 보자

transaction1과 transaction2는 "잔액",1000으로 똑같다.

그래서 equals를 써서 둘이 비교하면 당연히 같다고 나올 줄 알았는데..

둘이 다르다고 나온다. 

transaction1은 models.Transaction@1e1a0406

transaction2는 models.Transaction@3cebbb30 이 나와서 둘의 주소 값이 다르다는 것을 볼 수 있다.

근데 equals는 주소 값을 비교하는 게아니라 값 그자체를 비교하는게 아니었나??

 

그래서 찾아보니까 Object클래스의 equals메서드와 String클래스의 equals메서드가 다르게 작동하는 것을 알 수 있었다.

 

Objcet.equals()

Object클래스의 equals메서드는 객체의 주소를 비교한다.

 

위 예시처럼 같은 값을 가진 객체를 비교해도 생성할 때 주소가 다르게 부여되기 때문에 주소가 달라서 테스트는 실패한다.

 

String.equals()

String 객체를 비교할 때 쓰는 equals 메서드는 값 자체를 비교하기 때문에 주소가 달라도 문자열이 같으면 같다고 판단한다.

그 이유는 String을 비교할때 쓰는 equals메서드는 객체의 값이 같으면 같다고 판단하게 Override(재정의)되어 있기 때문이다.

 

결국에는 Object 클래스에서 equals메서드를 사용할 때 주소 값을 비교하고 싶은 게 아니라 값 그 자체를 비교하고 싶을 때는 Override를 해줘야 한다. 그래서 마카오 뱅크에서도 주소값을 비교하는게 아니라 값 자체를 비교하기 위해 Override를 해주는 것을 알 수 있다.

 

 

 

만일 오늘 짝프할때 동료분이 equals에 대해서 물어봐주지 않았다면 알고 있다고 착각해서 따로 시간 내서 equals를 공부하지 않았을 것이다.

 

계속해서 내가 알고 있는지 모르고 있는지 메타인지를 하는 게 정말 중요한 것 같다. 

의미 없이 완성물만 만드는 짝프를 하지말고 알고있다고 생각하는 것들도 다시 한번 확인하는 시간으로 활용을 하자

 

내일도 짝프를 할텐데 동료분들에게 많은 질문 던져가면서 짝프를 하자!

받아라 질문!