Java 문법 – Overload vs Override

2025. 11. 28. 13:53·java

# 다형성, 오버로딩/오버라이딩, 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
'java' 카테고리의 다른 글
  • Abstract class(=추상화)
  • Encapsulation(=캡슐화)
  • Java 문법 – 변수, 메서드, 다형성, CallByValue/Reference
  • Java 문법 - 클래스, 진법, 비트 연산
차하비
차하비
chadev 님의 블로그 입니다.
  • 차하비
    chadev
    차하비
  • 전체
    오늘
    어제
    • 분류 전체보기 (47)
      • kubernetes, k8s (3)
      • docker (3)
      • cloud (6)
      • linux (12)
      • spring (7)
      • java (11)
      • error (4)
      • 자격증 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    thread
    Java
    url
    클래스
    docker
    비트 연산
    monolithic
    HTTP
    모놀리식
    진법
    URI
    KUBECTL
    객체지향
    Join
    Kubernetes
    OOP
    Spring
    restAPI
    k8s
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
차하비
Java 문법 – Overload vs Override
상단으로

티스토리툴바