Web develop/JAVA

[JAVA] 추상클래스(abstract class)

ForA 2019. 4. 24. 19:03
728x90
  • 자식 class를 제어할 목적으로 사용

  • 자식클래스의 특징을 모아놓은 클래스

  • 구현(정의)된 메소드와 선언된 메소드로 구성

  • 스스로 객체생성 불가→ 후손 class 객체생성해서 사용

class 기본클래스
{
  //정의(구현)된 메소드 
   void hello(){

  }
}

class 추상클래스 {
    //선언된 메소드
    void hello();
    //정의메소드
    void goodBye(){

    }
}


interface 인터페이스
{
    //선언된 메소드만 
    void hello();
}

추상클래스 형식

abstract class 클래스명{
    //필드선언

    public void hello(){}; //구현된(정의된) 메소드
    abstract void print(); //선언된 메소드
※주의: 선언된 메소드를 사용하는 경우 반드시 abstract 명시

}

abstract class 클래스명 {

    변수선언
    구현(정의)메소드 / void print() {};

    추상메소드 / abstract void print(); =>abstract 생략시 에러
}

//클래스 사용 -> 객체생성해서 사용
class A { void hello(){} }

//인터페이스 사용 -> 클래스에 구현(implements)해서 사용
interface B {void hello(); }
=> class A implements B {void hello(){} }

//추상클래스 사용 -> 자식클래스 객체생성해서 사용
abstract class Parent {abstract void print(); }
=> class Child extends Parent {void print() {} }

class Parent{}
class Child extends Parent{}

메소드 정의

public void hello(Child c){
}

public void goodBye(Parent p) { //Parent p = new Child();
}

메소드 호출

hello(new Child());
Child cc = new Child();
    hello (cc);

hello(new Parent()); (x)  //부모는 자식에 대한 정보를 모른다. 
                          //자식객체에 부모객체가 들어갈 수 없다.


goodBye(new Parent());
Parent pp = new Parent(); // new Parent() 자체를 데이터로 생각할 것
    goodBye(pp);

goodBye(new Child()); // (o)

void a(String str) {

}

String b(int su) {
    return "안녕하세요";
}

int c() {
    return 500;
}
-----------

a( b( c() )); 
//실행순서 c메소드->b메소드->a메소드
  • c의 데이터가 int값으로 나와서 b의 매개변수로 들어감=> b의 데이터가 String값으로 나와서 a의 매개변수로 들어감
  • 데이터를 리턴하지않는 void는 메소드의 매개변수에 들어갈 수 없다.