상속성을 통해 자식 클래스에서 반복적으로 중복된 코드를 작성할 필요 없이, 부모 클래스에 선언된 코드를 재사용해서 유지 보수성이 매우 편리해진다.
//출력을 요구할때, .toString()이 붙으면 자기자신의 값이 나타나게 된다.
public class Exam_05 {
public static void main(String[] args) {
A05 ap = new A05(); //ap는 데이터의 주소값을 가지고있는 참조변수
System.out.println("ap.getClass = " + ap.getClass());
//Object클래스가 getClass를 갖고있어서 상속 받아서 출력가능함
System.out.println("ap.toString = "+ap.toString());
System.out.println("ap = "+ap);//ap뒤에 .toString() 생략되어있음 / ap라는 주소값을 출력
}
}
// 상속 관계
Class Person
Class Student extends Person // A Student is a person.
Class Police extends Person
// 포함 관계
Class Circle { // Circle has a Point.
Point p = new Point();
}
super는 부모로부터 받은 멤버와 자식의 멤버 이름이 같을때 부모 멤버에 접근하기 위해 사용한다.
오버라이드는 부모의 메소드와 똑같은 메소드를 자식이 만들어서 사용하고, 메소드 호출시 오버라이드된 메소드가 실행된다. 자식이 부모에 없는 예외전가를 만들 수는 없다.
// super 예제
import java.io.*;
class A06{
int a;
int b;
public A06() { //부모클래스의 생성자
a=10;
b=20;
}
public A06(int a, int b) {
this.a = a;
this.b = b;
}
public void disp() throws IOException{ //예외전가
//disp()메소드를 실행하는데 IOException이 발생할 수 있습니다. 만약에 발생이 되면
//disp()메소드를 호출한 곳에서 처리하겠습니다.
System.out.println("좌표 : ["+a+","+b+"]");
}
}
class B06 extends A06{ //a, b, c=30
int c;
int b;
public B06() {
//super(100, 200); //부모클래스의 생성자를 호출, super() - 부모클래스의 디폴트생성자
//= A06클래스의 A06()생성자를 호출
c=30;
b=100;
}
@Override //어노테이션(@:길잡이) //반드시 써야하는건 아니지만 써주면 프로그램에 도움이 됨
public void disp() throws IOException{ //예외전가(부모에 없는 예외전가를 자식은 만들 수 없다.)
//disp()메소드를 실행하는데 IOException이 발생할 수 있습니다. 만약에 발생이 되면
//disp()메소드를 호출한 곳에서 처리하겠습니다.
System.out.println("좌표 : ["+a+","+super.b+","+c+"]");
//super.b => 생략되어있는 this로 인해 B06클래스에 있는 b값(100)을 가져오기때문에 부모클래스에 접근하여 가져오기!
//super가 있을때는 20 출력, 없을때는 100(자기자신) 출력
}
}
public class Exam_06 {
public static void main(String[] args) throws IOException{ //예외처리 안하겠다고 눈속임하는 것
//부모이름과 자식이름을 같게 만드는 것 : 오버라이드
B06 ap = new B06();
ap.disp(); //호출된 곳(main)에서 처리해줘야함
/*
A06 ap = new A06();
ap.disp();
B06 bp = new B06();
bp.disp2();
*/
}
}
상속관계에서는 public처럼 접근이 가능하다. 상속관계가 아니라면 같은 패키지 내에서만 default처럼 접근 가능하다.
// sungjuk 패키지 protected 예제
package sungjuk;
public class SungJuk {
private String name;
private int kor, eng, rank;
protected int tot; // 상속관계가 아닌 Test01 클래스에서는 default처럼 접근 가능
public SungJuk(String name, int kor, int eng){
this.name = name; this.kor = kor; this.eng = eng;
tot = kor + eng; rank = 1;
}
public String getName() { return name; }
public void setKor(int kor) { this.kor = kor; }
public int getKor() { return kor; }
public void setEng(int eng) { this.eng = eng; }
public int getEng() { return eng; }
public void setTot() { tot = kor + eng; }
public int getTot() { return tot; }
public int getRank() { return rank; }
public void clearRank() { rank = 1; }
public void plusRank() { rank++; }
public void disp() {
System.out.println(name+"님의 총점은 " + tot +"점이고, 순위는 " + rank +"등 입니다.");
}
}
package sungjuk;
public class Test01 {
public static void main(String[] args) {
SungJuk sj = new SungJuk("aaa", 100, 100);
sj.tot = 100;
}
}
다음 포스팅은 2. 다형성, 3. 추상화