키워드
- 🚗오버라이딩
- 🚗? : 엄마 차를 내 마음대로 꾸미고, 활용하는 것
- 부모 클래스의 메소드를 내 입맛대로 "재정의"하는 것
- 오버라이딩을 이해하기 위한 배경 지식
- 오버라이딩의 특징
- 오버라이딩의 성립 조건
- @Override 어노테이션
- 🏠오버로딩
- 🏠? 같은 학교에 동명이인이 있어도 수업을 들을 수 있는 것
- 같은 클래스 내에 다른 매개변수의 타입, 개수가 다르면 같은 메소드 명을 사용할 수 있다는 것
- 🚗오버라이딩과 🏠오버로딩이 뭐가 다를까?
🚗오버라이딩을 이해하기 위한 배경 지식
상속
클래스 단위로 상속이 이루어지고, 이는 코드의 재사용성을 높이기 위함입니다!
클래스 상속이랑 자식클래스가 부모 클래스의 속성과 메소드를 100% 상속 받는 것을 의미해요.
(자식 클래스는 부모 생성자와 private 요소를 제외한 모든 멤버를 상속 받아요)
JAVA언어에서는 단일 상속만 가능해요. 자식 클래스는 단 하나의 부모 클래스를 상속받을 수 있어요.
모든 클래스는 Object의 후손입니다. (아주 그리고 매우 중요한 개념이에요)
(== 최상위 클래스는 항상 Object라는 뜻)
(== 즉, Object에 있는 메소드들은 다 가져다 쓸 수 있다는 뜻)
부모 클래스의 메소드가 맘에 들지 않으면 오버라이딩을 통해서 자식 클래스에서 재정의가 (재작성) 가능해요.
예를 들어 Book이라는 클래스가 있습니다.
여기서 Book 객체를 출력하면, 이상한 주소 값이 나옵니다.
Book bk = new Book("수학의 정석", "나수학", 10000);
System.out.println(bk.toString()); // == System.out.println(bk);
출력문 :
com.kh.chap03_override.model.vo.Book@6d06d69c
출력문 안에 레퍼런스 변수를 제시해서 출력하고자 할 때 내부적으로 JVM이 자동으로 toString() 메소드를 호출해요.
상위 클래스인 Object 클래스에 있는 toString(): "해당 레퍼런스의 타입의 풀 클래스명 + @ + 해당 객체의 주소 값의 16진수 형태"로 돌려줍니다. 그래서 저 이상한 주소 값이 나오게 되는 것입니다.
그럼 어떻게 해결할까요?
이를 해결하기 위해서는 오버라이딩을 적용하면 됩니다.
즉, Book 클래스에 to.String()를 사용하는 것입니다.
public String toString() {
return "title : " + title + ", author : " + author + ", price" + price;
}
System.out.println(bk);
-----------------------------------------------------
출력문
title : 수학의 정석, author : 나수학, price : 10000
🚗오버라이딩의 특징
- 메소드 오버라이딩은 클래스 상속 상황에서 부모 클래스의 멤버를 자식 클래스에서 상속 받았지만 자식 클래스에서 해당 멤버의 내용을 수정하여 자식 클래스 객체에 적용하는 것입니다.
- 메소드 오버라이딩은 부모 클래스의 정의에는 영향을 주지 않아요. 부모 클래스로부터 상속받은 자식 클래스의 메소드 맴버를 재정의하는 다형성을 오버라이딩이라고 합니다.
- 그러니까, 상속받고 있는 부모 클래스의 메소드를 자식 클래스에서 재정의(=재작성) 하는 것입니다.
- 부모가 제공하고 있는 메소드를 자식이 일부 고쳐서 사용하겠다는 의미입니다
- 자식 메소드가 우선권을 가집니다.
🚗오버 라이딩의 성립 조건
- 상위 메소드명과 동일해야됩니다.
- 매개변수 자료형, 갯수, 순서 동일해야합니다. (매개변수명과는 무관)
- 반환형 동일해야합니다. (jdk 버전업 되면서 부모메소드의 반환형의 자식자료형까지는 가능)
- - 상위 메소드의 접근제한자보다 같거나 커야됨.
- 만약 상위 메소드의 접근 제한자가 protected였다면 오버라이딩시 1)protected 2)public 해야함
- => 규약의 개념이 들어가 있다. (재정의 하려면 이 정도의 규칙은 지켜줘 ~)
@Override 어노테이션
생략 가능합니다. 명시를 안 해도 부모메소드와 형태가 똑같으면 오버라이딩된 것입니다.
기본적으로 생략은 가능하지만, 굳이 왜 어노테이션을 사용해야 할까요?
1. 어노테이션이 오류를 알려주기 때문입니다.
- 잘못 기술했을 경우 오류를 알려주기 때문에 다시 한번 검토할 수 있게끔 유도해줍니다.
- 혹시라도 상위 메서드가 후에 수정되었을 경우 오류로 알려주기 때문에 검토할 수 있게끔 유도해줍니다.
2. 다른 개발자들에게 오버 라이딩된 메소드인 것을 공유할 수 있기 때문입니다.
- 이 메소드가 오버 라이딩된 메소드라는 걸 다른 개발자들에게 알리고자 하는 목적으로 사용됩니다.
🏠오버로딩
오버 로딩은 Java 초창기에 클래스의 구조 때 배웠던 내용이에요!
간단하게 정리하자면, 같은 클래스 내에서 메소드를 중복해서 작성하는 것으로 매개 변수의 자료형, 갯수, 순서가 다르다면, 오버로딩이 적용 되어 다른 여러 개의 메소드가 같은 이름으로 작성되는 것을 의미합니다. 오버로딩을 사용하는 이유는 메소드명이 같은 여러 개의 메소드를 중복 선언하여 사용의 편리성을 향상시키는 데 있습니다. (=다형성)
같은 반(==같은 클래스)에 동명이인(==동일한 메소드명)이 있어도, 두 사람은 다른 사람입니다. 성별, 혈액형, 취향, 취미(== 매개변수들의 자료형, 갯수, 순서)가 다르니까요.
가장 대표적인 오버 로딩의 예 ) println()
🚗오버라이딩과 🏠오버로딩이 뭐가 다를까?
즉, 오버라이딩은 상위 클래스의 메소드를 재정의 하는 것을 의미합니다.
오버로딩은 같은 클래스 내에서 동일한 메소드 이름을 가지지만, 매개변수의 타입, 개수, 순서가 다르게 구현할 수 있는 것을 의미합니다.
오버라이딩 | 오버로딩 | |
설명 | 두 클래스 간의 상속 관계에서 부모 클래스로부터 상속받은 자식 클래스의 메소드를 재정의 | 같은 클래스 내에 같은 메소드명을 재정의 |
공통점 | 메소드 명이 같아야함 | |
차이점 | 두 클래스 간 메소드명, 매개변수 개수, 자료형 모두 같아야 함 | 매개변수의 개수 또는 매개변수의 자료형 모두 달라야 함 |
오버라이딩과 오버로딩 모두 다형성과 관련된 내용이지만, 오버라이딩은 상속에만 존재해요 !
오버라이딩은 두 클래스 간!, 오버로딩은 같은 클래스 내!
(21.10.02 추가)
정적바인딩 동적바인딩
객체지향 언어에서는(Java) 클래스간 오버라이딩 된 메소드의 경우에는 동적 바인딩 상황에서 자식의 오버라이딩 된 메소드를 호출합니다.
오버라이딩 된 서브 클래스의 메소드가 항상 실행되며,
실행 시간에 오버라이딩된 메소드를 찾아 호출 ↔ 정적 바인딩(컴파일 시 호출 메소드 결정)
오버라이딩에서는 동적 바인딩이 기본으로 실행
왜? 오버라이딩 시 부모 클래스의 메소드가 무시 되기 때문에 !
= 기존의 코드가 아닌 재정의된 코드로 인식 된다.
그럼 부모쪽 메소드는 어떻게 접근하나요?
바로 super를 이용해서 접근하면 됩니다.
super
정적 바인딩(=번역시간)을 통해 부모 클래스의 멤버에 접근 할 수 있음
= super를 붙이면 동적 바인딩 (=실행시간) 상황이라도 (=오버라이딩 됐더라도) 부모의 멤버에 접근할 수 있다.
= 동적 바인딩 상황에서 (=오버라이딩된 상황에서)는 무조건 자식만 인식한다 (= 부모를 무시한다. )
'📓 Study > Tech Interview' 카테고리의 다른 글
KEY란 무엇인가요? (0) | 2021.09.21 |
---|---|
String, StringBuilder, StringBuffer 각각의 차이에 대해 설명해주세요. (0) | 2021.09.21 |
SQL과 NoSQL 차이점은 무엇일까요? (0) | 2021.09.18 |
🗺 원시타입과 🧭참조 타입의 차이는 무엇일까요? (0) | 2021.09.17 |
🚧 접근 제어자의 종류와 이에 대해 설명해주세요 (0) | 2021.08.20 |
댓글