상속이 도움이 될 때
연관된 일련의 클래스들에 대해 공통적 규약을 정의 할 수 있다.
class UnivFriend{
private String name;
private String major;
private String phone;
public UnivFriend(String name, String major, String phone) {
this.name = name;
this.major = major;
this.phone = phone;
}
public void showInfo(){
System.out.println("name = " + name);
System.out.println("major = " + major);
System.out.println("phone = " + phone);
}
}
class ComFriend{
private String name;
private String department;
private String phone;
public ComFriend(String name, String department, String phone) {
this.name = name;
this.department = department;
this.phone = phone;
}
public void showInfo(){
System.out.println("name = " + name);
System.out.println("department = " + department);
System.out.println("phone = " + phone);
}
}
public class MyFriends {
public static void main(String[] args) {
UnivFriend[] friend = new UnivFriend[5];
int unct = 0;
ComFriend[] friends = new ComFriend[5];
int fcnt = 0;
friend[unct++] = new UnivFriend("Lee", "Computer" , "010-1234-5678");
friend[unct++] = new UnivFriend("kim", "bio" , "010-568-5678");
friends[fcnt++] = new ComFriend("Hwang", "Computer", "01012345678");
friends[fcnt++] = new ComFriend("lee", "Korean", "01012345678");
for (int i = 0; i < unct; i++) {
friend[i].showInfo();
System.out.println();
}
for (int i = 0; i < fcnt; i++) {
friends[i].showInfo();
System.out.println();
}
}
}
인스턴스를 저장하는 배열이 2개
대학 동창의 정보를 저장하는 과정, 직장 동료의 정보를 저장
저장에 필요한 배열과 변수가 다르기 때문
저장된 정보를 모두 출력할 때, 두개 for문을 작성
배열과 변수가 다르기 때문
Main 메소드의 핵삼은 -> 배열이 2개 이므로, 무엇을 하던 그 과정이 둘로 나뉜다.
이를 상속으로 해결할 수 있다.
하나의 배열에 데이터를 저장, 하나의 메소드 또는 하나의 반복문으로 데이터의 삭제 및 검색이 가능
public class MyFriend2 {
public static void main(String[] args) {
Friend[] friend2 = new Friend[10];
int cnt = 0;
friend2[cnt++] = new Unifriend1("Hwang", "123456789", "bio");
friend2[cnt++] = new Unifriend1("Seo", "123456789", "Korean");
friend2[cnt++] = new ComFriend1("Seo", "123456789", "Korean");
friend2[cnt++] = new ComFriend1("Seo", "123456789", "Korean");
for (int i = 0; i < cnt; i++) {
friend2[i].showInfo();
System.out.println();
}
}
}
class Friend{
protected String name;
protected String phone;
public Friend(String name, String phone) {
this.name = name;
this.phone = phone;
}
public void showInfo(){
System.out.println("name = " + name);
System.out.println("phone = " + phone);
}
}
class Unifriend1 extends Friend{
private String major;
public Unifriend1(String name, String phone, String major) {
super(name, phone);
this.major = major;
}
public void showInfo(){
super.showInfo();
System.out.println("major = " + major);
}
}
class ComFriend1 extends Friend{
private String department;
public ComFriend1(String name, String phone, String department) {
super(name, phone);
this.department = department;
}
@Override
public void showInfo() {
super.showInfo();
System.out.println("department = " + department);
}
}
UniFriend와 CompFriend를 Friend가 상속하게 함
인스턴스를 저장하는 배열이 하나.
Friend 클래스를 상속하는 클래스가 더 추가되어도 변함없음
정보를 저장하는 과정이 나뉘지 X
하나의 배열에 모든 인스턴스를 저장할 수 있다.
저장된 정보를 모두 출력할 때 하나의 for문으로 충분
하나의 배열이 사용, 또 메소드 오버라이딩이 도움
Object 클래스와 final 선언 그리고 @Override
모든 클래스는 Object 클래스를 상속
모든 클래스는 Object 클래스에 모두 묶여있다.
자바의 모든 클래스는 Object 클래스를 직간접적으로 상속
모든 인스턴스는 위 메소드 인자가 될 수 있다. 메소드는 인자로 전달된 인스턴스의 다음 메소드를 호출. 이 메소드는 Object 클래스에 정의 되어 있는 메소드 이므로, 모든 인스턴스를 대상으로 호출이 가능.
public class Main1 {
public static void main(String[] args) {
Cake c1 = new Cake();
Cake c2 = new CheeseCake();
System.out.println(c1);
System.out.println();
System.out.println(c2);
System.out.println();
}
}
class Cake {
public String toString(){
System.out.println(super.toString());
return "My birthday";
}
}
class CheeseCake extends Cake{
public String toString(){
return "My birthday cheese cake";
}
}
Object 클래스의 toString 메소드를 호출하여 문자열로 출력
클래스의 이름과 @의 뒤를 이어 이해할 수 없는 숫자 출력 -> 클래스를 정의할 때 toString 메소드를 가급적 오버라이딩 하라고 조언.
클래스와 메소드의 final 선언
해당 클래스를 다른 클래스가 상속하는 것을 원치 않는다면, final 사용.
@Override
public class Main2 {
public static void main(String[] args) {
ParentAdder adder = new ChildAdder();
System.out.println(adder.add(3,4));
}
}
class ParentAdder {
public int add(int a, int b) {
return a + b;
}
}
class ChildAdder extends ParentAdder {
public int add(double a, double b) {
return (int) (a + b);
}
}
잘못된 부분은 -> 매개변수와 반환형이 달랐기 때문. 이 상황을 방지하기 위함 = @Override를 사용.