package test;
public class 할아버지 {
// 조상 클래스 할아버지
// 메서드 노래하기() "노래를 한다"
public void 노래하기() {
System.out.println("노래를 한다");
}
}
package test;
public class 아버지 extends 할아버지 {
// 부모 클래스 아버지
// 메서드 일하기() "일을 한다"
public void 일하기() {
System.out.println("일을 한다");
}
}
package test;
public class 자식 extends 아버지 {
// 자식 클래스 자식
// 메서드 게임하기() "게임을 한다"
// 노래하기() 메서드 오버라이딩(메서드 재정의)
// "노래를 아주 잘한다"
public void 게임하기() {
System.out.println("게임을 한다");}
@Override
public void 노래하기() {
System.out.println("노래를 아주 잘한다");
}
}
package test;
public class Test1 {
public static void main(String[] args) {
// 자식 클래스 객체 생성
// 메서드() 호출 노래하기() 일하기() 게임하기()
자식 son = new 자식();
son.노래하기();
son.일하기();
son.게임하기();
}
}
부모 자식 클래스가 다른 package에 있을 때
import : 폴더가 틀리면 위치를 지정해서 가져옴
import 폴더위치.파일
ctrl space => 목록 선택, ctrl shift o
할아버지 클래스는 com.itwillbs.p1 위치
아버지 클래스는 com.itwillbs.p2 위치
또는 ctrl shift o 눌리면 import 자동 생성됨
메서드 이름은 동일한데 메서드 내에 동작내용 다름
상속에서 생성자 super(), super.메서드()
상위클래스 공통 부분의 메서드를 제공하고 하위클래스에서 추가요소를 더하면 코드 양도 줄어들고 유지보수도 편리
Shape 클래스 (부모)
package test;
public class Shape {
// Shape 도형 클래스 (부모)
// prn() "도형을 그린다"
protected void prn() {
System.out.println("도형을 그린다");
}
}
package test;
public class Circle extends Shape {
// Circle 원 클래스 (자식) 상속 Shape
// 메서드 오버라이딩 prn() "원을 그린다"
protected void prn() {
System.out.println("원을 그린다");
}
}
package test;
public class Tri extends Shape {
// Tri 삼각형 클래스 (자식) 상속 Shape
// 메서드 오버라이딩 prn() "삼각형을 그린다"
protected void prn() {
System.out.println("삼각형을 그린다");
}
}
package test;
public class Rec extends Shape {
// Rec 사각형 클래스 (자식) 상속 Shape
// 메서드 오버라이딩 prn() "사각형을 그린다"
protected void prn() {
System.out.println("사각형을 그린다");
}
}
package test;
public class Test2 {
public static void main(String[] args) {
Circle c = new Circle();
c.prn(); // 원을 그린다
Tri t =new Tri();
t.prn(); // 삼각형을 그린다
Rec r=new Rec();
r.prn(); // 사각형을 그린다
}
}
참조형 자동으로 형변화
부모 = 자식 객체생성
부모 = 자식 (업캐스팅 : 부모형으로 자동형변환)
메서드호출 () 다형성
부모 참조변수 , 메서드 동일
자식이 재정의한 메서드 구현내용 다양함
Shape s = new Circle();
s.prn(); // 원을 그린다
s = new Tri();
s.prn(); // 삼각형을 그린다
s = new Rec();
s.prn(); // 사각형을 그린다
package test;
public class School {
// 메서드 정의 draw(원, 삼각형, 사각형)
// "모든 도형 그리기"
// prn() 메서드 호출
public void draw(Shape s) {
System.out.println("모든 도형 그리기");
s.prn();
}
}
School l = new School();
l.draw(c); // 모든 도형 그리기 원을 그린다
l.draw(t); // 모든 도형 그리기 삼각형을 그린다
l.draw(r); // 모든 도형 그리기 사각형을 그린다
package test;
public class Animal {
public void move() {
System.out.println("동물이 움직인다");
}
}
package test;
public class Tiger extends Animal {
// 메서드 오버라이딩 부모의 move 메서드 재정의
@Override
public void move() {
System.out.println("호랑이 네발로 움직인다");
}
}
package test;
public class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리 날개로 움직인다");
}
}
// Tiger 객체생성
// 메서드 호출
Animal a = new Tiger();
a.move(); // 호랑이 네발로 움직인다
// Eagle 객체생성
// 메서드 호출
a = new Eagle();
a.move(); // 독수리 날개로 움직인다
package test;
public class Zoo {
public void setEagle(Eagle e) {
System.out.println("Eagle 전달 받음");
e.move();
}
public void setTiger(Tiger t) {
System.out.println("Tiger 전달 받음");
t.move();}
public void setAnimal(Animal a) {
System.out.println("모든 동물 전달 받음");
a.move();
}
}
Tiger t = new Tiger();
Eagle e = new Eagle();
Zoo z = new Zoo();
z.setEagle(e); // Eagle 전달 받음 독수리 날개로 움직인다
z.setTiger(t); // Tiger 전달 받음 호랑이 네발로 움직인다
z.setAnimal(e); // 모든 동물 전달 받음 독수리 날개로 움직인다
z.setAnimal(t); // 모든 동물 전달 받음 호랑이 네발로 움직인다