부모가 가지는 재산을 자식에게 물려주는 행동
- 부모(클래스)가 가지는 재산(멤버 변수, 메서드)을 자식(클래스)에게 물려주는 행동
부모 클래스에서 이미 선언된 코드를 자식 클래스에서 재구현 없이 사용 가능
- 코드를 재사용하기 위한 기술
- 비용 절감
class Parent {
public int a;
public int b;
public void ccc() {
System.out.println("ccc");
}
}
//자식 클래스 역할 => 자식이 부모 클래스를 결정함
class Child extends Parent {
public int d;
public int e;
public void fff() {
System.out.println("fff");
}
}
클래스 상속 할 때 발생
메서드 재정의 > 상속 받은 메서드를 수정하는 기술
개발자에게 도움 > 또 다른 메서드 이름을 외울 필요가 없음
class overridingParent {
public String name;
public void hello() {
System.out.printf("안녕하세요. 좋은 아침입니다. 저는 %s입니다.\n", this.name);
}
}
class overridingChild extends overridingParent {
// public void hi() { 새로운 메서드
// System.out.printf("하이~ 방가~ 난 %s야\n", this.name);
// }
//메서드 재정의
public void hello() {
System.out.printf("하이~ 방가~ 난 %s야\n", this.name);
}
}
public static void main(String[] args) {
overridingParent hong = new overridingParent();
hong.name = "홍길동";
hong.hello();
overridingChild jhong = new overridingChild();
jhong.name ="홍철수";
//hong.hello();
//jhong.hi();
jhong.hello();
//overridingParent.hello() -> 길동이꺼
//overridingChild.hello() -> 철수꺼
}//main
//결과
안녕하세요. 좋은 아침입니다. 저는 홍길동입니다.
하이~ 방가~ 난 홍철수야
Q. 오버로딩도 아닌데 왜 에러 안남?
: 자식 메서드가 이김 -> 외부에는 자식 메서드 노출 ! 부모 메서드는 볼 수 없음
: 메서드를 고친게 아님 => 메서드를 재정의 한 것 = 오버라이딩
❗ 같은 이름의 메서드를 다시 만들 때 상의 클래스의 메서드는 무시 당함 = 메서드 재정의
하지만 문제 발생
상위 클래스를 무시한다면 상위 클래스의 메서드를 사용하고 싶을 때 어떡할까요?
: 자바에서 자식은 super라는 참조값을 통해 부모의 메서드를 호출 할 수 있다.
=> this와 super에 대해 알아보자
클래스 내에서 클래스가 가지고 있는 멤버 필드 또는 멤버 메소드를 직접 참조할 수 있는 자신의 참조 변수
클래스 디자인 타임에 사용
: 클래스를 디자인 할 때는 메모리 할당이 되지 않은 순간이다. 객체를 생성하기 전 단계에 그 주소를 this라고 칭하고 할당되는 순간 this는 할당되는 메모리의 참조값을 갖게 된다면 this는 디자인 타임에 실행 타임의 주소를 아는 것 처럼 행동이 가능하다.
즉, this = 언젠가 생성되어질 내 주소 this의
public class Employee {
private String name; // 직원명
private String department; // 직원명
//직속 상사정보
private String sname; // 직원명
private String sdepartment; // 직원명
private Employee superior;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Employee getSuperior() {
return superior;
}
public void setSuperior(Employee superior) {
this.superior = superior;
}
}
public static void main(String[] args) {
//부장
Employee e1 = new Employee();
e1.setName("홍길동");
e1.setDepartment("영업부");
//과장
Employee e2 = new Employee();
e2.setName("홍길동");
e2.setDepartment("영업부");
e2.setSuperior(e1);
System.out.println(e2.getSuperior().getName());
Parent father = new Parent();
father.setName("홍길동");
father.setAge(40);
Parent mother = new Parent();
mother.setName("성춘향");
mother.setAge(35);
Child child = new Child();
child.setName("홍무개");
child.setAge(12);
child.setFather(father); //관계
child.setMother(mother); //관계
System.out.println();
Person p1 = new Person();
p1.setName("홍길동");
p1.setAge(20);
p1.setAddress("서울시 강남구 역삼동");
//p1.setNick("홀쭉이");
// String[] nick= new String[3];
// nick[0] ="홀쭉이";
// nick[1] ="젓가락";
// nick[2] ="철사";
//
//
// p1.setNick(nick);
//com.test.java.obj.Person
//@
//8efb846
//컴파일러가 배열로 바꿈 > p1은 주솟값
p1.addNick("홀쭉이");
p1.addNick("젓가락");
p1.addNick("철사");
System.out.println(p1.info());
System.out.println(p1.getNick(1));
}
//결과
홍길동
이름: 홍길동
나이: 20
주소: 서울시 강남구 역삼동
별명: [홀쭉이, 젓가락, 철사]
젓가락
상속 구조에서 디자인 타임에 사용할 수 있는 상의 클래스의 참조 변수.
=> 상위 클래스를 참조할 수 있는 유일한 방법
class NewFather{
public void overrideFunc(){
System.out.println("아버지의 함수");
}
}
public class NewSon extends NewFather{
public void overrideFunc(){
System.out.println("아들의 재정의 함수");
}
public void testFunc(){
super.overrideFunc();
}
public static void main(String[] args){
NewSon s = new NewSon();
s.overrideFunc();//재정의 된 함수호출
s.testFunc();//super를 이용한 아버지 호출
}
}
//결과
아들의 재정의 함수
아버지의 함수