2020.09.18 기초 자바 프로그래밍 수업 노트

상속  


package g_oop2;


public class SampleParent {

/*

* 상속

* 기존의 클래스를 물려받아 새로운 클래스를 만드는것이다. 

* 자식클래스명 extends 부모클래스명 {} 

* 부모 클래스의 생성자와 초기화블럭을 제외한 모든 멤버를 물려받는다.(변수나 메소드 등)  

* 하나의 클래스만 상속받을 수 있다. 

* 상속받지 않는 모든 클래스는 object 클래스를 상속받는다. object 클래스는 모든 클래스의 조상이다.  

* 자식 클래스는 부모 클래스의 맴버 외에 새로운 멤버를 가질 수 있으므로 

* 자식클래스는 부모클래스보다 크거나 같다. 

* 두개 이상의 클래스를 만드는데 공통된 멤버가 있는 경우 부모 클래스로 만든다. 

*/

String var; 


//초기화블럭 열기 

{

var = " 초기화블럭은 물려주지 않는다." ; 

}


SampleParent(){ 

var = " 생성자도 물려주지 않는다. " ; 

}

int method(int a , int b ){ 

return a + b ; 

 

}

}


오버라이딩  , 슈퍼 super , super ( ) , 다형성  






package g_oop2;

public class SampleChild  //선언하는데다가 부모자식 연결해줌 //
extends SampleParent {

void childMethode() { 
// 상속받은 변수와 메서드를 사용할 수 있다. 
System.out.print(var); // 상속받은 변수 
System.out.print(method(7, 13)); // 상속받은 메소드 
}

/* 
* 오버라이딩 : 상속받은 변수를 재정의 하는 것 . 
* super, super() * this는 전역변수와 지역변수(method안에있는애)가 이름이 같을떄 구분해주기 위해 사용했었어. 
* 부모클래스의 변수와 자식클래스의 변수이름이 같을때 둘의 이름을 구분해 주기 위해서 사용한다. 
*  super() . this() 는 생성자에서 다른 생성자를 호출하는 것이고 super() 부모클래스의 생성자를 호출 
* 다형성 : 객체의 타입과 변수의 타입이 원래는 동일해야하는데 그 둘을 다르게 사용할 때 
* ABC a = new ABC() ABC라는 클래스가 있으면 이렇게 사용했는데. 
* DEF a = new ABC(); 이게 다형성인데 DEF 와 ABC 는 부모자식 관계여야 한다. 
*  
* 1. 오버라이딩 : 상속받은 메서드의 내용을 재정의 하는 것. 
* int method(int a , int b ) 요부분은 선언부고 이건 SampleParent 에서 가져온것 . 
*/
@Override // 어노테이션 : 클래스, 변수, 메서드 등에 표시해 놓는것.
//  개발자가  method를 만들때 스펠링실수를 하면 오버라이딩이 안되는데 알아차릴 수 없을때 그것을 쉽게 알 수 있게 하기 위해서. 
int method(int a , int b ){  // 리턴타입(int)과 메서드(method)명 파라미터가 모두 같아야 한다. 하나라도 다르면 오버라이딩이 아니다. 
return a * b ; 

}

/*2. 슈퍼 : super, super() 
*/
int var ; 
void test(double var){
    //var 라는 이름의 변수가 2개가 있고 SampleParent 에도 한개가 있어 총 3개가 있는데 
System.out.println(var) ; // 얘는 지역변수  double 뒤에 있는애
   // int var 위에 있는걸 사용하려면 this를 붙여줌 인스턴트 var 
System.out.println(this.var) ; // 인스턴스 변수 
System.out.println(super.var) ; // 부모 클래스의 인스턴스 변수 
//super : 부모 클래스의 멤버(변수, 메소드를 포함하는 것 ) 와 자식 클래스의 멤버가 이름이 중복될 떄 둘을 구분하기 위해 사용한다.
System.out.println(this.method(10,  20 )); 
System.out.println(super.method(10, 20)); 
}

SampleChild(){ 
super(); //부모 클래스의 생성자 호출 
//super () 를 통해 부모클래스의 생성자를 호출하고 부모클래스의 인스턴스 변수도 초기화한다. 
//super () 가 없으면 컴파일러가 자동으로 super() 를 넣어준다. 
}
//다형성
public static void main(String[] args) {
SampleChild sc = new SampleChild();   // 객체생성 
SampleParent sp = new SampleChild(); 
//부모타입의 변수로 자식타입의 객체를 사용하는 것이 다형성이다. 
 
// 부모자식간에는 형변환이 가능하기 때문에 . 
sc = (SampleChild)sp;   // 형변환 괄호를 생략할 수 없다. //여기에서는 에러가 발생하지 않는다. SampleChild ()를 SampleChild()
// 로 형변한 꼴이 되기 때문에. 
sp = (SampleParent)sc; //형변환괄호를 생략할 수 있다.
//자식 타입 -> 부모타입 형변환은 생략할 수 있다.    :  sp = sc;  이게가능하다 
//  sc = sp; 얘는 생략할 수 없다.  
SampleChild sc2 = (SampleChild) new SampleParent(); 
//Sampleparent 는 2개의 멤버를 가지고 있다. 
//SampleChild 는 5개의 멤버를 가지고 있다. 
//SampleChild 타입의 변수는 5개의 멤버를 사용할 수 있어야 하는데 
//SampleParent 객체는 2개의 멤버만 가지고 있다. 
// 그러므로 부모타입의 객체를 자식타입으로 형변환 하는 것은 에러를 발생시킨다.
 
 
//SampleParent 타입의 변수로는 SampleChild 객체를 가지고도 2개의 멤버만 사용할 수 있다. 
SampleParent sp3 = new SampleChild(); //(자식)5개를 사용할 수 있는 애인데, (부모)2개의 것만 사용가능
//왼쪽에 있는 애만 사용할 수 있다. 
 
System.out.println(sp.var); 
System.out.println(sp.method(10, 20)); 
 
/*
sp3.ChildMthod(); 
sp3.test(); 
얘는 사용불가하다. 
*/
 
//보통은 자식겍ㅊ[를 부모객체를 사용. 
 
 
 
//WHY ? 왜 이걸 사용하는지 . 
 
 
 
}
}



