동일성 : 같은 메모리 주소 , 동등성 : 같은 내용
동일성: 두 객체가 완전히 같은 메모리 주소를 가리킬 때를 의미합니다. 즉, 실제로 같은 객체일 때 동일성이 성립합니다.
동등성: 두 객체의 내용이 같을 때를 의미합니다. 같은 내용을 가진 서로 다른 객체일 수 있습니다.
예를 들어, DVD 두 장이 있을 때, 같은 영화 내용을 담고 있다면 두 DVD는 동등하다고 볼 수 있습니다. 하지만, 각각 다른 물리적 디스크라면 동일한 객체는 아닙니다.
== : 동일성 비교, equals( ) : 동등성 비교
==: 동일성을 비교하는 연산자입니다. 객체의 메모리 주소를 비교하기 때문에, 실제로 같은 객체를 가리킬 때만 true를 반환합니다.
equals(): 보통 동등성을 비교할 때 equals 메서드를 오버라이딩하여 사용하는 경우가 많습니다.
따라서 ==는 객체 자체가 같은지 확인하고, equals( )는 객체의 내용이 같은지를 확인한다고 이해할 수 있습니다.
hashCode()는 객체를 빠르게 검색하기 위한 고유 정수 값을 생성하는 메서드입니다.
hashCode(): 객체의 해시값을 반환합니다. 두 객체가 같은지 여부를 빠르게 확인하기 위해 해시코드를 사용하고, 동등한 객체는 같은 해시코드를 가져야 합니다.
equals(): 객체의 동등성을 비교합니다. ( 두 메서드 모두 객체가 동등한지 여부를 판단하는 데 사용됩니다.)
두 메서드를 함께 재정의해야 일관성을 유지하고 중복을 방지할 수 있습니다.
또, 해시 기반 컬렉션에서 데이터의 저장과 검색이 해시 코드에 의존하기 때문입니다.
equals만 재정의하면, 해시 기반 컬렉션(HashMap, HashSet 등)에서는 다른 hashCode로 인식하여 중복 저장될 수 있습니다. ( 비교하려는 객체의 hashCode() 가 재정의되어 있지 않다면, 객체의 고유한 주소 값을 반환하는 Object.hashCode() 가 적용되기 때문에 두 객체는 다른 객체라고 판단하게 됩니다. )
논리적으로 같은 객체가 서로 다른 hashCode() 값을 가질 수 있습니다.
주로 toString을 오버라이딩하여 객체의 상태를 쉽게 확인할 수 있는 형식으로 반환한다.
toString() 메서드는 객체의 정보를 문자열로 표현할 때 사용됩니다.
예를 들어, Person 클래스에 toString()을 오버라이딩해 이름과 나이를 문자열로 반환하게 만들면, 디버깅이나 로그 확인 시 유용하게 객체 정보를 출력할 수 있습니다.
Java의 main 메서드는 static으로 선언되어있다.
따라서 객체를 생성하지 않고도 JVM이 바로 호출할 수 있습니다. 이를 통해 프로그램 시작 시 별도의 객체 생성 없이도 main 메서드를 통해 바로 실행할 수 있게 됩니다.
상수 : 변경할 수 없도록 고정된 변수, 리터럴 : 코드에 직접 입력한 값.
상수(Constant)는 final 키워드를 사용해 값을 변경할 수 없도록 고정한 변수로, final int MAX_VALUE = 100;과 같이 선언됩니다.
상수를 사용하면 값이 의도치 않게 변경되는 것을 방지하고, 코드에 의미를 부여해 가독성을 높일 수 있습니다.
리터럴(Literal)은 코드에서 직접 입력한 값으로, int number = 10;에서 10이 리터럴에 해당합니다.
Java의 타입은 크게 두 가지이다.
Primitive Type(byte): byte(1) short(2) int(4) long(8) float(4) double(8) char(2) boolean (1) 과 같은 원시 타입으로, Stack 메모리에 값 자체가 저장됩니다.
Reference Type: 객체나 배열 등으로, Heap에 객체가 저장되고 Stack에는 객체의 메모리 주소가 저장됩니다. 특히, String은 Reference Type으로 값이 변경되면 새로운 객체를 생성하고, 참조하는 주소도 변경됩니다.
Java는 Call by Value 방식이다.
Primitive Type은 값 자체를 복사해 전달하고, Reference Type은 객체의 주소를 복사해 전달합니다.
Reference Type은 참조 값이 복사되기 때문에 메서드 내부에서 객체의 속성을 변경하면 원본 객체에 영향을 미칠 수 있지만, 참조 자체(객체의 주소)를 변경하면 메서드 내에서만 적용되고, 원본에는 영향을 미치지 않습니다. 다시말해 참조 값을 복사하여 전달하므로 Call by Value 방식입니다.
직렬화는 객체의 상태를 저장하거나 전송하기 위해 바이트 형태로 변환하는 과정이다.
네트워크 전송이나 파일 저장 시 객체를 직렬화해 데이터를 저장하거나 전송하고, 이를 다시 객체로 변환하는 과정을 역직렬화라고 합니다.
직렬화는 Serializable 인터페이스를 통해 구현됩니다.