인터페이스(Interface)
다른 클래스들이 구현해야 하는 메서드들을 정의하는 추상 타입입니다. 인터페이스는 클래스가 제공해야 하는 행동의 규약을 정의하며, 클래스와 달리 인터페이스 자체는 구현을 포함하지 않습니다. 자바의 인터페이스는 다중 상속을 우회하는 방법으로 많이 사용됩니다.
단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 합니다.
이 부분은 모든 인터페이스에 공통으로 적용되는 부분이므로 이 제어자는 생략할 수 있습니다.
이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해 줍니다.
인터페이스의 특징
- 추상 메서드: 인터페이스는 기본적으로 구현 없이 메서드 시그니처만을 가집니다. 자바 8부터는 디폴트 메서드와 정적 메서드를 통해 인터페이스 내에서 구현을 포함할 수도 있습니다.
- 다중 상속: 자바는 클래스의 다중 상속을 지원하지 않지만, 인터페이스는 여러 개를 구현할 수 있습니다.
- 상수: 인터페이스 내에 선언된 변수는 자동으로 public, static, final입니다.
- 디폴트 메서드: 자바 8부터는 default 키워드를 사용하여 인터페이스 내에서 메서드의 기본 구현을 제공할 수 있습니다.
- 정적 메서드: 자바 8부터 인터페이스에 static 메서드를 정의할 수 있습니다.
- 프라이빗 메서드: 자바 9부터 인터페이스에 private 메서드를 정의할 수 있으며, 이는 인터페이스 내의 다른 메서드들에 의해 호출될 수 있습니다.
디폴트 메서드 ( Default Methods )
디폴트 메서드는 인터페이스에서 메서드의 기본 구현을 제공하는 기능입니다. 이를 통해 기존 인터페이스에 새로운 메서드를 추가하더라도, 해당 인터페이스를 구현한 기존 클래스들이 변경 없이도 컴파일될 수 있습니다.
디폴트 메서드의 장점
- 하위 호환성: 기존 인터페이스에 새로운 메서드를 추가할 때, 해당 인터페이스를 구현한 모든 클래스들을 변경하지 않고도 새로운 메서드를 추가할 수 있습니다.
- 코드 재사용: 여러 인터페이스에서 공통적으로 사용할 수 있는 메서드 구현을 제공할 수 있습니다.
- 디폴트 메서드는 인터페이스에 메서드의 기본 구현을 제공하는 기능입니다.
- 장점: 하위 호환성을 유지하고 코드 재사용을 촉진합니다.
- 재정의 가능: 클래스에서 디폴트 메서드를 재정의할 수 있습니다.
- 다중 상속 문제 해결: 다중 상속 시 디폴트 메서드 충돌을 해결해야 합니다.
인터페이스 앞에 public을 붙이지 않으면 기본 접근 제어자인 패키지 프라이빗 (default) 접근 제어자가 적용되어 동일 패키지 내에서만 접근할 수 있습니다. 반면, public을 붙이면 모든 패키지에서 접근 가능하게 됩니다.
- public 인터페이스: 모든 패키지에서 접근 가능.
- default 인터페이스: 동일 패키지 내에서만 접근 가능
클래스는 패키지프라이빗인데 헷갈리지않기
Relatable 인터페이스
Relatable 인터페이스 정의
public interface Relatable {
// 두 객체를 비교하여 결과를 반환
// this 객체가 other 객체보다 크면 1, 같으면 0, 작으면 -1을 반환
int isLargerThan(Relatable other);
}
Rectangle 클래스에 Relatable 인터페이스 구현
Rectangle 클래스는 Relatable 인터페이스를 구현하고, 면적을 기준으로 비교합니다.
public class Rectangle implements Relatable {
private int width;
private int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
// 면적을 계산하는 메서드
public int getArea() {
return width * height;
}
// Relatable 인터페이스의 메서드 구현
@Override
public int isLargerThan(Relatable other) {
if (other instanceof Rectangle) {
Rectangle otherRectangle = (Rectangle) other;
return Integer.compare(this.getArea(), otherRectangle.getArea());
} else {
throw new IllegalArgumentException("Invalid type");
}
}
}
Rectangle 객체를 생성하고 isLargerThan 메서드를 사용하여 비교합니다.
public class Main {
public static void main(String[] args) {
Rectangle rect1 = new Rectangle(5, 10);
Rectangle rect2 = new Rectangle(3, 15);
System.out.println("Area of rect1: " + rect1.getArea()); // 50
System.out.println("Area of rect2: " + rect2.getArea()); // 45
int comparisonResult = rect1.isLargerThan(rect2);
if (comparisonResult > 0) {
System.out.println("rect1 is larger than rect2.");
} else if (comparisonResult == 0) {
System.out.println("rect1 is equal to rect2.");
} else {
System.out.println("rect1 is smaller than rect2.");
}
}
}
- Relatable 인터페이스:
- isLargerThan 메서드를 정의하여 두 객체를 비교합니다.
- Rectangle 클래스:
- Relatable 인터페이스를 구현합니다.
- 면적을 계산하는 getArea 메서드를 제공합니다.
- isLargerThan 메서드를 구현하여 다른 Rectangle 객체와 면적을 비교합니다.
- Main 클래스:
- 두 개의 Rectangle 객체를 생성하고 면적을 비교합니다.
- isLargerThan 메서드를 사용하여 비교 결과를 출력합니다.
해시 함수(Hash Function)
데이터를 고정된 크기의 값으로 매핑하는 함수입니다. 해시 함수는 데이터의 빠른 검색, 저장, 삭제를 가능하게 하는 중요한 도구로, 해시 테이블, 해시 맵, 디지털 서명, 데이터 무결성 검사 등 여러 분야에서 사용됩니다.
해시 함수의 주요 특징
- 결정성(Deterministic): 동일한 입력에 대해 항상 동일한 출력을 생성합니다.
- 빠른 계산(Fast computation): 해시 값 계산이 빠릅니다.
- 고정된 크기 출력(Fixed-size output): 입력 데이터의 크기와 상관없이 고정된 크기의 해시 값을 반환합니다.
- 균등 분포(Uniform distribution): 가능한 한 해시 값이 고르게 분포되도록 생성합니다.
- 충돌 최소화(Collision minimization): 서로 다른 입력이 동일한 해시 값을 갖는 경우(충돌)를 최소화하려고 노력합니다.
자바에서 해시 함수 사용 예제
자바에서는 hashCode() 메서드를 사용하여 해시 값을 계산합니다. hashCode() 메서드는 모든 객체의 슈퍼 클래스인 Object 클래스에 정의되어 있습니다. 이를 오버라이드하여 사용자 정의 클래스에 적합한 해시 값을 생성할 수 있습니다.
해시 코드 (hashcode)
객체 hashcode란 객체를 식별하는 하나의 고유 정수값을 말한다.
타입 캐스팅(Type Casting)
자바에서 변수의 타입을 다른 타입으로 변환하는 것을 의미합니다. 자바에서는 두 가지 주요 타입 캐스팅이 있습니다: **업캐스팅(Upcasting)**과 다운캐스팅(Downcasting). 또한, 자바에서는 자동(암시적) 타입 변환과 수동(명시적) 타입 변환도 있습니다.
업캐스팅(Upcasting)
업캐스팅은 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것입니다. 이는 암시적으로 수행되며, 명시적으로 캐스팅을 작성할 필요가 없습니다.
다운캐스팅(Downcasting)
다운캐스팅은 상위 클래스 타입을 하위 클래스 타입으로 변환하는 것입니다. 이는 명시적으로 수행되며, 명시적 캐스팅이 필요합니다. 또한, 다운캐스팅 전에 해당 객체가 실제로 하위 클래스 타입인지 확인하는 것이 중요합니다.
결론
- 업캐스팅(Upcasting): 하위 클래스 객체를 상위 클래스 타입으로 변환. 암시적으로 수행됨.
- 다운캐스팅(Downcasting): 상위 클래스 타입을 하위 클래스 타입으로 변환. 명시적 캐스팅 필요. instanceof 연산자를 사용해 안전하게 수행할 수 있음.
- 기본 데이터 타입 캐스팅: 작은 크기의 타입을 큰 크기의 타입으로 자동 변환(암시적). 큰 크기의 타입을 작은 크기의 타입으로 변환할 때 명시적 캐스팅 필요.
타입 캐스팅
타입 캐스팅이 안되는 경우
해시코드, comparable, 리스트 인터페이스
해쉬펑션 -> keys를 받아서 해쉬펑션 알고리즘을 통해서 해쉬값이 만들어진다 해쉬값 = 버킷테이블에서 인덱스의 값이 생성
(리스트처럼 생겼지만 리스트는 아님)
중복된 아이디를 만들어낼수도있음…
ed9d034-True equals 값을 비교해서 같으면 True
오브젝트클래스에 이퀄스 메서드를 오버라이드한 이후에 리팩토링
이퀄스 메서드를 수정하지않는 이상 계속 해쉬코드는 동일하다.
두개의 오브젝트를 비교해서 동일해서 true라고 나온경우 둘의 해쉬코드를 비교해본 결과 같다 !