1. 상속
1-1. 클래스 간의 상속이란?
- 클래스 간에는 부모 - 자식의 상속 관계를 설정할 수 있다.(상속이란 부모가 자식에게 기능적인 것을 주는 것)
- 부모 클래스 A를 자식 클래스 B가 상속 받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다.
(단, private으로 설정된 기능은 상속되지 않는다. class안에서만 기능)
- 상속가능 여부 : public, protected
- B는 A의 public, protected 기능들을 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.
1-2. 상속 정의 방법
- extends 키워드를 사용하여 부모 클래스의 이름을 명시
public class 자식클래스 extends 부모클래스 {...}
1-3. 클래스 다이어그램을 통한 상속의 표현
- 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모 클래스르 가리키는 화살표로 표현한다.
- 상속관계가 이루어 질 때 부모 클래스를 super클래스라고 한다.
1-4. 상속의 활용
- 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우
- CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에, 별도의 소스코딩 없이도 plus()메서드와 minus()메서드를 포함하게 된다.
- CalcChild 클래스에 time()메서드와 divide()메서드를 추가하면, 상속받은 메서드에 새로운 기능을 추가하는 효과를 얻을 수 있다.
public class CalcParent {
public int plus( int x, int y ) {
return x + y;
}
public int minus( int x, int y ) {
return x - y;
}
}
public class CalcChild extends CalcParent {
public int times( int x, int y ) {
return x * y;
}
public int divide( int x, int y ) {
int result = 0;
if(y != 0) {
result = x / y;
}
return result;
}
}
public class Main01 {
public static void main(String[] args) {
CalcParent parent = new CalcParent();
System.out.println(parent.plus(100, 50));
System.out.println(parent.minus(100, 50));
System.out.println("---------------------------");
CalcChild child = new CalcChild();
System.out.println(child.plus(200,100));
System.out.println(child.minus(200,100));
System.out.println(child.times(200,100));
System.out.println(child.divide(200,100));
}
}
1-5. 상속의 활용2
- 여러 개의 클래스에 공통되는 기능을 추출하여 공유하기
- 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와 자료실의 게시물을 표현하기 위한 FileArticle 클래스는 글 번호와 제목이라는 공통된 특성을 갖는다.
- 공통 기능을 별도의 클래스로 추출해 내면, 코드의 재사용 및 수정이 용이하다.
public class Article {
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;
}
}
public class FileArticle extends Article {
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String toString() {
return "자료실[번호 = " + getNum()
+ ", 제목 = " + getTitle()
+ ", 첨부파일 = " + fileName + "]";
}
}
public class QNAArticle extends Article {
private String answer;
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String toString() {
return "질문/답변[번호 = " + getNum()
+ ", 제목 = " + getTitle()
+ ", 답변 = " + answer + "]";
}
}
public class Main02 {
public static void main(String[] args) {
FileArticle fileArticle = new FileArticle();
fileArticle.setNum(1);
fileArticle.setTitle("첫 번째 자료입니다.");
fileArticle.setFileName("java.ppt");
System.out.println(fileArticle.toString());
System.out.println("------------");
QNAArticle qnaArticle = new QNAArticle();
qnaArticle.setNum(1);
qnaArticle.setTitle("첫 번째 질문입니다.");
qnaArticle.setAnswer("첫 번째 답변입니다.");
System.out.println(qnaArticle.toString());
}
}