추상클래스 편집하기
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
− | '''추상클래스'''<!--추상 클래스-->(abstract class)는 1개 이상의 [[추상메소드]]를 [[멤버]]로 가지고 있는 [[클래스]]를 말한다. 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면 일반 [[클래스]]와 모든 점이 동일하며 [[생성자]]와 [[필드 (자바)|필드]], [[메소드]]도 포함할 수 있다.<ref>TCPSCHOOL, | + | '''추상클래스'''<!--추상 클래스-->(abstract class)는 1개 이상의 [[추상메소드]]를 [[멤버]]로 가지고 있는 [[클래스]]를 말한다. 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면 일반 [[클래스]]와 모든 점이 동일하며 [[생성자]]와 [[필드 (자바)|필드]], [[메소드]]도 포함할 수 있다.<ref>TCPSCHOOL, <[http://tcpschool.com/java/java_polymorphism_abstract 추상클래스]>, <<TCPSHOOL>> </ref> 추상클래스 중에서 오직 [[추상메소드]]와 [[상수]]만을 멤버로 가지고 있는 것을 [[인터페이스]](Interface)라고 한다. |
==개요== | ==개요== | ||
5번째 줄: | 5번째 줄: | ||
==목적== | ==목적== | ||
− | 추상클래스의 목적은 공통적인 기능을 하는 객체들의 추상화로 [[객체]]를 생성하는 것이 아닌 상속을 위한 슈퍼 클래스로 활용하는 것이다.<ref>피누, | + | 추상클래스의 목적은 공통적인 기능을 하는 객체들의 추상화로 [[객체]]를 생성하는 것이 아닌 상속을 위한 슈퍼 클래스로 활용하는 것이다.<ref>피누, <[https://velog.io/@litien/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%99%80-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4 인터페이스와 추상클래스]>, <<litien.log>>, 2019-11-17</ref> 추상클래스는 추상메소드를 통해 추상클래스를 상속받는 서브 클래스가 구현할 [[메소드]]의 원형을 알려주는 인터페이스의 역할을 하고 서브 클래스의 [[다형성]]을 실현한다. |
소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용한다. 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손 쉽게 수정이 가능하기 때문이다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> | 소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용한다. 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손 쉽게 수정이 가능하기 때문이다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> | ||
20번째 줄: | 20번째 줄: | ||
==생성 및 구현== | ==생성 및 구현== | ||
− | 추상메소드를 가진 클래스로써 abstract로 선언하여 생성하고 추상클래스의 구현은 서브 클래스에서 슈퍼 클래스의 모든 추상메소드를 [[오버라이딩]]하여 실행 가능한 코드로 구현하는 것이다.<ref>황기태, | + | 추상메소드를 가진 클래스로써 abstract로 선언하여 생성하고 추상클래스의 구현은 서브 클래스에서 슈퍼 클래스의 모든 추상메소드를 [[오버라이딩]]하여 실행 가능한 코드로 구현하는 것이다.<ref>황기태, <[https://www.booksr.co.kr/html/book/book.asp?seq=697057 JAVA ESSENTIAL]>, <<생능출판사>>, 2018-08-10</ref> |
문법은 간단하게 클래스 앞에 abstract 키워드를 붙여주면 추상클래스가 만들어진다. | 문법은 간단하게 클래스 앞에 abstract 키워드를 붙여주면 추상클래스가 만들어진다. | ||
71번째 줄: | 71번째 줄: | ||
==특징== | ==특징== | ||
− | 추상 클래스는 자체적으로 객체 생성이 불가능하여 상속을 통해 자식 클래스의 [[인스턴스]]를 생성해야한다. 즉, 서브 클래스가 상속을 통해 객체를 생성해야 하는 것이다.<ref>JOKER, | + | 추상 클래스는 자체적으로 객체 생성이 불가능하여 상속을 통해 자식 클래스의 [[인스턴스]]를 생성해야한다. 즉, 서브 클래스가 상속을 통해 객체를 생성해야 하는 것이다.<ref>JOKER, <[https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220963055326&proxyReferer=https:%2F%2Fwww.google.com%2F 추상 클래스(abstract class), 추상 메소드)]>, <<JOKER`s ROOM>>, 2017-03-21</ref> |
그리고 추상 클래스를 상속받은 클래스는 추상 메소드를 반드시 [[오버라이딩]] 해야한다. 오버라이딩 할 때 abstract를 제외한 시그니처를 클래스에서 동일하게 적어줘야한다. | 그리고 추상 클래스를 상속받은 클래스는 추상 메소드를 반드시 [[오버라이딩]] 해야한다. 오버라이딩 할 때 abstract를 제외한 시그니처를 클래스에서 동일하게 적어줘야한다. | ||
87번째 줄: | 87번째 줄: | ||
====추상메소드==== | ====추상메소드==== | ||
− | [[추상메소드]](abstract method)는 선언부만 있고 구현부가 없는 메소드로 꼭 필요하지만 자식마다 다르게 구현될 것으로 예상되는 경우에만 사용한다. 추상 클래스를 [[상속]]받은 자식 클래스에서는 추상 메소드의 구현부를 완성해야한다. 만약에 자식 클래스에서 추상 메소드의 구현부를 다 정의하지 않는다면 클래스와 메소드에 abstract를 붙여 사용해야하며 그 자식 클래스 또한 상속을 하지 않으면 객체 생성이 불가능하다.<ref name="김현17">김현17, | + | [[추상메소드]](abstract method)는 선언부만 있고 구현부가 없는 메소드로 꼭 필요하지만 자식마다 다르게 구현될 것으로 예상되는 경우에만 사용한다. 추상 클래스를 [[상속]]받은 자식 클래스에서는 추상 메소드의 구현부를 완성해야한다. 만약에 자식 클래스에서 추상 메소드의 구현부를 다 정의하지 않는다면 클래스와 메소드에 abstract를 붙여 사용해야하며 그 자식 클래스 또한 상속을 하지 않으면 객체 생성이 불가능하다.<ref name="김현17">김현17, <[https://kimhyun2017.tistory.com/57 추상클래스, 인터페이스, 내부클래스]>, 《개인블로그》, 2017-08-15</ref> |
public abstract class Animal { | public abstract class Animal { | ||
public String type; | public String type; | ||
100번째 줄: | 100번째 줄: | ||
====일반 메소드==== | ====일반 메소드==== | ||
[[메소드]](method) 또는 [[멤버 함수]](member function)는 [[객체 지향 프로그래밍]]에서 [[객체]]와 관련된 서브 루틴 (또는 함수)이며 [[데이터]]와 [[멤버 변수]]에 대한 접근 권한을 갖는다. | [[메소드]](method) 또는 [[멤버 함수]](member function)는 [[객체 지향 프로그래밍]]에서 [[객체]]와 관련된 서브 루틴 (또는 함수)이며 [[데이터]]와 [[멤버 변수]]에 대한 접근 권한을 갖는다. | ||
− | [[클래스]] 기반 언어에서 [[클래스]] 내부에 정의되어 있다. 메소드는 프로그램이 실행되고 있을 때 클래스에서 생성된 [[인스턴스]]와 관련된 동작을 정의한다. 메소드는 런타임 중에 클래스 인스턴스에 저장되어 있는 데이터에 접근할 수 있는 특수 [[속성]]을 가지고 있다. 바인딩은 클래스와 메소드 간의 연관관계를 말한다.<ref name="위키백과">위키백과, | + | [[클래스]] 기반 언어에서 [[클래스]] 내부에 정의되어 있다. 메소드는 프로그램이 실행되고 있을 때 클래스에서 생성된 [[인스턴스]]와 관련된 동작을 정의한다. 메소드는 런타임 중에 클래스 인스턴스에 저장되어 있는 데이터에 접근할 수 있는 특수 [[속성]]을 가지고 있다. 바인딩은 클래스와 메소드 간의 연관관계를 말한다.<ref name="위키백과">위키백과, <[https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 메소드 (컴퓨터 프로그래밍)]>, 《위키피디아》</ref> |
public abstract class Animal { | public abstract class Animal { | ||
114번째 줄: | 114번째 줄: | ||
====필드==== | ====필드==== | ||
− | [[필드 (자바)|필드]]는 [[클래스]]에 포함된 변수를 의미하는데 클래스 내부에 선언되지만 [[생성자]]와 [[메소드]] 밖에 생성되는 변수이다.<ref name="TCPschool">TCPschool, | + | [[필드 (자바)|필드]]는 [[클래스]]에 포함된 변수를 의미하는데 클래스 내부에 선언되지만 [[생성자]]와 [[메소드]] 밖에 생성되는 변수이다.<ref name="TCPschool">TCPschool, <[http://tcpschool.com/java/java_member_field 필드의 구분]>, 《TCPschool》</ref> |
public abstract class Animal { | public abstract class Animal { | ||
'''//필드 구현과 위치''' | '''//필드 구현과 위치''' | ||
127번째 줄: | 127번째 줄: | ||
====생성자==== | ====생성자==== | ||
− | [[생성자]]는 new [[연산자]]를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 [[메소드]]이다. 생성자는 멤버 변수를 초기화하는 역할을 한다. 하지만 추상클래스는 [[객체]]를 생성할 수 없다. 그런데도 생성자를 가질 수 있다. 추상 클래스에서 사용하는 [[생성자]]는 클래스에 필요한 어떠한 제약을 줄 때 사용한다.<ref name="일상다반사">10106men, | + | [[생성자]]는 new [[연산자]]를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 [[메소드]]이다. 생성자는 멤버 변수를 초기화하는 역할을 한다. 하지만 추상클래스는 [[객체]]를 생성할 수 없다. 그런데도 생성자를 가질 수 있다. 추상 클래스에서 사용하는 [[생성자]]는 클래스에 필요한 어떠한 제약을 줄 때 사용한다.<ref name="일상다반사">10106men, <[https://c10106.tistory.com/4503 추상 클래스에서 생성자가 있을 수 있습니까?]>, 《개인블로그》, 2020-02-04</ref> |
===추상클래스와 상속=== | ===추상클래스와 상속=== | ||
− | [[객체]]를 생성할 수 없는 추상 클래스는 [[상속]]과 결합하여 사용해야한다. 추상 클래스를 상속 받는 자식 클래스는 추상 클래스의 [[추상 메소드]]를 [[오버라이딩]]해야하며, 만약 부모인 추상 클래스의 [[추상메소드]]를 [[오버라이딩]]하지 않는다면 자식 클래스는 [[객체]]를 생성할 수 없게 된다. 즉, 추상 클래스를 부모 클래스로 지정한 자식 클래스는 부모의 모든 추상 메소드를 오버라이딩 해야 객체를 생성할 수 있다는 것이다.<ref name="Dev">Dev Cristoval, | + | [[객체]]를 생성할 수 없는 추상 클래스는 [[상속]]과 결합하여 사용해야한다. 추상 클래스를 상속 받는 자식 클래스는 추상 클래스의 [[추상 메소드]]를 [[오버라이딩]]해야하며, 만약 부모인 추상 클래스의 [[추상메소드]]를 [[오버라이딩]]하지 않는다면 자식 클래스는 [[객체]]를 생성할 수 없게 된다. 즉, 추상 클래스를 부모 클래스로 지정한 자식 클래스는 부모의 모든 추상 메소드를 오버라이딩 해야 객체를 생성할 수 있다는 것이다.<ref name="Dev">Dev Cristoval, <[https://data-make.tistory.com/212 추상 클래스(Abstract Class)]>, 《개인블로그》, 2019-08-12</ref> |
class dog extends Animal { | class dog extends Animal { | ||
157번째 줄: | 157번째 줄: | ||
:{|width=100% border=1 | :{|width=100% border=1 | ||
− | |+차이점<ref name="차이점2">loustler 블로그, | + | |+차이점<ref name="차이점2">loustler 블로그, <[https://loustler.io/languages/oop_interface_and_abstract_class/ 인터페이스(interface)와 추상 클래스(abstract class)]>, 《개인 블로그》</ref> |
|- | |- | ||
!align=center style="background-color:#87AFEB;" |인터페이스 | !align=center style="background-color:#87AFEB;" |인터페이스 | ||
177번째 줄: | 177번째 줄: | ||
==활용== | ==활용== | ||
− | 추상 클래스를 사용하는 이유는 자식 클래스에서 [[추상메소드]]를 반드시 구현하도록 강요하기 위해서이다. 상속받은 자식 클래스에서는 메소드들이 완전히 구현된 것으로 인식하고 [[오버라이딩]]하지 않을 수 있기 때문이다.<ref name="활용1">글쓰는 개발자 _Jbee, | + | 추상 클래스를 사용하는 이유는 자식 클래스에서 [[추상메소드]]를 반드시 구현하도록 강요하기 위해서이다. 상속받은 자식 클래스에서는 메소드들이 완전히 구현된 것으로 인식하고 [[오버라이딩]]하지 않을 수 있기 때문이다.<ref name="활용1">글쓰는 개발자 _Jbee, <[https://asfirstalways.tistory.com/165 추상클래스와 추상메서드]>, 《개인 블로그》, 2016-06-27</ref> 그래서 추상 클래스로 객체를 생성하려면 자식 클래스를 작성해야 하며 [[추상메소드]]들을 [[오버라이딩]]해야 한다. 이는 추상 클래스를 사용해 유지보수의 편의성을 높이기 위함이고 최소한의 수정으로 원하는 [[객체]]를 사용할 수 있게 되어 유지보수성이 좋아진다. |
===용도=== | ===용도=== | ||
207번째 줄: | 207번째 줄: | ||
위와 같이 코드가 중복 될 수 있다. 하지만 이 내용을 상속을 통해서 최소화 시킬 수 있다. 그리고 호랑이, 토끼, 사자, 기린은 실제로 존재하는 동물이고 동물 자체는 실제 존재하는 것이 아니라 추상적인 의미라고 할 수 있다. | 위와 같이 코드가 중복 될 수 있다. 하지만 이 내용을 상속을 통해서 최소화 시킬 수 있다. 그리고 호랑이, 토끼, 사자, 기린은 실제로 존재하는 동물이고 동물 자체는 실제 존재하는 것이 아니라 추상적인 의미라고 할 수 있다. | ||
− | animal이라는 추상 클래스를 생성했을 때 우리가 알고있는 동물이라는 추상적인 단어와 같이 선언 할 수 있는 것이다.<ref name="클라우드스터딩">클라우드스터딩, | + | animal이라는 추상 클래스를 생성했을 때 우리가 알고있는 동물이라는 추상적인 단어와 같이 선언 할 수 있는 것이다.<ref name="클라우드스터딩">클라우드스터딩, <[https://cloudstudying.kr/lectures/303 추상클래스]>, 《클라우드 스터딩》</ref> |
{{각주}} | {{각주}} | ||
218번째 줄: | 218번째 줄: | ||
* 황기태, 〈[https://www.booksr.co.kr/html/book/book.asp?seq=697057 JAVA ESSENTIAL]〉, 《생능출판사》, 2018-08-10 | * 황기태, 〈[https://www.booksr.co.kr/html/book/book.asp?seq=697057 JAVA ESSENTIAL]〉, 《생능출판사》, 2018-08-10 | ||
* JOKER, 〈[https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220963055326&proxyReferer=https:%2F%2Fwww.google.com%2F 추상 클래스(abstract class), 추상 메소드)]〉, 《JOKER's ROOM》, 2017-03-21 | * JOKER, 〈[https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220963055326&proxyReferer=https:%2F%2Fwww.google.com%2F 추상 클래스(abstract class), 추상 메소드)]〉, 《JOKER's ROOM》, 2017-03-21 | ||
− | * 김현17, | + | * 김현17, <[https://kimhyun2017.tistory.com/57 추상클래스, 인터페이스, 내부클래스]>, 《개인 블로그》, 2017-08-15 |
− | * 위키백과, | + | * 위키백과, <[https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 메소드 (컴퓨터 프로그래밍)]>, 《위키피디아》 |
− | * TCPschool, | + | * TCPschool, <[http://tcpschool.com/java/java_member_field 필드의 구분]>, 《TCPschool》 |
− | * 10106men, | + | * 10106men, <[https://c10106.tistory.com/4503 추상 클래스에서 생성자가 있을 수 있습니까?]>, 《개인블로그》, 2020-02-04 |
− | * 신매력, | + | * 신매력, <[https://marobiana.tistory.com/58 추상화클래스와 인터페이스의 용도, 차이점, 공통점]>, 《Take Action》 |
− | * loustler 블로그, | + | * loustler 블로그, <[https://loustler.io/languages/oop_interface_and_abstract_class/ 인터페이스(interface)와 추상 클래스(abstract class)]>, 《개인 블로그》 |
− | * 글쓰는 개발자 _Jbee, | + | * 글쓰는 개발자 _Jbee, <[https://asfirstalways.tistory.com/165 추상클래스와 추상메서드]>, 《개인 블로그》, 2016-06-27 |
− | * 클라우드스터딩, | + | * 클라우드스터딩, <[https://cloudstudying.kr/lectures/303 추상클래스]>, 《클라우드 스터딩》 |
− | * Dev Cristoval, | + | * Dev Cristoval, <[https://data-make.tistory.com/212 추상 클래스(Abstract Class)]>, 《개인블로그》, 2019-08-12 |
== 같이 보기 == | == 같이 보기 == |