오버라이딩과 super

서지우·2023년 7월 11일
0

JAVA

목록 보기
15/28

오버라이딩이란?

조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 말함.


오버라이딩의 조건

1. 선언부가 같아야 함(이름, 매개변수, 리턴타입)
2. 접근제어자를 좁은 범위로 변경할 수 없음
   (조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다)
3. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없음


오버로딩 VS 오버라이딩

오버로딩

- 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩

- 상속받은 메서드의 내용을 변경하는 것(change, modify)



super

this

- 인스턴스 자신을 가리키는 참조 변수 
- 인스턴스의 주소가 저장되어 있음
- 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

super

- this와 같음
- 조상의 멤버와 자신의 멤버를 구별하는데 사용


- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.

- 조상의 멤버들도 초기화 되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.



실습 - ch07 / S02.java

메이플스토리를 가지고 실습해보았다.
주석으로 설명..

package ch07;

class Skill{
    String name; // 스킬 이름
    int damage; // 공격력

    public Skill(String name, int damage) {
        this.name = name;
        this.damage = damage;
    }
}

class 초보자{
    Skill skill1;

    public 초보자(Skill skill1) {
        this.skill1 = new Skill("달팽이 세마리", 1);
    }
}

// 초보자 -> 마법사 skill2 매직클로 10 콤포지트
class 마법사 extends 초보자{
    Skill skill2;

    public 마법사(Skill skill1, Skill skill2) {
        super(skill1);
        this.skill2 = new Skill("매직클로", 10);
    }
}

public class S02 {
    public static void main(String[] args) {
        
    }
}

실습 - ch07 / S03.java

이것도 메이플스토리를 가지고 실습해보았다.
주석으로 설명..

package ch07;

class Skill{
    String name; // 스킬 이름
    int damage; // 공격력

    public Skill(String name, int damage) {
        this.name = name;
        this.damage = damage;
    }
}

class Skill0 extends Skill{
    
    public Skill0(){
        super("달팽이 세마리", 1);
    }

    public Skill0(String name, int damage){
        // 부모의 생성자를 호출한다
        // Skill은 name, damage 둘다 받아야 생성이 되기 때문에
        // 무조건 부모생성자를 호출해서 값을 넣어줘야 한다
        super(name, damage);
    }
}

// Skill1 클래스 생성 / 모든 매개변수를 받는 생성자
class Skill1 extends Skill{
    public Skill1(String name, int damage) {
        super(name, damage);
    }
}


class 초보자{
    Skill skill0;

    public 초보자() {
        this.skill0 = new Skill0();
    }

    public 초보자(Skill0 skill0){
        this.skill0 = skill0;
    }
}

// 초보자 -> 마법사 skill2 매직클로 10 콤포지트
class 마법사 extends 초보자{
    Skill skill1;

    public 마법사() {
        super(new Skill0("달팽이 세마리", 3));
        this.skill1 = new Skill1("매직클로", 10);
    }
}

public class S03 {
    public static void main(String[] args) {
        
    }
}
profile
미래가 기대되는 풀스택개발자 공부 이야기~~

0개의 댓글