최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
− | '''추상메소드'''<!--추상 메소드, 추상메서드, 추상 메서드-->(abstract method)란 구현없이 선언만 되어 있는 [[메소드]]를 말한다. 추상 메소드는 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 메서드는 선언부와 구현부로 구성되어 있다. 추상 메서드란 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상 메서드이다. 실제 내용은 상속받는 클래스에서 구현하도록 비워둔 것이며, 추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 구현부가 위치할 {}대신 마침을 의미하는 ;을 작성한다. 조상으로부터 상속받은 추상 메서드 중 하나라도 구현하지 않는다면, 추상 클래스로 지정해 주어야 한다. | + | '''추상메소드'''<!--추상 메소드, 추상메서드, 추상 메서드-->(abstract method)란 구현없이 선언만 되어 있는 [[메소드]]를 말한다.추상 메소드는 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 메서드는 선언부와 구현부로 구성되어 있다. 추상 메서드란 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상 메서드이다. 실제 내용은 상속받는 클래스에서 구현하도록 비워둔 것이먀, 추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 구현부가 위치할 {}대신 마침을 의미하는 ; 를 작성한다. 조상으로부터 상속받은 추상 메서드 중 하나라도 구현하지 않는다면, 추상 클래스로 지정해 주어야 한다. |
| | | |
− | ==목적== | + | == 추상 클래스의 사용 이유 == |
− | 추상클래스는 실체클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해놓은 추상적인 클래스로 실체 클래스의 멤버인 필드와 메소드를 통일화하기 위해 사용한다. 모든 실체들의 메소드 실행 내용이 동일하다면 추상클래스에 메소드를 작성하면 되지만 실행 내용이 실체클래스마다 달라야 할 경우 추상메소드를 사용하면 된다.
| + | 자손 클래스에서 추상메서드를 반드시 구현하도록 강요하기 위해서 사용된다. 상속받은 자손 클래스에서는 메서드들이 완전히 구현된 것으로 인식하고 오버라이딩을 하지 않을 수 있기 때문이다. |
− | | |
− | ==생성 및 구현==
| |
− | ===생성===
| |
− | 추상메소드의 선언은 abstract 키워드를 사용하고 메소드 중괄호 {}가 없다.
| |
− | [public | protected] abstract 리턴타입 메소드명(매개변수, ...);
| |
− | | |
− | public abstract classA {
| |
− | public abstract void methodA(int a);
| |
− | }
| |
− | ===구현===
| |
− | ====추상메소드 오버라이딩====
| |
− | 추상클래스에 선언되어 있는 추상메소드를 구현하는 것을 추상메소드의 재정의 또는 오버라이딩이라고 한다.
| |
− | #추상클래스
| |
− | public abstract class ClassA { //추상클래스
| |
− | public String a;
| |
− |
| |
− | public void methodA() {
| |
− | System.out.println("일반 메소드입니다.");
| |
− | }
| |
− |
| |
− | public abtract void methodB(); //추상메소드
| |
− | }
| |
− | | |
− | #추상메소드 오버라이딩_example1
| |
− | public class ClassB entends ClassA {
| |
− | public ClassB() { //생성자
| |
− | this.a = "test";
| |
− | }
| |
− |
| |
− | @Override
| |
− | public void method() {
| |
− | System.out.pirintln("ClassB 추상메소드 오버라이딩");
| |
− | {
| |
− | }
| |
− | | |
− | #추상메소드 오버라이딩_example2
| |
− | public class ClassC entends ClassA {
| |
− | public ClassC() { //생성자
| |
− | this.a = "example";
| |
− | };
| |
− |
| |
− | @Override
| |
− | public void method() {
| |
− | System.out.pirintln("ClassC 추상메소드 오버라이딩");
| |
− | {
| |
− | }
| |
− | | |
− | ===추상메소드 사용===
| |
− | ====[[추상클래스]]====
| |
− | 추상메소드를 하나라도 가진 클래스로 추상메소드가 하나라도 있다면 클래스명 앞에 abstract 키워드를 선언해야 한다.
| |
− | 만약 추상메소드가 하나라도 있어서 추상클래스가 된다면 해당 클래스는 객체를 생성할 수 없다.<ref name="ClassInterface">나비와꽃기린, 〈[https://mkil.tistory.com/112 추상메소드/인터페이스]〉, 《개인블로그》, 2016-06-22</ref>
| |
− | #추상클래스
| |
− | public abstract class ClassA {
| |
− | int a;
| |
− |
| |
− | public void methodA {
| |
− | System.out.println("메소드입니다.");
| |
− | }
| |
− |
| |
− | public void methodB(); //추상메소드
| |
− | }
| |
− | | |
− | ====[[인터페이스]]====
| |
− | 모든 메소드가 추상메소드인 클래스로 인터페이스명 앞에 interface 키워드를 선언해야한다. 인터페이스의 멤버는 상수와 메소드만 있으며 필드는 없다.
| |
− | 인터페이스는 추상메소드를 포함하고 있어 객체를 생성할 수 없으며, [[다중상속]]을 지원한다.<ref name="ClassInterface"></ref>
| |
− | #인터페이스
| |
− | public interface InterfaceA {
| |
− | int a=5;
| |
− |
| |
− | public void methodA();
| |
− |
| |
− | public void methodB();
| |
− | }
| |
− | | |
− | ====차이점====
| |
− | :{|class=wikitable width=700 style="background-color:#ffffee"
| |
− | |+ 추상클래스와 인터페이스 차이점
| |
− | !align=center style="background-color:#ffeecc"|추상클래스
| |
− | !align=center style="background-color:#ffeecc"|인터페이스
| |
− | |-
| |
− | |align=center|
| |
− | *일반 메소드 포함 가능
| |
− | *[[상수]], [[변수]] 포함 가능
| |
− | *단일 상속
| |
− | |align=center|
| |
− | *모든 메소드가 추상메소드
| |
− | *상수만 포함 가능
| |
− | *다중 상속 지원
| |
− | | |
− | |}
| |
− | {{각주}}
| |
− | | |
− | ==참고자료==
| |
− | *신용권, 〈[https://www.hanbit.co.kr/store/books/look.php?p_code=B1460673937 이것이 자바다]〉, 《한빛출판네트워크》, 2015-01-06
| |
− | *나비와꽃기린, 〈[https://mkil.tistory.com/112 추상메소드/인터페이스]〉, 《개인블로그》, 2016-06-22
| |
| | | |
| == 같이 보기 == | | == 같이 보기 == |
| * [[메소드]] | | * [[메소드]] |
− | * [[추상클래스]]
| |
− | * [[인터페이스]]
| |
| | | |
− | {{프로그래밍|검토 필요}} | + | {{프로그래밍|토막글}} |