> For the complete documentation index, see [llms.txt](https://injun-woo30000.gitbook.io/growth-log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://injun-woo30000.gitbook.io/growth-log/i-learned/programing-language/java/vs.md).

# 오버로딩 vs 오버라이딩

## 오버로딩

### 개념

* 이름은 같지만 시그니처(파라미터 수, 타입)가 다른 메소드를 중복으로 선언하는 것.

### 특징

* 메소드 이름이 같아야함.
* 시그니처는 달라야함. 파라미터 수가 다르거나 타입이 다르거나, 둘 다 다르거나.
* 리턴 값은 시그니처에 해당되지 않음.
* 접근 제어자는 자유롭게(같거나 다르게) 지정할 수 있다.

### 쓰는 이유

* 가독성 증가시킴.
* 같은 기능을 하는 메서드 관리가 쉬워짐.

## 오버라이딩

### 개념

* 부모 클래스의 메소드의 동작 방법을 변경(재정의)하여 우선적으로 사용하는 것

### 특징

* 메소드 이름이 같아야함.
* 시그니처가 같아야함. 파라미터 수, 파라미터의 타입이 같아야한다.
* 메소드 리턴형이 같아야한다.
* 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 한다.
* 상속 받은 클래스의 메소드를 오버라이딩할 때, 스태틱 메소드를 오버라이딩 하게 되면 상위 클래스의 메소드가 하이딩 처리된다. 자바에서는 이 하이딩 처리를 권장하지 않는다.
* `private` 메서드는 오버라이딩이 불가하다. 당연한 것이, 자식 클래스에서도 접근 불가이니까.
* 참고로 `@Override` 어노테이션을 적어주면 오버라이딩이 제대로 구현되었는지를 컴파일 타임에 검증한다.
* 접근 제어자를 설정하는데 별도의 규칙이 존재한다.
  * 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
  * 예외(Exception)은 부모 클래스의 메소드보다 많이 선언할 수 없다.
  * static 메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다.
