Develop
2013.04.23 17:42

[java] Interface 와 abstract

Views 8704 Votes 0 Comment 0
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
1. Interface 와 abstract

* 공통점

1) abstract와 interface는 그자체가 instance화 될수가 없다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘 다 컴파일을 해보면, 에러를 발생시킨다.

2) Prototype만 있고 Body가 없는 메소드를 멤버함수로 가진다.
소스1에서 보는 바와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있다.

[소스1]
public interface TestInterface {
    public static int num = 8;
    public void func1();
    public void func2();
}

public abstract class TestAbstract {
    public abstract void func1() ;

    public void func2() {
        System.out.println("func2");
    }
}


3) abstract, interface 클래스를 사용하려면, abstract, interface 위 클래스를 상속받아서, 새로운 클래스를 생성한 후, instance화 할 수 있다.

소스2 에서 보는바와 같이 상속을 받은후, 사용해야 한다.

즉, childclass c = new childclass(); 는 컴파일시 에러가 발생하지 않는다.


[소스2]

class childclass1 extends TestAbstract {
    // Abstrace Method Overriding
    public void func1() { 
        System.out.println("상속 받아서, Body를 채워줌");
    }
}

class childclass2 implements TestInterface {
    public void func1() {
        System.out.println("Class Test1");
    }

    public void func2() {
        System.out.println("Class Test2");
    }
}


* 차이점


1) Prototype만 있고 Body가 없는 메소드 즉, abstract 메소드라고 하는데, Abstract 클래스는 abstract 메소드와 일반 메소드를 혼용해서 가질수 있다. 즉, 일반메소드 + abstract 메소드 형태를 유지한다.

하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 한다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재한다.


2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다르다. 

abstract클래스는 소스2처럼 extends를 사용하고, interface클래스는 implements 을 사용한다.


3) 다중상속 가능유무

Java에서는일반 클래스에서는 다중상속을 지원하지 않는다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있다. 하지만 interface의 경우에는 다중상속이 가능하다.


4) 클래스 시작 키워드가 다르다. 

abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작한다.



* abstract 를 쓰는 이유는?

강제성(자식클래스에게 반드시 오버라이딩을 하게한다)

예로, Car 클래스의 speedUp()메서드는 Truck, Taxi 등의 하위 클래스에서 모두 다르게 구현해야 될 필요가 있는데, Car 클래스에서 이미 메서드가 있다면, 하위 클래스를 구현한느 프로그래머가 해당 메서드를 빼먹을 수 있다. 그러나, 추상 클래스로 최상위 클래스를 정의하면서 speedUp()메서드를 메서드를 추상메서드로 선언하면, 하위 클래스는 추상메서드를 반드시 오버라이딩 해주어야 하기 때문에, 하위의 모든 클래스가 speedUp()메서드를 만들어야 한다.


*abstract는 직접 객체화 될 수 없다.

(추상 메서드가 메서드 안에 내용이 없기 때문에, 메서드를 직접 호출할 수 없기때문이다.)


class A{
    abstract void a();
};
// 에러
// 추상메서드가 하나라도 있으면 그 클래스는 추상 클래스로 해야한다.


아래처럼

abstract class A{
    abstract void a();
}; //OK


new A(); // error 추상클래스는 객체화 될 수 없다.

==> 표준의 의미이다.


자식을 위해 존재하는 클래스(부모와같다.)

자식을 통해서 super의 의미로 객체가 생성이 되긴하지만 자기가 직접 객체생성은 되지 않는다.

구현부가 없다.


하위클래스에게 강제성을 부여하는 것은?

Abstract

abstract class A{
    abstract void a();
};                   

class B extends A{
} // 에러


위 에러 해결하는  두가지 방법은?

1>> B클래스도 abstract로 만들어라

2>> a()메서드를 오버라이딩 해라


?

List of Articles
No. Category Subject Author Date Views
565 Develop [ios] 유용한 매크로 hooni 2014.03.26 3654
564 [ios] 인앱결제 & 오토레이아웃 관련 강좌 secret hooni 2013.11.14 0
563 Develop [ios] 자주 쓰는 패턴과 API hooni 2013.04.23 17690
562 Develop [ios] 참고할만한 좋은 예제 소스.. hooni 2013.04.23 27371
561 Develop [ios] 최상위 ViewController 가져오기 hooni 2015.10.12 1059
560 Develop [ios] 최신 UI 모음.. (나중에 정리할 것) secret hooni 2013.08.09 0
559 Develop [ios] 카메라 사용 권한 확인해서 분기하는 방법 hooni 2015.02.26 1867
558 Develop [ios] 카테고리 확장 메소드를 찾지 못하는 경우 file hooni 2014.08.08 1991
557 Develop [ios] 커스텀 폰트 사용하기 (Custom Fonts) file hooni 2014.04.30 3133
556 Develop [ios] 코코아 프레임워크(Cocoa Framework) 기본적인 내용~ hooni 2013.04.23 27682
555 Develop [ios] 코코아 프로그래밍의 네이밍 룰(명명 규칙) hooni 2017.05.11 1179
554 Develop [ios] 테이블뷰셀/뷰에 배경 패턴 넣기.. hooni 2013.04.23 29813
553 Develop [ios] 패스(path) 앱 메뉴 스타일 secret hooni 2013.06.11 0
552 Develop [ios] 푸시알림(APNS)에 대한 php 라이브러리 ㅋㅋ hooni 2013.04.23 16632
551 Develop [ios] 한샘 카달로그 앱 소스 (아이폰용) secret hooni 2013.04.23 10922
550 Develop [ios][swift] 초간단 TableView 샘플 file hooni 2016.06.27 734
Board Pagination Prev 1 ... 37 38 39 40 41 ... 74 Next
/ 74