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 이라는 기계 유닛한테만 상속 받으려고
//관계를 만들어주기도함.
}
댓글
댓글 쓰기