📌 자바에서 대표적인 다형성(Polymorphism) 메서드
자바에서 다형성(Polymorphism) 이란, 하나의 메서드가 여러 가지 형태로 동작할 수 있도록 하는 개념입니다.
다형성은 메서드 오버로딩(Method Overloading)과 메서드 오버라이딩(Method Overriding) 을 통해 구현됩니다.
✅ 1. toString() 메서드 (오버라이딩)
toString() 메서드는 Object 클래스에서 제공하는 메서드로, 모든 객체에서 사용할 수 있습니다.
보통 객체 정보를 문자열로 변환할 때 오버라이딩하여 사용됩니다.
📌 toString() 예제
class Animal {
@Override
public String toString() {
return "이것은 동물 객체입니다.";
}
}
class Dog extends Animal {
@Override
public String toString() {
return "이것은 강아지 객체입니다.";
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Animal();
Animal d = new Dog();
System.out.println(a.toString()); // "이것은 동물 객체입니다."
System.out.println(d.toString()); // "이것은 강아지 객체입니다."
}
}
✔ 다형성 적용: Animal 타입 변수에 Dog 객체를 할당해도 toString()이 Dog 클래스의 메서드로 동작합니다.
✔ 오버라이딩(Overriding): 부모 클래스의 toString()을 자식 클래스에서 재정의하여 다른 동작을 수행합니다.
✅ 2. equals() 메서드 (오버라이딩)
equals() 메서드는 객체의 내용이 같은지 비교할 때 사용됩니다.
기본적으로 Object 클래스에서 제공하지만, 원하는 방식으로 동작하도록 오버라이딩하여 사용할 수 있습니다.
📌 equals() 예제
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 같은 객체면 true
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // 이름과 나이가 같으면 true
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 30);
Person p2 = new Person("홍길동", 30);
System.out.println(p1.equals(p2)); // true (내용이 같으면 같다고 판단)
}
}
✔ 기본 equals()는 객체의 참조값을 비교하지만,
✔ 오버라이딩하면 객체의 내용(name, age)이 같을 경우 true를 반환
✅ 3. hashCode() 메서드 (오버라이딩)
hashCode() 메서드는 객체의 해시 값을 반환하는 메서드입니다.
보통 equals()를 오버라이딩하면, 같은 객체는 같은 hashCode()를 반환하도록 오버라이딩하는 것이 일반적입니다.
📌 hashCode() 예제
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 30);
Person p2 = new Person("홍길동", 30);
System.out.println(p1.hashCode() == p2.hashCode()); // true
}
}
✔ 오버라이딩 전 hashCode()는 참조값 기반이지만, 오버라이딩 후 객체 내용에 따라 같은 해시값을 반환
✔ equals()와 함께 재정의하면 HashMap, HashSet에서 올바르게 동작 가능
✅ 4. compareTo() 메서드 (Comparable 인터페이스 구현)
compareTo() 메서드는 객체를 비교할 때 사용됩니다.
Comparable<T> 인터페이스를 구현하고 오버라이딩하면 정렬 시 사용할 수 있습니다.
📌 compareTo() 예제 (오름차순 정렬)
import java.util.*;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // 나이를 기준으로 정렬
}
@Override
public String toString() {
return name + " (" + age + "세)";
}
}
public class Main {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("김철수", 25));
list.add(new Person("이영희", 30));
list.add(new Person("박영수", 20));
Collections.sort(list); // compareTo() 메서드 기준 정렬
System.out.println(list);
}
}
✔ compareTo()를 오버라이딩하여 나이 순으로 정렬 가능
✔ Collections.sort()를 호출하면 자동으로 compareTo() 기준으로 정렬됨
🛠 출력 결과
[박영수 (20세), 김철수 (25세), 이영희 (30세)]
✅ 5. clone() 메서드 (복제 기능)
clone() 메서드는 객체를 깊은 복사(Deep Copy) 또는 얕은 복사(Shallow Copy) 할 때 사용됩니다.
객체의 값을 복제하고 싶을 때 Cloneable 인터페이스를 구현해야 합니다.
📌 clone() 예제
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 얕은 복사 수행
}
@Override
public String toString() {
return name + " (" + age + "세)";
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person("홍길동", 30);
Person p2 = (Person) p1.clone(); // 복제
System.out.println(p1); // 홍길동 (30세)
System.out.println(p2); // 홍길동 (30세)
}
}
✔ Cloneable 인터페이스를 구현한 후 clone()을 오버라이딩해야 정상 동작
✔ 복제된 객체는 새로운 메모리 주소를 가지지만, 내부 필드는 동일
🏆 결론: 자바의 대표적인 다형성 메서드
메서드 | 설명 | 오버라이딩 여부 |
toString() | 객체를 문자열로 변환 | ✅ 가능 |
equals() | 객체 내용 비교 | ✅ 가능 |
hashCode() | 객체의 해시값 반환 | ✅ 가능 |
compareTo() | 객체 크기 비교(정렬) | ✅ 가능 |
clone() | 객체 복제(Deep Copy) | ✅ 가능 |
🚀 즉, 다형성을 활용하면 같은 메서드(toString, equals, compareTo 등)를 다양한 방식으로 구현할 수 있습니다! 😊
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
Java | 스레드 순차적으로 실행하는 법 (0) | 2025.02.04 |
---|---|
힙 메모리 부족 문제 (0) | 2025.02.04 |
스레드에서 생성된 메모리 영역은 다른 스레드에서 접근 가능할까? (0) | 2025.02.04 |
JAVA | 뮤텍스(Mutex) vs 세마포어(Semaphore) (0) | 2025.02.03 |
Java | 힙(Heap)과 스택(Stack) 메모리 (0) | 2025.02.03 |