클래스 - 상속(extends)

조혜진·2022년 5월 22일
0

java 이론

목록 보기
10/10

📌 클래스간의 상속이란 ?

  • 클래스 간의 상속이란?
    -> 클래스간에는 부모-자식의 상속 관계를 설정할 수 있다.
    -> 부모 클래스 A를 자식 클래스 B가 상속받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다. (단, private으로 설정된 기능은 상속되지 않는다.)
    -> B는 A의 public, protected 기능들은 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.

📌 상속 정의 방법

  • extends 키워드를 사용하여 부모 클래스의 이름을 명시한다.
public class 자식클래스 extends 부모클래스 { ... }

📌 클래스 다이어그램을 통한 상속의 표현

  • 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모 클래스를 가리키는 화살표로 표현한다.
  • 클래스 다이어그램에는 상속관계, 클래스이름, 생성자, 메서드 등을 표현한다.
  • 상속관계가 이루어 질 때 부모클래스를 super 클래스라 한다.

📌 상속의 활용

  • 기존에 존재하는 클래스의 소스 수정없이 기능을 확장하고자 하는 경우
    -> CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에, 별도의 소스코딩 없이도 plus() 메서드와 minus() 메서드를 포함하게 된다
    -> CalcChild 클래스에 times()메서드와 divide() 메서드를 추가하면, 상속받는 메서드에 새로운 기능을 추가하는 효과를 얻을 수 있다.
// CalcParent 클래스
package extandsclass;
// 덧셈과 뺄셈의 기능을 갖는 클래스를 준비한다
public class CalcParent {
	// 생성자를 특별히 정의하지 않은 경우
	// 자바 컴파일러가 기본 생성자가 있다고 간주하기 때문에,
	// 클래스 다이어그램에서는 기본 생성자를 명시한다
	public int plus(int x, int y) {
		return x + y;
	}
	public int minus(int x, int y) {
		return x - y;
	}
}
// -------------------------------------------
// CalcChild클래스
package extandsclass;
// CalcParent를 상속받는 클래스
// 부모의 모든 기능을 상속받고 있으며,
// 곱셈과 나눗셈을 추가하여 부모의 기능을 확장
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;
	}
}
// -------------------------------------------
// 출력 Main클래스
package extandsclass;
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.divide(200, 100));
		System.out.println(child.times(200, 100));
		System.out.println(child.plus(200, 100));
		System.out.println(child.minus(200, 100));	
	}	
}
  • 여러개의 클래스에서 공통되는 기능을 추출하여 공유하기
    -> 질문/ 답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와 자료실의 게시물을 표현하기 위한 FileArticle은 글 번호와 제목이라는 공통된 특성을 갖는다
    -> Article 클래스는 QNAArticle 클래스와 FileArticle 클래스가 공통적으로 포함하고 있는 멤버변수인 "글번호(num)", "제목(title)"과 이 변수들에
    대한 getter, setter를 추출한 것이다
    -> 이와 같이 공통 기능을 별도의 클래스로 추출해 내면, 코드의 재사용 및 수정이 용이하다
// Article 클래스
package extandsclass;
/*
 * 게시판의 일반적인 기능을 구현한다
 * 자료실과 질문/답변 게시판은 기본적인 게시판의 기능을 포함하고 있기 때문에,
 * 이 클래스는 두 가지 클래스의 공통 기능을 추출한 개념이다
 */
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;
	}	
}
// -------------------------------------------
// QNAArticle 클래스
package extandsclass;
/*
 * Article 클래스 상속받고, 
 * 부모클래스의 title을 질문으로 보고, 답변을 추가
 * main 메서드를 포함하고 있는 class생성, 
 * 글번호, 질문(글 제목), 답변 데이터 set
 * 글번호, 질문(글 제목), 답변 데이터 get으로 출력
 */
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()
			+ ", 답변 = " + getAnswer();
	}
}
// -------------------------------------------
// FileArticle 클래스
package extandsclass;
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()
		+ " , 첨부파일 = " + getFileName()
		+ " ] ";
	}
}
// -------------------------------------------
// 출력 Main클래스
package extandsclass;
public class Main02 {
	public static void main(String[] args) {
		QNAArticle qna = new QNAArticle();
		qna.setNum(1);
		qna.setTitle("첫 번째 질문입니다.");
		qna.setAnswer("첫 번째 답변입니다.");
//		System.out.println(qna.getNum());
//		System.out.println(qna.getTitle());
//		System.out.println(qna.getAnswer())	
		System.out.println("질문/답변 [글번호 = " + qna.getNum() 
		+ ", 제목 = " + qna.getTitle() 
		+ ", 답변 =" + qna.getAnswer());
		System.out.println(qna.toString());
System.out.println("=========================================");
		FileArticle file = new FileArticle();
		file.setNum(10);
		file.setTitle("10번째 자료입니다.");
		file.setFileName("dat10.ppt");
		System.out.println(file.toString())	
	}	
}
profile
안녕하세요

0개의 댓글