티스토리 뷰
이 콘텐츠는 아래와 같은 사전 지식이 필요합니다.
- 상속
이 콘텐츠는 아래와 같은 내용을 담고 있습니다.
- 오버 라이딩이란
- 오버 로딩이란
- 실전 예제
이 콘텐츠는 다음과 같은 포스팅과 연관이 있습니다. 참조하십시오.
- 상속에 대한 포스팅 https://j-sik.tistory.com/27?category=958167
두 단어를 정리하기 위해, 상속관계에 있는 클래스 2개를 미리 정의하겠다. 나는 요즘 Pop cat에 빠져있으므로 고양이 클래스로 아래와 같은 두 클래스를 정의했다.
public class ParentCat {
private int age ;
public ParentCat(){
this(10);
}
public ParentCat(int age) {
this.age = age;
}
public void eat(){
System.out.println("엄마냥 밥이다아아옹");
}
protected void hit(){
System.out.println("냥냥 펀치");
}
private void careMyKids(){
System.out.println("아기냥을 챙긴다.");
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class ChildCat extends ParentCat{
private String sound ;
public ChildCat() {
this(1,"으냐아아ㅏ아아아옹!");
}
public ChildCat(int age, String sound) {
super(age);
this.sound = sound;
}
public void shouting(){
System.out.println("소리친다 - " + sound);
}
}
Overriding
'우선하다'라는 의미를 갖고 있는 오버 라이딩은 상속관계에서 메서드가 재정의 됨을 말한다. 부모가 정의한 메서드의 내용을 자식이 자신에게 맞게 재정의하여 쓰게 된다는 것이다. ParentCat을 상속받은 ChildCat이 먹는다는 행동을 상속받아한다고 하자. 그런데 eat() 메서드는 엄마 냥이 먹는 행위가 기재되어있다. 본인이 먹는다라는 행동으로 바꾸기 위해서는 이미 있던 eat()이라는 메서드를 수정(재정의)해야 한다. 그래서 ChildCat은 eat() 행위를 수정(재정의)했다.
public class ChildCat extends ParentCat{
//...생략
@Override
public void eat() {
System.out.println("아기냥이 먹는다");
}
//...생략
}
두 클래스를 생성한 뒤 먹는 행위를 지켜보자.
public class CatSimulator {
public static void main(String[] args) {
ParentCat pCat = new ParentCat();
ChildCat cCat = new ChildCat();
pCat.eat();
cCat.eat();
}
}
결과는 아래와 같다.
분명 같은 eat()이라는 메서드를 사용하고 있지만, 다르다. ChildCat에 입장에서 본다면, 부모의 eat()을 재정의 했기 때문에 eat()을 호출했을 때, 재정의한 메서드가 '우선' 되기 때문이다.
c.f)
오버 라이딩이 같은 특징 중 하나는 부모 클래스의 변수에 자식 클래스 인스턴스로 타입 캐스팅되어도, 여전히 오버 라이딩된 메서드를 가져온다.
public class CatSimulator {
public static void main(String[] args) {
//부모 클래스 변수를 자식 고양이 인스턴스와 매핑
ParentCat pretendingMotherCat = new ChildCat();
//eat 호출
pretendingMotherCat.eat();
}
}
출력 결과 오버라이드 된 ChildCat의 메서드가 호출된다. 자식의 메서드가 '우선되기(Override)' 때문이다.
오버 라이딩은 상속을 받은 메서드를 재정의 하는 것이므로, 반드시 상속관계에서 일어난 다는 것을 기억해야 한다.
Overloading
오버 로딩은 그 의미 자체로 '과적하다'라는 뜻을 지니고 있다. 메서드의 반환 타입이 같지만, 인자 값(Parameter)이 다른 경우에도 같은 이름을 사용하여 메서드를 호출 할 수 있는 것을 오버 로딩이라 한다. 이를 통해 이름은 갖지만 다른 기능을 할 수 있다. 같은 이름에 여러 기능을 '과적'한다는 의미로 보면 좋을 것 같다. 오버 라이딩과는 다르게 상속관계에서 발생하는 일이 아니다. 특정 케이스에 발생할 수 있지만, 대체로 같은 메서드지만, 다른 인자 값과 기능이 핵심이다.
public class ChildCat extends ParentCat{
//.... 생략
@Override
public void eat() {
System.out.println("아기냥이 먹는다");
}
public void eat(String something){
System.out.println("아기냥이가 " +something+"을/를 먹었다!");
}
}
ChildCat 클래스에 다음과 같은 메소드를 추가한 뒤 main에서 불러보겠다.
위의 스크린숏과 같이 eat이라는 이름이 같은 메서드지만 인자 값이 다르다. 이 두 메서드는 이름만 같을 뿐 행동이 전혀 다르다. 두 메서드를 모두 호출해본 결과 다음과 같다.
오버 라이딩과 오버 로딩 모두 기능을 확장하여 쓸 수 있게 하므로 다형성과 관련된 주된 개념이니 꼭 숙지하자.
'공부 > JAVA' 카테고리의 다른 글
[JAVA] 업캐스팅(Upcasting) 과 다운캐스팅(Down) (0) | 2021.09.07 |
---|---|
[디자인 패턴] Singletone 패턴 (0) | 2021.09.06 |
[JAVA] 인터페이스(Interface) JAVA 개념을 부숴주마 (0) | 2021.08.30 |
[JAVA] 기본개념 Stack 영역과 Heap 영역 (0) | 2021.08.25 |
[JAVA]상속 (Inheritance) JAVA 개념을 부숴주마 (0) | 2021.08.23 |
- Total
- Today
- Yesterday
- DFS
- DP
- 파이썬
- 프로그래머스 문제정복
- 유클리드-호제법
- value annotation
- Python
- 코딩테스트
- BFS
- 브루트포스
- 플루이드 와샬
- db
- Spring
- 백준
- 프로그래머스
- looker core
- 카카오
- looker instance 접속
- java
- 아기상어나쁜상어
- dml
- 자바
- 재귀
- 실패일기
- JNDI연동
- 하루 회고
- 아기상어미워
- 그래프 탐색
- Database
- 9019
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |