======Ch.08 상속======
===== 클래스 상속 =====
:wr:**Phone.java** : 부모 클래스
package chapter08;
public class Phone {
String name;
String color;
String company;
void call() {
System.out.println("전화를 건다");
}
void receive() {
System.out.println("전화를 받다");
}
}
:wr:**SmartPhone.java** : 자식 클래스
package chapter08;
public class SmartPhone extends Phone {
public void installApp() {
System.out.println("앱 설치");
}
}
:wr:**SmartPhoneMain.java**
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 SuperEx {
public static void main(String[] args) {
Child child = new Child();
child.print();
}
}
class Parent {
int number = 3;
Parent() {
System.out.println("부모 객체 생성");
}
}
class Child extends Parent {
//int number = 2;
Child() {
System.out.println("자식 객체 생성");
}
void print() {
int number = 1;
System.out.println(number); // 메서드 지역변수 number
System.out.println(this.number); // 자신 객체의 number
System.out.println(super.number); // 부모 객체의 number
}
}
package chapter08;
public class Child extends Parent {
// int number = 2;
Child(){
System.out.println("자식 객체 생성");
}
viod print() {
int number = 1;
System.out.println(number); // 메서드 지역변수 number
System.out.println(this.number); // 자신 객체의 number
System.out.println(super.number); // 부모 객체의 number
}
}
**super()**
package chapter08;
public class SuperEx2 {
}
class Parent2 {
String name;
Parent2(String name) {
this.name = name;
}
}
class Child2 extends Parent2 {
Child2(String name) {
super(name);
}
}
===== 메서드 재정의 =====
**Car.java**
package chapter08;
public class Car {
String color;
String name;
public void go() {
System.out.println("전진");
}
void back() {
System.out.println("후진");
}
}
**Taxi.java**
package chapter08;
public class Taxi extends Car {
public void go() {
System.out.println("미터기를 켜고 전진");
}
}
**TaxiMain.java**
package chapter08;
public class TaxiMain {
public static void main(String[] args) {
Taxi t = new Taxi();
t.go();
int a = 10;
double b = a; // 자동형변환
double c = 10.5;
// int d = c; // 에러
//강제형변환
int d = (int)c;
System.out.println(b);
System.out.println(d);
}
}
===== 다형성 =====
**Parent.java**
package chapter08.poly;
public class Parent {
String name;
void walk() {
System.out.println("부모가 걷는다.");
}
void run() {
System.out.println("부모가 달린다.");
}
}
**Child.java**
package chapter08.poly;
public class Child extends Parent {
String name;
// 재정의 메서드
void run() {
System.out.println("자식이 달린다.");
}
// 추가된 메서드
void eat() {
System.out.println("자식이 먹는다.");
}
}
**PolyEx.java**
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.eat(); // 에러
}
}
package chapter08.poly;
public class PolyEx2 {
public static void main(String[] args) {
Parent p = new Child();
p.run();
// 자식클래스의 자료형으로 변환 (강제형변환)
Child c = (Child)p;
c.eat();
}
}
package chapter08.poly;
public class GraphicCard {
int memory;
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 그래픽 처리");
}
}
:wr:**매개변수의 다형성**
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();
GraphicCard gc = new GraphicCard();
g.display(gc);
Amd gc2 = new Amd();
g.display(gc2);
Nvidia gc3 = new Nvidia();
g.display(gc3);
}
}
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());
}
}
===== 상속관계에서 접근제한자 =====
Aclass
package chapter08.pkg1;
public class Aclass {
protected String varA;
String varA2;
protected void methodA() {
System.out.println("methodA");
}
void methodA2() {
System.out.println("methodA2");
}
}
AclassMain
package chapter08.pkg1;
public class AclassMain {
public static void main(String[] args) {
Aclass ac = new Aclass();
ac.varA = "varA";
ac.varA2 = "varA2";
ac.methodA();
ac.methodA2();
}
}
Bclass
package chapter08.pkg2;
import chapter08.pkg1.Aclass;
public class Bclass {
public void methodB() {
Aclass ac = new Aclass();
//ac.varA = "varA"; // 사용 불가
//ac.varA2 = "varA2"; // 사용 불가
//ac.methodA(); // 사용 불가
//ac.methodA2(); // 사용 불가
}
}
CClass
package chapter08.pkg2;
import chapter08.pkg1.Aclass;
public class CClass extends Aclass {
CClass() {
this.varA = "varA"; // 사용 가능
//this.varA2 = "varA2"; // 사용 불가
this.methodA(); // 사용 가능
//this.methodA2(); // 사용 불가
}
}
===== 추상클래스 =====
접근제한자 abstract 리턴타입 메서드명(매개변수);
package chapter08;
abstract class Shape {
String type;
Shape(String type) {
this.type = type;
}
abstract double area();
abstract double length();
}
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 + "]";
}
}
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.java**
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.java**
package chapter08;
public class Eagle extends Animal {
Eagle(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 하늘에서 잠을 잔다.");
}
}
**Tiger.java**
package chapter08;
public class Tiger extends Animal {
Tiger(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 산속에서 잠을 잔다.");
}
}
**Lion.java**
package chapter08;
public class Lion extends Animal {
Lion(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 숲속에서 잠을 잔다.");
}
}
**Shark.java**
package chapter08;
public class Shark extends Animal {
Shark(String type, String name) {
super(type, name);
}
void sleep() {
System.out.println(this.name +"은(는) 물속에서 잠을 잔다.");
}
}
**AnimalMain.java**
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
===== final 제어자 =====
public class SubClass extends String { // 사용불가
package chapter08;
public class FinalMethod {
// 재정의 가능한 메서드
void method() {
}
// 재정의가 불가능한 메서드
final void finalMethod() {
}
}
class SubFinalMethod extends FinalMethod {
void method() { // 재정의 가능
System.out.println("method() 재정의");
}
/*
void finalMethod() { // 재정의 불가
System.out.println("finalMethod() 재정의");
}
*/
}