보리차
chapter 16 클래스의 상속 3: 상속의 목적 본문
상속을 하는 이유: 연관된 일련의 클래스들에 대해 공통적인 규약을 정의할 수 있다.
상속을 활용한 예시
인맥 관리 프로그램 작성
class UnivFriend { // 대학 동창
private String name;
private String major; // 전공
private String phone;
public UnivFriend(String na, String ma, String ph) {
name = na;
major = ma;
phone = ph;
}
public void showInfo() {
System.out.println("이름: " + name);
System.out.println("전공: " + major);
System.out.println("전화: " + phone);
}
}
class CompFriend { // 직장 동료
private String name;
private String department; // 부서
private String phone;
public CompFriend(String na, String ma, String ph) {
name = na;
department = de;
phone = ph;
}
public void showInfo() {
System.out.println("이름: " + name);
System.out.println("부서: " + department);
System.out.println("전화: " + phone);
}
}
class Myfriends {
public static void main(String[] args) {
// 대학 동창의 관리를 위한 배열과 변수
UnivFriend[] ufrns = new UnivFriend[5];
int ucnt = 0;
// 직장 동료의 관리를 위한 배열과 변수
ComFriend[] cfrns = new ComFriend[5];
int ccnt = 0;
// 대학 동창의 정보 저장
ufrns[ucnt++] = new UnivFriend("LEE", "Computer", "010-333-555");
ufrns[ucnt++] = new UnivFriend("SEO", "Electronics", "010-222-444");
// 직장 동료의 정보 저장
cfrns[ccnt++] = new CompFriend("YOON", "R&D 1", "02-123-999");
cfrns[ccnt++] = new CompFriend("PARK", "R&D 2", "02-321-777");
// 모든 동창 및 동료의 정보 전체 출력
for(int i=0; i<ucnt; i++) {
ufrns[i].showInfo();
System.out.println();
}
for(int i=0; i<ccnt; i++) {
cfrns[i].showInfo();
System.out.println();
}
}
}
위 코드의 main메소드를 보면 다음 사실들을 알 수 있다.
- 인스턴스를 저장하는 배열이 두 개이다.
- 저장에 필요한 배열과 변수가 다르기 때문에 대학동창과 직장동료의 정보를 저장하는 과정이 나뉜다.
- 마찬가지로 저장된 정보를 모두 출력할 때 두개의 for문을 작성해야 한다.
즉 클래스를 다르게 정의하면서 배열을 여러 개 생성해야 하기 때문에 무엇을 하건 그 과정이 둘로 나뉘게 된다. 이러한 설계는 프로그램을 더 복잡하게 만든다.
인맥 관리 프로그램의 문제를 상속으로 해결
class Friend {
protected String name;
protected String phone;
public Friend(String na, String ph) {
name = na;
phone = ph;
}
public void showInfo() {
System.out.println("이름: " + name);
System.out.println("전화: " + phone);
}
}
class UnivFriend extends Friend {
private String major;
public UnivFriend(String na, String ma, String ph) {
super(na, ph);
major = ma;
}
public void showInfo() {
super.showInfo();
System.out.println("전공: " + major);
}
}
class CompFriend extends Friend {
private String department;
public CompFriend(String na, String ma, String ph) {
super(na, ph);
department = de;
}
public void showInfo() {
super.showInfo();
System.out.println("부서: " + department);
}
}
class Myfriends2 {
public static void main(String[] args) {
Friend[] frns = new Friend[10];
int cnt = 0;
frns[cnt++] = new UnivFriend("LEE", "Computer", "010-333-555");
frns[cnt++] = new UnivFriend("SEO", "Electronics", "010-222-444");
frns[cnt++] = new CompFriend("YOON", "R&D 1", "02-123-999");
frns[cnt++] = new CompFriend("PARK", "R&D 2", "02-321-777");
// 모든 동창 및 동료의 정보 전체 출력
for(int i=0; i<cnt; i++) {
frns[i].showInfo(); // 오버라이딩 한 메소드가 호출.
System.out.println();
}
}
}
위의 예제에서는 UnivFriend 클래스와 CompFriend 클래스가 Friend 클래스를 상속하게 함으로써 다음과 같은 효과를 얻게 되었다.
- 인스턴스를 저장하는 배열이 하나이다
Friend 클래스를 상속하는 클래스가 더 추가되어도 이 사실은 변함이 없다.
- 정보를 저장하는 과정이 나뉘지 않는다.
하나의 배열에 모든 인스턴스를 저장할 수 있다.
- 저장된 정보를 모두 출력할 때 하나의 for문으로 충분하다.
하나의 배열이 사용되었고 또 메소드 오버라이딩이 도움이 되었다.
Object 클래스
모든 클래스는 Object 클래스를 상속한다.
즉 class MyClass {....} 은 class Myclass extends Object {....} 와 같다.
class Myclass extends OtherClass {....}
물론 위처럼 상속하는 클래스가 있는 경우에는 Object 클래스를 상속하지 않지만 결국 OtherClass가 Object 클래스를 상속하므로 자바의 모든 클래스는 Object 클래스를 직접 혹은 간접적으로 상속하게 되어있다. 이는 자바의 모든 인스턴스에 공통된 기준 및 규약을 적용하기 위함이다.
final 선언
클래스를 정의하는데 있어서 해당 클래스를 다른 클래스가 상속하는 것을 원치 않는다면, 다음과 같이 final 선언을 추가하면 된다.
메소드의 정의에 final 선언을 추가하여 해당 메소드의 오버라이딩을 허용하지 않을 수도 있다.
public final class MyLastCLS {...}
class Simple {
public final void func(int n) {...}
}
@Override
클래스를 설계하다보면 오버라이딩을 목적으로 함수를 구현했지만 매개변수 형과 반환형이 달라 오버라이딩 되지 않는 실수를 흔하게 한다. 이러한 상황을 방지하기 위해 '어노테이션'을 사용할 수 있다.
어노테이션: 자바 컴파일러에게 메시지를 전달하는 목적의 메모
@Override를 함수선언 위에 적어주면 이 메소드가 상위 클래스의 메소드를 오버라이딩 할 목적으로 정의되었음을 알려주고 컴파일러는 오버라이딩이 제대로 되었는지 확인한다.
'Java' 카테고리의 다른 글
chapter 18 예외처리(Exception Handling) (0) | 2022.02.06 |
---|---|
chapter 17 인터페이스와 추상 클래스 (0) | 2022.02.06 |
chapter 15 클래스의 상속 2: 오버라이딩 (0) | 2022.01.28 |
chapter 14 클래스의 상속 1: 상속의 기본 (0) | 2022.01.28 |
chapter 13 배열(Array) (0) | 2022.01.28 |