클래스 간에는 부모-자식의 상속관계를 설정할 수 있다.
부모 클래스 A를 자식클래스 B가 상속받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다. (단, private으로 설정된 기능은 상속되지 않는다.)
상속 가능여부 : public, protected
강사님 말씀으로는 protectde는 잘 사용하지 않는다고 말씀하셨다
B는 A의 public, protected 기능들을 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.
extends 키워드를 사용하여 부모 클래스의 이름을 명시
public class 자식클래스 extends 부모클래스{...}
클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모 클래스를 가리키는 화살표로 표현한다.
상속관계가 이루어 질때 부모 클래스를 super 클래스 라고 한다.
메소드 부분에 super를 넣어주면 하위 class가 아닌 상위 class의 메소드를 참조,
this.변수 선언하는것과 같은 이치, class에는 super를 잘 쓰지 않는다.
기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우 하위 클래스는 상위 클래스를 상속받기 때문에, 별도의 소스 코딩없이도 상위 클래스의 메서드를 포함하게 된다.
하위 클래스에 메서드를 추가하면 상속받은 상위 클래스의 메서드에 기능을 추가하는 효과를 얻을 수 있다.
보통 많은 메서드가 있는 클래스에 추가적인 수정이 부담 갈때 상속을 하는 경우가 많다.
혹은 기존 메서드 부분을 override할때 사용한다. 아래 내용이 계속 진행됨
여러 개의 클래스에 공통되는 기능을 추출하여 공유하기
질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와 자료실의 게시물을 표현하기 위한 FileArticle은 글 번호와 제목이라는 공통된 특성을 갖는다.
공통 기능을 별도의 클래스로 추출해 내면, 코드의 재사용 및 수정이 용이하다.
package Extends;
public class Article1 {
private int num;
private String title;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
모체가 되는 CLASS, 글 번호와 제목을 공통된 메서드로 들고간다
package Extends;
public class QNAAticle extends Article1 {
private String answer;
public String getAnswer(){
return answer;
}
public void setAnswer(String answer){
this.answer = answer;
}
public String tostring()
{
return "질문/답변[번호= " + getNum()
+ ", 제목 = " + getTitle()
+ ", 답변 = " + answer + "]";
}
}
extends 상속을 사용하여 만든 QNA관련 class, getter로 Article1의 Num, Title 메서드를 불러온다
육군(Army), 해군(Navy), 공군(Airforce)
Unit이라는 클래스를 통해서 공통 속성을 정의한다.
-> 이름(멤버변수, getter, setter), 공격(attack())
같은 이름이지만, 다른 동작을 수행해야 하는 필요성
-> 모든 군대는 '공격'이라는 공통된 특성을 가지지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야 한다.
부모클래스가 갖고 있는 기능을 자식 클래스가 재정의 할것
-> 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려진다.
-> 이렇게 부모의 기능을 재 정의하는 것을 메서드 Override 라고 한다.
```
코드를 입력하세요
모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여
attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.
클래스의 상속 관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
생성자는 상속되지 않는다.
하지만 생성자가 정의된 클래스는 객체 생성을 위해서 생성자 파라미터를 반드시 전달받아야 하기 때문에, 파라미터를 갖는 생성자가 정의된 클래스를 상속받게 되면 에러가 발생한다.
메서드 재정의 과정에서의 오타 방지 옵션
@Override는 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모클래스에 존재하지 않을 경우 구문 에러로 처리된다.
부모 클래스의 메서드를 재정의 하고자 할 경우, 의도치 않은 실수를 예방하기위한 '오타 방지 옵션'이다.
여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다.
Object 클래스(첫 class에서 super(); 가 있는 이유가 이 최상위 class object에서 가져오기 때문에 있는것) 가장 default값이 된다고 보면 될 것같다.
원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법
메서드간의 파라미터가 서로 달라야 한다.
리턴형이 다른 경우는 오버로드 성립에 아무런 영향을 주지 않는다.
purblic void user(int a){ ... }
purblic void user(String a){ ... }
purblic void user(int a){ ... }
purblic void user(int a, int b){ ... }
purblic void user(int a, String b){ ... }
purblic void user(String a, int b){ ... }
purblic void user(int a){ ... }
putbilc void suer(int b){ ... }
마지막 같은 경우 변수만 다른것으로 선언되어 오버로드가 되지 않는다.