조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 말함.
1. 선언부가 같아야 함(이름, 매개변수, 리턴타입)
2. 접근제어자를 좁은 범위로 변경할 수 없음
(조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다)
3. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없음
오버로딩 VS 오버라이딩
오버로딩
- 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩
- 상속받은 메서드의 내용을 변경하는 것(change, modify)
this
- 인스턴스 자신을 가리키는 참조 변수
- 인스턴스의 주소가 저장되어 있음
- 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
super
- this와 같음
- 조상의 멤버와 자신의 멤버를 구별하는데 사용
- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화 되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
메이플스토리를 가지고 실습해보았다.
주석으로 설명..
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) {
}
}
이것도 메이플스토리를 가지고 실습해보았다.
주석으로 설명..
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) {
}
}