Store  가전제품 주문 예시 


package g_oop2;

public class Store {

public static void main(String[] args) {
// TODO Auto-generated method stub

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((Product)d1);  //자식에서 부모로의 형변환이 생략이 되어 있다. 
System.out.println(ac1.getInfo()); 
System.out.println(ac2.getInfo()); 
c.buy((Product)ac2);  //자식에서 부모로의 형변환이 생략이 되어 있다. 
System.out.println(tv1.getInfo()); 
System.out.println(tv2.getInfo()); 
c.buy((Product)tv1);  //자식에서 부모로의 형변환이 생략이 되어 있다. 

}

}

//부모클래스 모든 자식이 공통으로 가지고 있는것. Product 는 부모클래스이고 에어컨 티비등은 자식 클래스이다. 
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 setTeperature(){
System.out.println("온도를 설정합니다. "); 
}
}

    class Tv extends Product { 
   
    Tv(String name, int price){ 
    super(name, price);
    }
   
         void setChannel1(){ 
        System.out.println(" 채널을 변경합니다. "); 
         
         }
   
   
    }
class Customer{ 
int money = 1000000; 
Product[] item = new Product[100]; 
void buy(Product p){
//product 타입으로 형변환을 하면 p 다 넣을수있겠지 가전제품
    if ( money < p.price){ 
    System.out.println(" 돈이 부족하다. ");
                return ;           
    }
//else 가 생략되어 있다고 생각하면 됨. 
    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("======================================================================");
}
}




댓글