프로그램에서의 상속은 자식이 부모를 선택하는 개념이다.
상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성 하므로 중복되는 코드를 줄여준다.
또한 상속을 이용하면 부모 클래스의 수정으로 모든 자식클래스들도 수정되는 효과를 가져오기 때문에
유지 보수 시간을 최소화 할 수 있다.
다른 클래스가 가지고있는 멤버(변수와 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고, 상속받음으로써
새클래스가 자신의 멤버처럼 사용이 가능하다.
class 자식클래스 extends 부모클래스{
//필드
//생성자
//메소드
}
public class Gold extends Silver{
}
-> Gold클래스는 Silver 클래스를 상속한다.
-> Gold클래스는 Silver 클래스의 멤버들을 사용 할 수 있다.
상속의 특징
1. 여러 개의 부모 클래스를 상속 할 수 없다. 그러므로 extends 뒤에는 하나의 부모 클래스만 와야 한다.
class 자식클래스 extends 부모클래스1 , 부모클래스2❌ {
}
2. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도
상속 대상에서 제외 된다.
실습
//부모클래스
package kh.java.vo;
public abstract class Grade {
private String grade;
private String name;
private int point;
public Grade() {
super();
// TODO Auto-generated constructor stub
}
public Grade(String grade, String name, int point) {
super();
this.grade = grade;
this.name = name;
this.point = point;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public abstract double getBonus();
}
//자식클래스1 Gold
package kh.java.vo;
public class Gold extends Grade{
public Gold() {
super();
}
public Gold(String grade, String name, int point) {
super(grade, name, point);
}
public double getBonus() {
return getPoint()*0.05;
}
}
//자식클래스2 Silver
package kh.java.vo;
public class Silver extends Grade{
public Silver() {
super();
// TODO Auto-generated constructor stub
}
public Silver(String grade, String name, int point) {
super(grade, name, point);
// TODO Auto-generated constructor stub
}
public double getBonus() {
return getPoint()*0.03;
}
}
//자식클래스3 Vip
package kh.java.vo;
public class Vip extends Grade{
public Vip() {
super();
// TODO Auto-generated constructor stub
}
public Vip(String grade, String name, int point) {
super(grade, name, point);
// TODO Auto-generated constructor stub
}
public double getBonus() {
return getPoint()*0.1;
}
}
여기까지의 실습이 부모클래스와 자식클래스가 어떻게 상속 받게 되는지 보여주는 모습이다.
하지만 수업중에는 앞에서 배운 내용들을 더 추가하여 실습하였다.
//controller
package kh.java.controller;
import kh.java.vo.Gold;
import kh.java.vo.Grade;
import kh.java.vo.Silver;
import kh.java.vo.Vip;
public class PntMgr {
Grade[] g = new Grade[30];
int gIndex = 0;
public void addMember(String grade, String name, int point) {
switch(grade) {
case "Silver":
g[gIndex++] = new Silver(grade, name, point);
break;
case "Gold":
g[gIndex++] = new Gold(grade, name, point);
break;
case "Vip":
g[gIndex++] = new Vip(grade, name, point);
break;
}
}
public Grade[] printAll() {
return g;
}
public int count() {
return gIndex;
}
public int search(String name) {
for(int i = 0; i < gIndex; i++) {
if(g[i].getName().equals(name)) {
return i;
}
}
return -1;
}
public Grade printOne(int result) {
return g[result];
}
public void updateMember(int result,String newGrade, String newName, int newPoint) {
switch(newGrade) {
case "Silver":
g[result] = new Silver(newGrade, newName, newPoint);
break;
case "Gold":
g[result] = new Gold(newGrade, newName, newPoint);
break;
case "Vip":
g[result] = new Vip(newGrade, newName, newPoint);
break;
}
}
public void deleteMember(int result) {
for(int i = result; i < gIndex-1; i++) {
g[i] = g[i+1];
}
gIndex--;
g[gIndex] = null;
}
}
//view
package kh.java.view;
import java.util.Scanner;
import kh.java.controller.PntMgr;
import kh.java.vo.Gold;
import kh.java.vo.Grade;
import kh.java.vo.Silver;
import kh.java.vo.Vip;
public class View {
Gold gold = new Gold();
Silver silver = new Silver();
Vip vip = new Vip();
PntMgr pm = new PntMgr();
Scanner sc = new Scanner(System.in);
public void main() {
while (true) {
System.out.println("\n<<<<< 포인트 관리 프로그램 >>>>>\n");
System.out.println("1. 회원 추가");
System.out.println("2. 회원 정보 출력 (전체)");
System.out.println("3. 회원 정보 출력 (1명)");
System.out.println("4. 회원 정보 수정");
System.out.println("5. 회원 정보 삭제");
System.out.print("선택 > ");
int sel = sc.nextInt();
switch (sel) {
case 1:
addMember();
break;
case 2:
printAll();
break;
case 3:
printOne();
break;
case 4:
updateMember();
break;
case 5:
deleteMember();
break;
}
}
}
public void addMember() {
System.out.println("\n<<<<< 회원 추가 >>>>>");
System.out.print("등급 입력(Silver/Gold/Vip): ");
String grade = sc.next();
System.out.print("이릅 입력 : ");
String name = sc.next();
System.out.print("포인트 입력 : ");
int point = sc.nextInt();
pm.addMember(grade, name, point);
System.out.println("회원 추가 완료!");
}
public void printAll() {
System.out.println("\n<<<<< 회원 전체 출력 >>>>>\n");
System.out.println("등급\t이름\t포인트\t보너스");
Grade[] g = pm.printAll();
for (int i = 0; i < pm.count(); i++) {
System.out
.println(g[i].getGrade() + "\t" + g[i].getName() + "\t" + g[i].getPoint() + "\t" + g[i].getBonus());
}
}
public void printOne() {
System.out.println("\n<<<<< 회원 정보 출력(1명) >>>>>");
System.out.print("검색 할 이름 이름 : ");
String name = sc.next();
int result = pm.search(name);
if (result == -1) {
System.out.println("찾으시는 회원이 없습니다.");
} else {
Grade g = pm.printOne(result);
System.out.println("등급\t이름\t포인트\t보너스");
System.out.println(g.getGrade() + "\t" + g.getName() + "\t" + g.getPoint() + "\t" + g.getBonus());
}
}
public void updateMember() {
System.out.println("\n<<<<< 회원 정보 수정 >>>>>");
System.out.print("수정 할 회원 이름 : ");
String name = sc.next();
System.out.print("수정 할 등급 : ");
String newGrade = sc.next();
System.out.print("수정 할 회원 이름 : ");
String newName = sc.next();
System.out.print("수정 할 포인트 : ");
int newPoint = sc.nextInt();
int result = pm.search(name);
if (result == -1) {
System.out.println("찾으시는 회원이 없습니다.");
} else {
pm.updateMember(result, newGrade, newName, newPoint);
System.out.println("수정을 완료하였습니다.!");
}
}
public void deleteMember() {
System.out.println("\n<<<<< 회원 정보 삭제 >>>>>");
System.out.print("삭제 할 회원 이름 : ");
String name = sc.next();
int result = pm.search(name);
if (result == -1) {
System.out.println("찾으시는 회원이 없습니다.");
} else {
pm.deleteMember(result);
System.out.println("삭제를 완료하였습니다.!");
}
}
}
package kh.java.run;
import kh.java.view.View;
public class PntStart {
public static void main(String[] args) {
// TODO Auto-generated method stub
View v = new View();
v.main();
}
}
view를 실행하면 다음과 같은 결과가 나온다.
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 1
<<<<< 회원 추가 >>>>>
등급 입력(Silver/Gold/Vip): Silver
이릅 입력 : 홍길동
포인트 입력 : 20
회원 추가 완료!
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 2
<<<<< 회원 전체 출력 >>>>>
등급 이름 포인트 보너스
Silver 홍길동 20 0.6
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 3
<<<<< 회원 정보 출력(1명) >>>>>
검색 할 이름 이름 : 홍길동
등급 이름 포인트 보너스
Silver 홍길동 20 0.6
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 4
<<<<< 회원 정보 수정 >>>>>
수정 할 회원 이름 : 홍길동
수정 할 등급 : Gold
수정 할 회원 이름 : 이순신
수정 할 포인트 : 50
수정을 완료하였습니다.!
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 2
<<<<< 회원 전체 출력 >>>>>
등급 이름 포인트 보너스
Gold 이순신 50 2.5
<<<<< 포인트 관리 프로그램 >>>>>
1. 회원 추가
2. 회원 정보 출력 (전체)
3. 회원 정보 출력 (1명)
4. 회원 정보 수정
5. 회원 정보 삭제
선택 > 5
<<<<< 회원 정보 삭제 >>>>>
삭제 할 회원 이름 : 이순신
삭제를 완료하였습니다.!
'이공계전문기술연수 > Java' 카테고리의 다른 글
<이공계전문기술연수> 16. Java 객체지향프로그래밍(OOP) 클래스 (0) | 2019.08.16 |
---|---|
<이공계전문기술연수> 15. Java 배열(2) (복사/버블정렬/로또/다차원) (0) | 2019.08.15 |
<이공계전문기술연수> 14. Java 배열(1) (0) | 2019.08.15 |
<이공계전문기술연수> 13. 참조 타입 / 참조 변수 (0) | 2019.08.15 |
<이공계전문기술연수> 12. Java 반복문: while문 / break문 (0) | 2019.08.13 |