# 다형성, 오버로딩/오버라이딩, equals/hashCode
자바에서 객체 지향 프로그래밍을 이해하기 위해 알아야 할 개념 중 하나가 다형성(Polymorphism)이다.
다형성을 이해하면 메서드 재사용과 코드 확장을 더 효율적으로 관리할 수 있다.
# 다형성(Polymorphism)
다형성은 하나의 이름이 여러 형태로 동작할 수 있는 성질을 의미
자바에서 대표적으로 나타나는 형태는 오버로딩(Overloading)과 오버라이딩(Overriding)이다.
# 오버로딩 (Overloading)
같은 클래스 안에서 메서드 이름은 같지만 매개변수 개수나 타입이 다른 경우
반환타입만 다른 경우는 오버로딩 불가
void simpleMethod(int n) {...}
void simpleMethod(int n, double d) {...}
// 불가: 반환 타입만 다르면 오버로딩 안됨
double doubleSimpleMethod(int n, double d) {...}
예제
public class Person1 {
int age;
String name;
public int setAge(int age) {
return setAge(age, 10); // 내부적으로 다른 메서드 호출
}
private int setAge(int age, int padding) {
if (age > 20) padding = 20;
else padding = 10;
return age + padding;
}
}
class MainT5 {
public static void main(String[] args) {
int age = new Person1().setAge(20);
System.out.println(age); // 30
}
}
같은 이름의 메서드라도 매개변수 타입과 개수가 다르면 여러 버전을 정의 가능
# 오버라이딩 (Overriding)
💡상속 관계에서 부모 클래스 메서드를 자식 클래스에서 재정의하는 것
👉 메서드 이름 동일
👉 매개변수 타입과 개수 동일
👉 리턴 타입 동일
👉 접근 제한자는 부모보다 넓을 수 있음 (private → public 가능)
public class Person1 {
protected int age;
protected String name;
public void talk() {
System.out.println("parents talks...");
}
}
class Student1 extends Person1 {
@Override
public void talk() {
System.out.println("too much talk...");
}
}
class MainT5 {
public static void main(String[] args) {
Person1 person = new Student1();
person.talk(); // "too much talk..."
}
}
정적 타입은 부모, 실제 객체는 자식 → 런타임 시 자식 메서드 호출
이를 동적 바인딩(Dynamic Binding)이라고 한다
# equals와 hashCode
객체를 비교할 때 ==는 주소값 비교, equals()는 내용 비교
equals() 재정의 시 hashCode()도 재정의해야
HashSet, HashMap 등 컬렉션에서 올바르게 동작
문자열 비교 예제
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true, 상수 풀 공유
s1 = new String("Hello");
s2 = new String("Hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
객체 비교 예제
public class Person_ {
String name;
public Person_(String name) { this.name = name; }
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person_)) return false;
Person_ p = (Person_) obj;
return p.name.equals(this.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
public static void main(String[] args) {
var person1 = new Person_("홍길동");
var person2 = new Person_("홍길동");
System.out.println(person1.equals(person2)); // true
Set<Person_> persons = new HashSet<>();
persons.add(person1);
persons.add(person2);
System.out.println(persons.size()); // 1
}
}
hashCode()가 같지 않으면 절대로 같은 객체로 인식되지 않음
equals()는 객체의 내용 비교를 위해 재정의 가능
게시판 중복 댓글 방지
public class Comment {
private String author;
private String content;
private int likeCnt;
public Comment(String author, String content) {
this.author = author;
this.content = content;
}
@Override
public int hashCode() {
return Objects.hash(author, content);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Comment)) return false;
Comment comment = (Comment) obj;
return Objects.equals(this.author, comment.author)
&& Objects.equals(this.content, comment.content);
}
@Override
public String toString() {
return "Comment{" +
"author='" + author + '\'' +
", content='" + content + '\'' +
", likeCnt=" + likeCnt +
'}';
}
}
class CommentSystem {
public static void main(String[] args) {
Set<Comment> comments = new HashSet<>();
comments.add(new Comment("A", "좋은글"));
comments.add(new Comment("A", "나쁜글"));
comments.add(new Comment("A", "나쁜글")); // 중복 제거
System.out.println(comments);
}
}
HashSet을 사용하면 equals + hashCode 기반으로 중복 자동 제거
객체의 논리적 동일성을 판단할 때 필수 개념
| 개념 | 특징 |
| 오버로딩 | 같은 클래스, 같은 이름, 매개변수 다름 |
| 오버라이딩 | 상속 관계, 부모 메서드 재정의 |
| equals() | 객체 내용 비교, 필요 시 재정의 |
| hashCode() | 컬렉션에서 객체 동일성 판단, equals()와 함께 재정의 |
| 다형성 | 하나의 이름으로 여러 형태 동작 가능, 런타임 시 결정 |
'java' 카테고리의 다른 글
| Abstract class(=추상화) (0) | 2025.11.28 |
|---|---|
| Encapsulation(=캡슐화) (0) | 2025.11.28 |
| Java 문법 – 변수, 메서드, 다형성, CallByValue/Reference (0) | 2025.11.28 |
| Java 문법 - 클래스, 진법, 비트 연산 (0) | 2025.11.28 |
| OOP란? (0) | 2025.11.28 |
