Java / / 2024. 7. 5. 17:19

Interface, Type Casting, and the Power of hashCode & equals

📜 Interface: 소프트웨어의 계약서

 

소프트웨어 엔지니어링에서 인터페이스는 서로 다른 프로그래머 그룹이 소프트웨어가 상호 작용하는 방식을 설명하는 **“계약(Contract)”**입니다. 이를 통해 각 그룹은 다른 그룹의 코드가 어떻게 작성되는지 알 필요 없이 자신의 코드를 독립적으로 작성할 수 있습니다.

 

예를 들어, 미래의 자율주행 로봇 자동차를 생각해봅시다. 자동차 제조업체는 차량을 제어하는 소프트웨어를 작성하고, 다른 업체는 자동차를 유도하는 시스템을 개발합니다. 이때 자동차 제조업체는 인터페이스를 통해 차량의 제어 방법을 공개해야 합니다. 이를 통해 다른 그룹은 이 인터페이스를 기반으로 자신의 소프트웨어를 작성할 수 있습니다.

 

📌 주요 개념:

 

Interface는 계약서: 다른 그룹의 코드 구현을 알 필요 없이 기능을 이용할 수 있게 해줍니다.

추상화(Abstraction): 구현 세부사항은 숨기고, 계약서에 명시된 메서드만 제공합니다.

 

🛠️ Java에서의 인터페이스

 

자바에서 인터페이스는 클래스와 유사한 참조 타입으로, 상수, 메서드 시그니처, 디폴트 메서드, 정적 메서드, 중첩 타입만을 포함할 수 있습니다. 인터페이스는 추상 메서드로 기능의 골격을 제공하며, 이를 구현하는 클래스가 실제 로직을 정의합니다.

public interface OperateCar {
   int turn(Direction direction, double radius, double startSpeed, double endSpeed);
   int changeLanes(Direction direction, double startSpeed, double endSpeed);
   int signalTurn(Direction direction, boolean signalOn);
}

 

추상 메서드: 바디가 없는 메서드 선언만 존재합니다.

클래스는 하나만 상속 가능하지만, 인터페이스는 여러 개 구현할 수 있습니다.

 

🔄 Serializable 인터페이스

 

Serializable은 객체를 직렬화(Serialization) 하여 바이트 스트림으로 변환하거나, 다시 역직렬화(Deserialization) 할 수 있게 해주는 자바의 인터페이스입니다. 이 인터페이스는 마커 인터페이스로, 메서드를 포함하지 않으며 객체가 직렬화 가능하다는 표식 역할을 합니다.

 

🔄 형변환 (Type Casting)

 

자바에서 형변환은 데이터 타입을 변환하는 작업을 의미합니다. 형변환은 두 가지로 나뉩니다:

 

1. 명시적 형변환 (Explicit Type Casting)

큰 데이터 타입을 작은 데이터 타입으로 변환할 때 사용됩니다.

예: doubleint로 변환

double d = 9.7;
int i = (int) d; // 결과는 9 (소수점 이하 버림)

 

2. 묵시적 형변환 (Implicit Type Casting)

작은 데이터 타입을 큰 데이터 타입으로 자동 변환됩니다.

예: intdouble로 변환

int i = 10;
double d = i; // 결과는 10.0

 

📌 주의사항:

 

데이터 손실: 명시적 형변환 시 데이터 손실 가능성에 주의해야 합니다.

형변환 가능 여부: 호환되지 않는 타입 간의 형변환은 컴파일 오류를 발생시킵니다.

 

🛠️ of 메서드

 

Java 8에서 도입된 of 메서드java.time 패키지에서 주로 사용되며, 클래스 인스턴스를 생성하는 정적 팩토리 메서드입니다.

 

장점:

 

명확성: 인스턴스 생성을 간결하고 명확하게 합니다.

불변성: Java 8의 날짜 및 시간 API 클래스들은 대부분 불변 객체로 설계되어 있습니다.

유효성 검사: 입력 값의 유효성을 검사하여 잘못된 인스턴스 생성을 방지합니다.

 

🛠️ 디폴트 메서드 (Default Method)

 

Java 8에서 추가된 디폴트 메서드는 인터페이스에 메서드 구현을 포함할 수 있게 합니다. 이를 통해 기존 인터페이스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.

 

디폴트 메서드의 특징:

 

1. 메서드 구현 포함: 클래스에서 재정의하지 않아도 사용 가능합니다.

2. 인터페이스의 확장성 증가: 기존 코드 호환성을 유지하며 인터페이스를 확장할 수 있습니다.

3. 다중 상속 지원: 여러 인터페이스의 동일 메서드 충돌을 해결합니다.

 

🔍 hashCode와 equals 메서드

 

자바에서 hashCodeequals는 객체의 동등성해시 코드를 결정하는 데 중요한 역할을 합니다.

 

📌 hashCode 규약:

 

1. 일관성: 같은 객체에 대해 여러 번 호출해도 동일한 결과 반환.

2. 동등한 객체: equals가 true면, hashCode도 같아야 합니다.

3. 해시 코드 불일치: 다른 객체의 해시 코드가 같을 수 있습니다.

 

 

 

📌 equals 규약:

 

1. 반사성: x.equals(x)는 항상 true.

2. 대칭성: x.equals(y)가 true면, y.equals(x)도 true.

3. 추이성: x.equals(y)와 y.equals(z)가 true면, x.equals(z)도 true.

4. 일관성: 객체 변경이 없다면 equals 결과도 일관적이어야 합니다.

5. null 비교: x.equals(null)는 항상 false.

 

이렇게 인터페이스, 형변환, Serializable 등 자바의 다양한 기능과 메서드를 활용하여 코드를 더 구조적이고 효율적으로 만들 수 있습니다. 🛠️

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유