부모클래스
package chapter08;
public class Phone {
String name;
String color;
String company;
void call() {
System.out.println("전화를 건다");
}
void receive() {
System.out.println("전화를 받다");
}
}
자식클래스
package chapter08;
public class SmartPhone extends Phone {
public void installApp() {
System.out.println("앱 설치");
}
}
클래스 사용
package chapter08;
public class SmartPhoneMain {
public static void main(String[] args) {
Phone p = new Phone();
p.name = "전화기";
p.company = "현대";
p.color = "화이트";
System.out.println("Phone 출력");
System.out.println(p.name);
System.out.println(p.company);
System.out.println(p.color);
p.call();
p.receive();
SmartPhone sp = new SmartPhone();
sp.name = "갤럭시";
sp.company = "삼성";
sp.color = "블랙";
System.out.println("SmartPhone 출력");
System.out.println(sp.name);
System.out.println(sp.company);
System.out.println(sp.color);
sp.call();
sp.receive();
sp.installApp();
}
}
부모클래스
package chapter08;
public class Phone {
// 기본 생성자 생략
public Phone() {
}
}
자식클래스
package chapter08;
public class SmartPhone extends Phone {
// 기본생성자 생략가능
public SmartPhone () {
// super() -> 부모기본생성자 생략가능
super() {
}
}
}
클래스 사용
package chapter08;
public class SmartPhoneMain {
public static void main(String[] args) {
// SmartPhone() -> super() --> 부모인스턴스 생성 --> 자식인스턴스 생성
SmartPhone sp = new SmartPhone();
}
}
부모클래스
package chapter08;
public class Phone {
String name;
String color;
String company;
// 오버로딩 생성자
public Phone(String name, String color, String company) {
this.name = name;
this.color = color;
this.company = company;
}
}
자식클래스
package chapter08;
public class SmartPhone extends Phone {
public SmartPhone() {
// 부모 클래스 생성자 호출
super("갤럭시", "블랙", "삼성");
}
}
클래스 사용
package chapter08;
public class SmartPhoneMain {
public static void main(String[] args) {
// SmartPhone() -> super() --> 부모인스턴스 생성 --> 자식인스턴스 생성
SmartPhone p = new SmartPhone();
}
}
부모클래스
package chapter08;
public class Car {
String color;
String name;
public void go() {
System.out.println("전진");
}
void back() {
System.out.println("후진");
}
}
자식클래스
package chapter08;
public class Taxi extends Car {
public void go() {
System.out.println("미터기를 켜고 전진");
}
}
클래스 실행
package chapter08;
public class TaxiMain {
public static void main(String[] args) {
Taxi t = new Taxi();
t.go();
}
}
class MethodSuper{
final void superMethod(){
System.out.println("super method");
}
}
class MethodChild extends MethodSuper{
void superMethod(){
System.out.println("child method");
}
}
public class FinalMethod{
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
public final class FinalClass {
int x;
}
class ChildClass extends FinalClass{
}
부모 클래스
package chapter08.poly;
public class Parent {
String name;
void walk() {
System.out.println("부모가 걷는다.");
}
void run() {
System.out.println("부모가 달린다.");
}
}
자식 클래스
package chapter08.poly;
public class Child extends Parent {
String name;
// override
void run() {
System.out.println("자식 달리기");
}
// new
void game() {
System.out.println("자식 게임");
}
}
다형성 확인 - 자동형변환
package chapter08.poly;
public class PolyEx {
public static void main(String[] args) {
Child c = new Child();
c.run();
// 부모클래스의 자료형으로 선언 (자동형변환)
Parent p = new Child();
p.run(); // 재정이된 메서드가 실행
// p.game(); // 에러
}
}
다형성 - 강제형변환
package chapter08.poly;
public class PolyEx2 {
public static void main(String[] args) {
Parent p = new Child();
p.run();
// 자식클래스의 자료형으로 변환 (강제형변환)
Child c = (Child)p;
c.game();
}
}
부모 클래스
package chapter08;
public class GraphicCard {
public void process() {
System.out.println("그래픽 처리");
}
}
자식 클래스
package chapter08.poly;
public class Amd extends GraphicCard {
public void process() {
System.out.println("AMD 그래픽 처리");
}
}
자식 클래스
package chapter08.poly;
public class Nvidia extends GraphicCard {
public void process() {
System.out.println("Nvidia 그래픽 처리");
}
}
다형성 - 부품 교체 하듯 사용
package chapter08.poly;
public class Computer {
public static void main(String[] args) {
GraphicCard gc = new GraphicCard();
gc.process(); // 원래 그래픽카드 process
gc = new Amd();
gc.process();
gc = new Nvidia();
gc.process();
}
}
다형성 - 매개변수에서 사용
package chapter08.poly;
public class Game {
void display(GraphicCard gc) {
gc.process();
}
}
package chapter08.poly;
public class Computer2 {
public static void main(String[] args) {
Game g = new Game();
Amd gc2 = new Amd();
g.display(gc2);
Nvidia gc3 = new Nvidia();
g.display(gc3);
// 다형성으로 처리
GraphicCard gc = new GraphicCard();
g.display(gc);
gc = new Amd();
g.display(gc);
gc = new Nvidia();
g.display(gc);
}
}
class Circle{
int x; // 원점 x 좌표
int y; // 원점 y 좌표
int r; // 반지름
}
class Point{
int x; // x 좌표
int y; // y 좌표
}
class Circle{
Point p = new Point();
int r; // 반지름
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
Point() {
this(0,0);
}
String getXY() {
return "("+x+","+y+")"; // x와 y의 값을 문자열로 반환
}
}
class Shape {
String color = "black";
void draw() {
System.out.printf("[color=%s]%n", color);
}
}
class Circle extends Shape {
Point center; // 원의 원점좌표
int r; // 반지름
Circle() {
this(new Point(0, 0), 100); // Circle(Point center, int r)를 호출
}
Circle(Point center, int r) {
this.center = center;
this.r = r;
}
void draw() { // 원을 그리는 대신에 원의 정보를 출력하도록 했다.
System.out.printf("[center=(%d, %d), r=%d, color=%s]%n", center.x, center.y, r, color);
}
}
class Triangle extends Shape {
Point[] p = new Point[3];
Triangle(Point[] p) {
this.p = p;
}
void draw() {
System.out.printf("[p1=%s, p2=%s, p3=%s, color=%s]%n", p[0].getXY(), p[1].getXY(), p[2].getXY(), color);
}
}
class DrawShape {
public static void main(String[] args) {
Point[] p = { new Point(100, 100),
new Point(140, 50),
new Point(200, 100)
};
Triangle t = new Triangle(p);
Circle c = new Circle(new Point(150, 150), 50);
t.draw(); // 삼각형을 그린다.
c.draw(); // 원을 그린다.
}
}
package chapter08.poly;
public class ObjectEx {
public static void main(String[] args) {
allObject(new GraphicCard());
allObject(new Amd());
allObject(new Nvidia());
allObject("안녕");
}
public static void allObject(Object obj) {
System.out.println(obj.toString());
if(obj instanceof GraphicCard) {
GraphicCard gc = (GraphicCard)obj;
gc.process();
}
}
}
추상클래스
abstract class Shape {
String type;
Shape(String type) {
this.type = type;
}
abstract double area();
abstract double length();
}
추상클래스 상속 받아 구현 1
class Circle extends Shape{
int r;
Circle(int r) {
super("원");
this.r = r;
}
@Override
double area() {
return r * r * Math.PI;
}
@Override
double length() {
return 2 * r * Math.PI;
}
@Override
public String toString() {
return "Shape [type=" + type + ", r=" + r + "]";
}
}
추상클래스 상속 받아 구현 2
class Rectangle extends Shape {
int width, height;
Rectangle(int width, int height) {
super("사각형");
this.width = width;
this.height = height;
}
@Override
double area() {
return width * height;
}
@Override
double length() {
return 2 * (width + height);
}
@Override
public String toString() {
return "Shape [type=" + type + ", width=" + width + ", height=" + height+"]";
}
}
테스트
public class ShapeEx {
public static void main(String[] args) {
Shape[] shapes = new Shape[2];
shapes[0] = new Circle(10);
shapes[1] = new Rectangle(5,5);
for(Shape s : shapes) {
System.out.println(s);
System.out.println("넓이:"+s.area()+" 둘레:"+s.length());
}
}
}
부모 클래스 Animal
package chapter08;
public class Animal {
String type;
String name;
Animal(String type, String name) {
this.type = type;
this.name = name;
}
void sleep() {
System.out.println(this.name +"은(는) 잠을 잔다.");
}
}
자식클래스 Eagle
package chapter08;
public class Eagle extends Animal {
Eagle(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 하늘에서 잠을 잔다.");
}
}
자식클래스 Tiger
package chapter08;
public class Tiger extends Animal {
Tiger(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 산속에서 잠을 잔다.");
}
}
자식클래스 Lion
package chapter08;
public class Lion extends Animal {
Lion(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 숲속에서 잠을 잔다.");
}
}
자식클래스 Shark
package chapter08;
public class Shark extends Animal {
Shark(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 물속에서 잠을 잔다.");
}
}
테스트
package chapter08;
public class AnimalMain {
public static void main(String[] args) {
Animal[] ani = new Animal[4];
Animal eagle = new Eagle("조류", "독수리");
Animal tiger = new Tiger("포유류", "호랑이");
Animal lion = new Lion("포유류", "사자");
Animal shark = new Shark("어류", "상어");
ani[0] = eagle;
ani[1] = tiger;
ani[2] = lion;
ani[3] = shark;
for (int i=0; i<ani.length; i++) {
ani[i].sleep();
}
System.out.println("=========================");
for(Animal a : ani) {
a.sleep();
}
}
}
package chapter08;
import java.util.ArrayList;
public class AnimalMain2 {
public static void main(String[] args) {
ArrayList ani = new ArrayList();
Animal eagle = new Eagle("조류", "독수리");
Animal tiger = new Tiger("포유류", "호랑이");
Animal lion = new Lion("포유류", "사자");
Animal shark = new Shark("어류", "상어");
ani.add(eagle);
ani.add(tiger);
ani.add(lion);
ani.add(shark);
for (int i=0; i<ani.size(); i++) {
Animal a = (Animal)ani.get(i);
a.sleep();
}
System.out.println("=========================");
for(Object o : ani) {
Animal a = (Animal)o;
a.sleep();
}
}
}
package chapter08;
import java.util.ArrayList;
public class AnimalMain2 {
public static void main(String[] args) {
// <자료타입지정> : 형변화 불필요
ArrayList<Animal> ani = new ArrayList<Animal>();
Animal eagle = new Eagle("조류", "독수리");
Animal tiger = new Tiger("포유류", "호랑이");
Animal lion = new Lion("포유류", "사자");
Animal shark = new Shark("어류", "상어");
ani.add(eagle);
ani.add(tiger);
ani.add(lion);
ani.add(shark);
for (int i=0; i<ani.size(); i++) {
ani.get(i).sleep();;
}
System.out.println("=========================");
for(Animal a : ani) {
a.sleep();
}
}
}