상속
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("======================================================================");
}
}
댓글
댓글 쓰기