2020.09.21 기초자바프로그래밍 - 추상클래스

 package g_oop2;


public abstract class SampleAbstractParent {

/*추상클래스 : 추상메소드를 하나라도 가지고 있으면 추상클래스이다. 

abstract 

void method(){

*/

void method(){ // 일반 

}

//추상메서드 : 선언부(void method() )만 있고 구현부{}는 없는 메서드 

abstract void abstractMethod ();

//메소드가 선언은 되어있는데 설명은 없는것 

//abstract를 붙여준다. 

//내용이 없으니까 호출을 할 수 없다. 

//객체생성에서 사용할 수 없다. 

//부모클래스의 역할만 한다. 


}



class SampleAbstractChild extends SampleAbstractParent { 

//추상클래스는 상속을 받으면  컴파일 에러가 생김 

@Override

void abstractMethod(){ 

}

//2가지 방법 1. abstract 를 붙여서 추상클래스를 만들든지 추상메소드의 내용을 만들어준다. 

// 2. 오버라이딩 : 상속받은 내용을 변경해주는것 -> 내용을 만들어준다. 

}


---------------------------------------------------------------------------------------

package g_oop2;


public abstract class Animal {


void run() { 

System.out.println("달려간다 ~~~~~~"); 

}

abstract void sound();

}



class Dog extends Animal{


@Override

void sound() {

System.out.println("멍멍!" ) ; 

// TODO Auto-generated method stub

}

class rem extends Animal {


@Override

void sound() {

System.out.println("라라");

// TODO Auto-generated method stub

class roll extends Animal {


@Override

void sound() {

System.out.println( "로로로로"); 

// TODO Auto-generated method stub

}

}

}


--------------------------------------------------------------------------------------

package g_oop2;


public interface SampleInterface {


//추상 메서드를 하나라도 가진것 : 추상 클래스 

// interface 얘는 추상메서드와 상수만 가질 수 있다. 

// 여러개의  상속받을 수 있다. implements 를 사용한다.

//인터페이스의 모든 멤버변수는 public static final 제어자를 사용해야 한다. 

public static final int NUM1 = 1; 

//final 이 붙었으니까 상수. 

//모든 멤버변수의 제어자가 같기 때문에 생략이 가능하다. 1번째처럼 안쓰고 

int NUM2 = 2 ; 

//인터페이스의 모든 메서드는 public abstract 제어자를 사용해야 한다.

public abstract void method1 (); 

//모든 메서드의 제어자가 같기 때문에 생략이 가능하다.  3번째 처럼 안쓰고

void method2 (); 

}





class SampleImplement implements SampleInterface, SampleInterface2 {//컴마랑 이름 써주면 2개의 인터페이스를 상속받은것. 


@Override

public void method1() {

// TODO Auto-generated method stub

}


@Override

public void method2() {

// TODO Auto-generated method stub

}


@Override

public void method3() {

// TODO Auto-generated method stub

//interface 를 상속받을때는 extends ( class 를 상속받을 때 )  가 아니라 implements 를 사용한다. 

//부모클래스의 역할을 하기 위해서 만들어짐 

//다중상속이 가능하다 

}



interface SampleInterface2{ 

void method1 ();

void method3 (); 

}



-------------------------------------------------------------------------------------

package g_oop2;


public class Starcraft {


public static void main(String[] args) {

Marine marine = new Marine(); 

Tank tank = new Tank(); 

Dropship dropship = new Dropship(); 

SCV scv = new SCV(); 


scv.repair(tank) ; 

scv.repair(dropship) ; 

scv.repair ( scv ) ; 

// scv.repair(marine) ; //얘는 컴파일에러가 발생한다. 왜냐면 안묶어주었기 때문에 아래에 


}


}



class Unit { 

int hp ; //현재 체력 

final int MAX_HP; // 최대 체력 

Unit(int hp){ 

MAX_HP = hp ; 

this.hp = MAX_HP ; 

}

}


class Marine extends Unit { 

Marine(){  //생성자를 만들어줌. 

super(40); 

}

}


class Tank extends Unit implements Repairable{ 

Tank(){ 

super(150) ; 

}

}


class Dropship extends Unit  implements Repairable{ 

Dropship () { 

super (125) ; 

}

}



class SCV extends Unit  implements Repairable { //수리할 수 있는애임 수리할수있는 method를 만들어줄거임 

SCV(){ 

super ( 60 ); 

}

    void repair(Repairable r ){ 

//Repairable 에는 뭔가가 없잖아 밑에 그래서 unit 을 쓰고 싶어서 unit 으로 형변환을 해준다. 

    if ( r instanceof Unit){ //unit 으로 형변환이 가능한지 확인  

    Unit u = (Unit)r; 

   

    while(u.hp < u.MAX_HP){

    u.hp++; 

    }

    }

   

    

}

}




interface Repairable{ 

//Tank 와 Dropship 이라는 기계 유닛한테만 상속 받으려고 

//관계를 만들어주기도함. 

}






댓글