상속
- 기존의 클래스를 물려받아 새로운 클래스를 만드는 것이다.
- 자식클래스명 extends 부모클래스명{}
- 부모클래스의 생성자와 초기화블럭을 제외한 모든 멤버를 물려받는다.
- 하나의 클래스만 상속받을 수 있다.
- 상속받지 않은 모든 클래스는 Object 클래스를 상속받는다.
- 자식클래스는 부모클래스의 멤버 외의 새로운 멤버를 가질 수 있으므로 자식클래스는 부모클래스보다 크거나 같다.
- 두개 이상의 클래스를 만드는데 공통된 멤버가 있는 경우 부모클래스로 만든다.
public class SampleParent {
String var;
{
var = "초기화 블럭은 물려주지 않는다.";
}
SampleParent(){
var = "생성자도 물려주지 않는다.";
}
int method(int a, int b){
return a + b;
}
}
public class SampleChild extends SampleParent {
void childMethod(){
//상속받은 변수와 메서드를 사용할 수 있다.
System.out.println(var); //상속받은 변수
System.out.println(method(7, 13)); //상속받은 메서드
}
}
상속받은 메서드의 내용을 재정의 하는 것
public class SampleChild extends SampleParent {
@Override
int method(int a, int b){ //리턴타입, 메서드명, 파라미터 모두 같아야 한다.
return a * b;
}
}
어노테이션 : 클래스, 변수, 메서드 등에 표시해 놓는 것
-> 메서드 이름이 틀렸을 경우 오류를 알려준다.
public class SampleChild extends SampleParent {
int var;
void test(double var){
System.out.println(var); //지역변수
System.out.println(this.var); //인스턴스 변수
System.out.println(super.var); //부모클래스의 인스턴스 변수
System.out.println(this.method(10, 20));
System.out.println(super.method(10, 20));
}
}
public class SampleChild extends SampleParent {
super(); //부모클래스 생성자 호출
}
부모타입의 변수로 자식타입의 객체를 사용하는 것이 다형성이다.
public class SampleChild extends SampleParent {
public static void main(String[] args) {
SampleChild sc = new SampleChild();
SampleParent sp = new SampleChild();
//SampleChild2
//sp = new SampleChild2();
//SampleChild3
//sp = new SampleChild3();
//부모와 자식간에는 서로 형변환이 가능하다.
sc = (SampleChild)sp;
sp = (SampleParent)sc; //sp = sc;
//자식타입 -> 부모타입 형변환은 생략할 수 있다.
SampleChild sc2 = (SampleChild)new SampleParent();
//SampleParent는 2개의 멤버를 가지고 있다.
//SampleChild는 5개의 멤버를 가지고 있다.
//SampleChild 타입의 변수는 5개의 멤버를 사용할 수 있어야 하는데
//SampleParent 객체는 2개의 멤버만 가지고 있다.
//그러므로 부모타입의 객체를 자식타입으로 형변환 하는것은 에러를 발생시킨다.
//SampleParent 타입의 변수로는
//SampleChild 객체를 가지고도 2개의 멤버만 사용할 수 있다.
sp = sc; //형변환 생략 가능
System.out.println(sp.var);
System.out.println(sp.method(10, 20));
}
}
public class Store {
public static void main(String[] args) {
Desktop d1 = new Desktop("삼성 컴퓨터", 100000);
Desktop d2 = new Desktop("LG 컴퓨터", 100000);
AirCon ac1 = new AirCon("삼성 에어컨", 200000);
AirCon ac2 = new AirCon("LG 에어컨", 200000);
TV tv1 = new TV("삼성 TV", 300000);
TV tv2 = new TV("LG TV", 300000);
Customer c = new Customer();
System.out.println(d1.getInfo());
System.out.println(d2.getInfo());
c.buy(d1);
System.out.println(ac1.getInfo());
System.out.println(ac2.getInfo());
c.buy(ac2);
System.out.println(tv1.getInfo());
System.out.println(tv2.getInfo());
c.buy(tv2);
c.showItem();
}
}
class Product{
String name; //이름
int price; //가격
Product(String name, int price){
this.name = name;
this.price = price;
}
//상품의 정보를 반환하는 메서드
String getInfo(){
return name + "(" + price + "원)";
}
}
class Desktop extends Product{
Desktop(String name, int price){
super(name, price);
}
void programming(){
System.out.println("프로그램을 만듭니다.");
}
}
class AirCon extends Product{
AirCon(String name, int price){
super(name, price);
}
void setTemperature(){
System.out.println("온도를 설정합니다.");
}
}
class TV extends Product{
TV(String name, int price){
super(name, price);
}
void setChannel(){
System.out.println("채널을 변경합니다.");
}
}
class Customer{
int money = 10000000;
Product[] item = new Product[100];
void buy(Product p){ //다형성
if(money < p.price){
System.out.println("잔돈이 부족합니다.");
return;
}
money -= p.price;
for(int i = 0; i < item.length; i++){
if(item[i] == null){
item[i] = p;
break;
}
}
System.out.println(p.getInfo() + "를 구매했습니다.");
}
void showItem(){
System.out.println("=============== 장바구니 ===============");
for(int i = 0; i < item.length; i++){
if(item[i] == null){
break;
}else{
System.out.println(item[i].getInfo());
}
}
System.out.println("========================================");
}
}