상속
* 매 클래스마다 중복된 필드, 메소드들을 하나의 클래스(부모)로 정의해두고
* 다른 클래스(자식)에서 해당 부모 클래스의 내용물을 가져다 쓰는 개념.
*
* [상속의 장점]
* 중복된 코드를 부모 클래스에서 공통적으로 관리, 새로운 코드를 추가, 수정하기 용이함.
* => 보다 적은 양의 코드로, 새로운 클래스들을 관리 가능
* => 상속 사용 안할 시, 수정할때마다 매번 각각의 클래스의 코드를 수정해주어야 함.
* => 프로그램의 생산성을 높여줄 수 있음
*
* [상속의 특징]
* 클래스간의 상속은 다중상속이 불가능함. 단일상속만 가능함.
* => 나를 기준으로 부모님이 여러명이면 안됨
* 자바에서 제공하는 또는 내가 만든 모든 클래스는 Object라는 클래스의 후손임.
* => extends Object가 명시되어 있지는 않지만, 생략되어 있음.
* Object클래스에 있는 메소드를 가져다 쓸 수 있음.
* Object클래스에 있는 메소드가 맘에 안든다면, 오버라이딩하여 입맛에 맞게 사용 가능.
*
상속 전
1. Desktop클래스
package com.kh.chap01_beforeVSafter.before.model.vo;
public class Desktop {
private String brand;
private String pCode;
private String pName;
private int price;
private boolean allInOne;
public Desktop() {}
public Desktop(String brand, String pCode, String pName,
int price, boolean allInOne) {
this.brand = brand;
this.pCode = pCode;
this.pName = pName;
this.price = price;
this.allInOne = allInOne;
}
public void setBrand(String brand) { this.brand = brand; }
public void setpCode(String pCode) { this.pCode = pCode; }
public void setpName(String pName) { this.pName = pName; }
public void setPrice(int price) { this.price = price; }
public void setAllInOne(boolean allInOne) { this.allInOne = allInOne; }
public String getBrand() { return brand; }
public String getpCode() { return pCode; }
public String getpName() { return pName; }
public int price() { return price; }
public boolean getAllInOne() { return allInOne; }
public String information() {
return brand+", "+pCode+", "+pName+", "+price+", "+allInOne;
}
}
2. SmartPhone클래스
package com.kh.chap01_beforeVSafter.before.model.vo;
public class SmartPhone {
private String brand;
private String pCode;
private String pName;
private int price;
private String mobileAgency;
public SmartPhone() {}
public SmartPhone(String brand, String pCode, String pName,
int price, String mobileAgency) {
this.brand = brand;
this.pCode = pCode;
this.pName = pName;
this.price = price;
this.mobileAgency = mobileAgency;
}
public void setBrand(String brand) { this.brand = brand; }
public void setpCode(String pCode) { this.pCode = pCode; }
public void setpName(String pName) { this.pName = pName; }
public void setPrice(int price) { this.price = price; }
public void setMobileAgency(String mobileAgency) { this.mobileAgency = mobileAgency; }
public String getBrand() { return brand; }
public String getpCode() { return pCode; }
public String getpName() { return pName; }
public int getPrice() { return price; }
public String getMobileAgency() { return mobileAgency; }
public String information() {
return brand+", "+pCode+", "+pName+", "+price+", "+mobileAgency;
}
}
3. Tv
package com.kh.chap01_beforeVSafter.before.model.vo;
public class Tv {
private String brand;
private String pCode;
private String pName;
private int price;
private int inch;
public Tv() {}
public Tv(String brand, String pCode, String pName,
int price, int inch) {
this.brand = brand;
this.pCode = pCode;
this.pName = pName;
this.price = price;
this.inch = inch;
}
public void setBrand(String brand) { this.brand = brand; }
public void setpCode(String pCode) { this.pCode = pCode; }
public void setpName(String pName) { this.pName = pName; }
public void setPrice(int price) { this.price = price; }
public void setInch(int inch) { this.inch = inch; }
public String getBrand() { return brand; }
public String getpCode() { return pCode; }
public String getpName() { return pName; }
public int getPrice() { return price; }
public int getInch() { return inch; }
public String information() {
return brand+", "+pCode+", "+pName+", "+price+", "+inch;
}
}
4. Run클래스
package com.kh.chap01_beforeVSafter.before.run;
import com.kh.chap01_beforeVSafter.before.model.vo.Desktop;
import com.kh.chap01_beforeVSafter.before.model.vo.SmartPhone;
import com.kh.chap01_beforeVSafter.before.model.vo.Tv;
public class BeforeRun {
public static void main(String[] args) {
Desktop d = new Desktop("삼성","d-01","짱짱데스크탑",2000000,true);
SmartPhone s = new SmartPhone("애플","s-01","아이폰",1000000,"SKT");
Tv t = new Tv("엘지","t-01","고오급벽걸이티비",3000000,60);
System.out.println(d.information());
System.out.println(t.information());
System.out.println(s.information());
}
}
상속 후
1. 부모클래스
Product 클래스
package com.kh.chap01_beforeVSafter.after.model.vo;
public class Product {
private String brand;
private String pCode;
private String pName;
private int price;
public Product() {}
public Product(String brand, String pCode, String pName, int price) {
this.brand = brand;
this.pCode = pCode;
this.pName = pName;
this.price = price;
}
public String getBrand() { return brand; }
public void setBrand(String brand) { this.brand=brand; }
public String getpCode() { return pCode; }
public void setpCode(String pCode) { this.pCode = pCode; }
public String getpName() { return pName; }
public void setpName(String pName) { this.pName = pName; }
public int getPrice() { return price; }
public void setPrice(int price) { this.price = price; }
public String information() {
return brand+", "+pCode+", "+pName+", "+price;
}
}
2. 자식클래스
Desktop 클래스
package com.kh.chap01_beforeVSafter.after.model.vo;
public class Desktop extends Product {
private boolean allInOne;
public Desktop() {}
public Desktop(String brand, String pCode, String pName, int price,
boolean allInOne) {
super(brand,pCode,pName,price);
this.allInOne = allInOne;
}
public boolean getAllInOne() {
return allInOne;
}
public void setAllInOne(boolean allInOne) {
this.allInOne = allInOne;
}
public String information() {
return super.information() + ", "+allInOne;
}
}
SmartPhone 클래스
package com.kh.chap01_beforeVSafter.after.model.vo;
public class SmartPhone extends Product{
private String mobileAgency;
public SmartPhone() {}
public SmartPhone(String brand, String pCode, String pName, int price
, String mobileAgency) {
super(brand, pCode, pName, price);
this.mobileAgency = mobileAgency;
}
public String getMobileAgency() {
return mobileAgency;
}
public void setMobileAgency(String mobileAgency) {
this.mobileAgency = mobileAgency;
}
public String information() {
return super.information()+", "+mobileAgency;
}
}
Tv클래스
package com.kh.chap01_beforeVSafter.after.model.vo;
public class Tv extends Product {
private int inch;
public Tv() {}
public Tv(String brand, String pCode, String pName, int price
, int inch) {
super(brand,pCode,pName,price);
this.inch = inch;
}
public int getInch() {
return inch;
}
public void setInch(int inch) {
this.inch = inch;
}
public String information() {
return super.information()+", "+inch;
}
}
Run 클래스
package com.kh.chap01_beforeVSafter.after.run;
import com.kh.chap01_beforeVSafter.after.model.vo.Desktop;
import com.kh.chap01_beforeVSafter.after.model.vo.SmartPhone;
import com.kh.chap01_beforeVSafter.after.model.vo.Tv;
public class AfterRun {
public static void main(String[] args) {
Desktop d = new Desktop("삼성","d-01","짱짱데스크탑",2000000,true);
System.out.println(d.information());
SmartPhone s = new SmartPhone();
s.setBrand("애플");
s.setpCode("s-01");
s.setpName("아이폰");
s.setPrice(1000000);
s.setMobileAgency("SKT");
System.out.println(s.information());
Tv t = new Tv("엘지","t-01","고오급벽걸이TV",3000000,60);
System.out.println(t.getBrand());
System.out.println(t.getpCode());
System.out.println(t.getpName());
System.out.println(t.getPrice());
System.out.println(t.getInch());
System.out.println(t.information());
}
오버라이딩, 동적바인딩
* 오버라이딩
* 상속받고 있는 부모클래스의 메소드를 자식 클래스에서 재정의(재작성)하는 것.
* 즉, 부모가 제공하고 있는 메소드를 자식이 일부 고쳐서 사용하겠다는 의미.
*
* 동적바인딩
* 호출시, 자식메소드가 우선권을 가짐.
*
* [오버라이딩 성립 조건]
* 1. 부모 메소드명과 동일해야 함.
* 2. 반환형이 같아야 함.
* 3. 매개변수의 자료형, 개수, 순서가 동일해야 함.(오버로딩때와는 반대임)
* => 단, 매개변수명은 무관함.
* 4. 자식메소드의 접근제한자가 부모메소드의 접근제한자보다 범위가 같거나 또는 공유 범위가 더 커야함.
* => 규약의 개념이 들어가있음(재정의 하려면 적어도 이정도의 규칙은 지켜야 함.)
*
* @Override : annotation(주석). 생략이 가능함.(부모메소드와 형태가 같다면)
* 주석이지만, 잘못 기술했을 경우 오류를 알려주기 때문에 검토할 수 있음.
* 부모메소드가 후에 수정됐을 경우에도 또한 오류로 알려주기 때문에 검토할 수 있음.
부모클래스
Vehicle 클래스
package com.kh.chap02_inherit.model.vo;
public class Vehicle {
private String name;
private double mileage;
private String kind;
public Vehicle() {}
public Vehicle(String name, double mileage, String kind) {
this.name = name;
this.mileage = mileage;
this.kind = kind;
}
public void setName(String name) {
this.name= name;
}
public void setMileage(double mileage) {
this.mileage = mileage;
}
public void setKind(String kind) {
this.kind = kind;
}
public String getName() {
return name;
}
public double getMileage() {
return mileage;
}
public String getKind() {
return kind;
}
public String information() {
return name+", "+mileage+", "+kind;
}
public void howToMove() {
System.out.println("움직인다.");
}
}
자식클래스
1. Airplane클래스
package com.kh.chap02_inherit.model.vo;
public class Airplane extends Vehicle {
private int tire;
private int wing;
public Airplane() {}
public Airplane(String name, double mileage, String kind,
int tire, int wing) {
super(name,mileage,kind);
this.tire = tire;
this.wing = wing;
}
public void setTire(int tire) {
this.tire = tire;
}
public void setWing(int wing) {
this.wing = wing;
}
public int getTire() {
return tire;
}
public int getWing() {
return wing;
}
@Override
public String information() {
return super.information()+", "+tire+", "+wing;
}
@Override
public void howToMove() {
System.out.println("바퀴를 움직이고, 날개를 움직인다.");
}
}
2. Car클래스
package com.kh.chap02_inherit.model.vo;
public class Car extends Vehicle{
private int tire;
public Car() {}
public Car(String name, double mileage, String kind, int tire) {
super(name,mileage,kind);
this.tire = tire;
}
public void setTire(int tire) {
this.tire = tire;
}
public int tire() {
return tire;
}
@Override
public String information() {
return super.information()+", "+tire;
}
@Override
public void howToMove() {
System.out.println("바퀴를 움직인다.");
}
}
3. Ship 클래스
package com.kh.chap02_inherit.model.vo;
public class Ship extends Vehicle{
private int propeller;
public Ship() {}
public Ship(String name, double mileage, String kind,int propeller) {
super(name,mileage,kind);
this.propeller = propeller;
}
public void setPropeller(int propeller) {
this.propeller = propeller;
}
public int getPropeller() {
return propeller;
}
@Override
public String information() {
return super.information()+", "+propeller;
}
@Override
public void howToMove() {
System.out.println("프로펠러를 움직인다.");
}
}
Run 클래스
package com.kh.chap02_inherit.run;
import com.kh.chap02_inherit.model.vo.Airplane;
import com.kh.chap02_inherit.model.vo.Car;
import com.kh.chap02_inherit.model.vo.Ship;
public class Run {
public static void main(String[] args) {
Car c = new Car("벤틀리",12.5,"세단",4);
Ship s = new Ship("새우잡이배",3,"어선",1);
Airplane a = new Airplane("보잉774",0.02,"여객기",16,5);
System.out.println(c.information());
System.out.println(s.information());
System.out.println(a.information());
a.howToMove();
c.howToMove();
s.howToMove();
}
}
Object클래스 동적바인딩
Book클래스
package com.kh.chap03_override.model.vo;
public class Book {
private String title;
private String author;
private int price;
public Book() {}
public Book(String title, String author, int price) {
this.title = title;
this.author = author;
this.price = price;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Book [title=" + title + ", author=" + author + ", price=" + price + "]";
}
}
Run클래스
package com.kh.chap03_override.run;
import com.kh.chap03_override.model.vo.Book;
public class OverrideRun {
public static void main(String[] args) {
Book bk = new Book("자바의정석","김자바",23000);
System.out.println(bk.toString());
System.out.println(bk );
}
}