추상클래스 편집하기
편집을 되돌릴 수 있습니다.
이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
− | '''추상클래스'''<!--추상 클래스-->(abstract class)는 1개 이상의 [[추상메소드]]를 [[멤버]]로 가지고 있는 [[클래스]]를 말한다. 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면 일반 [[클래스]]와 모든 점이 동일하며 [[생성자]]와 [[ | + | '''추상클래스'''<!--추상 클래스-->(abstract class)는 1개 이상의 [[추상메소드]]를 [[멤버]]로 가지고 있는 [[클래스]]를 말한다. 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면 일반 [[클래스]]와 모든 점이 동일하며 [[생성자]]와 [[필드]], [[메소드]]도 포함할 수 있다.<ref>TCPSCHOOL, <[http://tcpschool.com/java/java_polymorphism_abstract 추상클래스]>, <<TCPSHOOL>> </ref> 추상클래스 중에서 오직 [[추상메소드]]와 [[상수]]만을 멤버로 가지고 있는 것을 [[인터페이스]](Interface)라고 한다. |
==개요== | ==개요== | ||
− | 추상클래스는 실체클래스의 공통적인 부분을 추출해서 선언한 클래스이며 실체성이 없고 구체적이지 않기 때문에 | + | 추상클래스는 실체클래스의 공통적인 부분을 추출해서 선언한 클래스이며 실체성이 없고 구체적이지 않기 때문에 객체를 생성할 수 없다. 그러므로 실체클래스와의 상속관계를 통해 사용할 수 있다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> 클래스를 설계도라고 했다면 추상클래스는 미완성 설계도라고 할 수 있다. 클래스가 미완성이라는 것은 미완성 메서드를 포함하고 있다는 의미로 온전한 객체를 생성할 수 없다.<ref name="lshjh4848">lshjh4848, 〈[https://velog.io/@lshjh4848/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-bok2k2qjrg 추상클래스와 인터페이스]〉, 《개인블로그》, 2019-11-04</ref> |
==목적== | ==목적== | ||
− | 추상클래스의 목적은 공통적인 기능을 하는 객체들의 추상화로 [[객체]]를 생성하는 것이 아닌 상속을 위한 슈퍼 클래스로 활용하는 것이다.<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> |
===통일 목적=== | ===통일 목적=== | ||
− | 추상클래스에서 미리 정의한 [[ | + | 추상클래스에서 미리 정의한 [[필드]]와 [[메서드]]가 있으면 실체클래스에서는 추상클래스의 필드와 메서드명을 변경할 수 없고 무조건 해당 명명으로 구현해야한다. 이로인해 필드와 메서드 이름을 통일하여 유지보성을 높이고 통일성을 유지할 수 있다. |
− | 예를들어 A자동차를 만드는데 각기 다른 실체클래스를 사용한다면 이후에 자동차를 교체하거나 업그레이드할 때 수정하거나 교체하는데 상당히 무리가 있다. 그렇기 때문에 새로 개발을 해야하는 상황이 올 수 있지만 추상클래스를 사용해 미리 | + | 예를들어 A자동차를 만드는데 각기 다른 실체클래스를 사용한다면 이후에 자동차를 교체하거나 업그레이드할 때 수정하거나 교체하는데 상당히 무리가 있다. 그렇기 때문에 새로 개발을 해야하는 상황이 올 수 있지만 추상클래스를 사용해 미리 필드와 메소드를 정의한다면 유지보수가 쉬워진다.<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> |
===규격=== | ===규격=== | ||
− | 규격에 맞는 실체 클래스를 구현 할 수 있다. 대부분의 구현은 혼자만 하는 것이 아니기 때문에 규격 안에서 구현을 해야한다. 모두가 약속한 [[필드]]와 [[ | + | 규격에 맞는 실체 클래스를 구현 할 수 있다. 대부분의 구현은 혼자만 하는 것이 아니기 때문에 규격 안에서 구현을 해야한다. 모두가 약속한 [[필드]]와 [[메서드]], 설계 규칙에 맞게 클래스를 구현해야 유지보수가 쉬워진다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> |
==생성 및 구현== | ==생성 및 구현== | ||
− | 추상메소드를 가진 클래스로써 abstract로 선언하여 생성하고 추상클래스의 구현은 서브 클래스에서 슈퍼 클래스의 모든 추상메소드를 [[오버라이딩]]하여 실행 가능한 코드로 구현하는 것이다.<ref>황기태, | + | 추상메소드를 가진 클래스로써 abstract로 선언하여 생성하고 추상클래스의 구현은 서브 클래스에서 슈퍼 클래스의 모든 추상메소드를 [[오버라이딩]]하여 실행 가능한 코드로 구현하는 것이다.<ref>황기태, <[https://www.booksr.co.kr/html/book/book.asp?seq=697057 JAVA ESSENTIAL]>, <<생능출판사>>, 2018-08-10</ref> |
문법은 간단하게 클래스 앞에 abstract 키워드를 붙여주면 추상클래스가 만들어진다. | 문법은 간단하게 클래스 앞에 abstract 키워드를 붙여주면 추상클래스가 만들어진다. | ||
36번째 줄: | 36번째 줄: | ||
} | } | ||
− | + | 추상 메서드 또한 메서드 리턴 타입 앞에 abstract 키워드를 붙이면 된다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> | |
[public | protected] abstract 리턴타입 메소드명(매개변수1, 매개변수2, ...); | [public | protected] abstract 리턴타입 메소드명(매개변수1, 매개변수2, ...); | ||
48번째 줄: | 48번째 줄: | ||
System.out.println("breathing!!."); | System.out.println("breathing!!."); | ||
} | } | ||
− | // | + | //추상메서드 |
public abstract void sound(); | public abstract void sound(); | ||
} | } | ||
− | Animal 클래스 앞에 abstract 키워드가 있기 때문에 해당 | + | Animal 클래스 앞에 abstract 키워드가 있기 때문에 해당 클래스는 추상 클래스이다. 필드에는 type와 breath() 일반 메서드와 sound() 추상 메서드가 있다. 이 추상 클래스를 상속 받는 실체 클래스들은 반드시 추상메서드를 상속받아 [[오버라이딩]] 해야한다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> |
public class Dog extends Animal{ | public class Dog extends Animal{ | ||
68번째 줄: | 68번째 줄: | ||
} | } | ||
− | extends를 사용해 animal 추상 클래스를 상속받은 Dog 실체 클래스는 sound() 추상 메소드를 | + | extends를 사용해 animal 추상 클래스를 상속받은 Dog 실체 클래스는 sound() 추상 메소드를 오버라이딩해 구현했다. 이 때 다른 실체 클래스에서 animal 추상클래스를 상속 받은 실체 클래스는 자신에게 맞게끔 추상 메소드를 변형 시킬 수 있으며, [[다형성]]이 발생된다.<ref name="Limky Lim-ky">Limky Lim-ky", 〈[https://limkydev.tistory.com/188 자바 추상클래스란?]〉, 《개인블로그》, 2019-05-08</ref> |
==특징== | ==특징== | ||
− | 추상 클래스는 자체적으로 객체 생성이 불가능하여 상속을 통해 자식 | + | 추상 클래스는 자체적으로 객체 생성이 불가능하여 상속을 통해 자식 클래스에 인스턴스를 생성해야한다.즉, 서브 클래스가 상속을 통해 객체를 생성해야 하는 것이다.<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를 제외한 시그니처를 클래스에서 동일하게 적어줘야한다. |
===기능=== | ===기능=== | ||
− | + | 추상클래스 자체만으로는 클래스로서의 역할을 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 부모클래스로서 중요한 의미를 갖는다. 예를들어 볼펜에는 다양한 볼펜이 있는데 이들 모두 조금씩 모양이나 특징이 다르다. 하지만 이 볼펜들의 설계도는 많은 부분에서 동일한 부분이 나온다. 서로 다른 설계도를 만드는 것보다 이들의 공통점을 모아서 미완성된 설계도를 만들어두면 완제품을 만드는데 효과적이다. | |
− | |||
===구성=== | ===구성=== | ||
− | 추상 클래스는 | + | 추상 클래스는 추상 메소드, 일반 메소드, [[필드]], [[생성자]]로 구성된다. 기본 클래스와 구성은 비슷하지만 추상 메소드와 같이 추상적으로 생성한다는 차이가 있다. |
public abstract class 클래스명 { | public abstract class 클래스명 { | ||
//필드 | //필드 | ||
86번째 줄: | 85번째 줄: | ||
} | } | ||
− | ==== | + | ====추상 메소드==== |
− | [[ | + | 추상 [[메소드]]는 선언부만 있고 구현부가 없는 메소드로 꼭 필요하지만 자식마다 다르게 구현될 것으로 예상되는 경우에만 사용한다. 추상 클래스를 상속받은 자식 클래스에서는 추상 메소드의 구현부를 완성해야한다. 만약에 자식 클래스에서 추상 메소드의 구현부를 다 정의하지 않는다면 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; | ||
94번째 줄: | 93번째 줄: | ||
System.out.println("breathing!!."); | System.out.println("breathing!!."); | ||
} | } | ||
− | '''// | + | '''//추상메서드 구현과 위치''' |
'''public abstract void sound();''' | '''public abstract void sound();''' | ||
} | } | ||
+ | |||
====일반 메소드==== | ====일반 메소드==== | ||
− | [[메소드]](method) 또는 | + | [[메소드]](method) 또는 멤버 함수(member function)는 객체 지향 프로그래밍에서 객체과 관련된 서브 루틴 (또는 함수)이며 데이터와 멤버 변수에 대한 접근 권한을 갖는다. |
− | [[클래스]] 기반 언어에서 [[클래스]] 내부에 정의되어 있다. 메소드는 프로그램이 | + | [[클래스]] 기반 언어에서 [[클래스]] 내부에 정의되어 있다. 메소드는 프로그램이 실행되고있을때 클래스에서 생성된 인스턴스와 관련된 동작을 정의한다. 메소드는 런타임 중에 클래스 인스턴스에 저장되어 있는 데이터에 접근할 수 있는 특수 [[속성]]을 가지고 있다. 바인딩은 클래스와 메소드 간의 연관관계를 말한다.<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, <[http://tcpschool.com/java/java_member_field 필드의 구분]>, 《TCPschool》</ref> |
public abstract class Animal { | public abstract class Animal { | ||
'''//필드 구현과 위치''' | '''//필드 구현과 위치''' | ||
'''public String type;''' | '''public String type;''' | ||
+ | |||
public void breath(){ | public void breath(){ | ||
System.out.println("breathing!!."); | System.out.println("breathing!!."); | ||
127번째 줄: | 128번째 줄: | ||
====생성자==== | ====생성자==== | ||
− | [[생성자]]는 new [[연산자]]를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 [[메소드]]이다. 생성자는 멤버 변수를 초기화하는 역할을 한다. 하지만 추상클래스는 [[객체]]를 생성할 수 없다. 그런데도 생성자를 가질 수 있다. 추상 클래스에서 사용하는 | + | [[생성자]]는 new [[연산자]]를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 [[메소드]]이다. 생성자는 멤버 변수를 초기화하는 역할을 한다. 하지만 추상클래스는 [[객체]]를 생성할 수 없다. 그런데도 생성자를 가질 수 있다. 추상 클래스에서 사용하는 생성자는 클래스에 필요한 어떠한 제약을 줄 때 사용한다.<ref name="일상다반사">10106men, <[https://c10106.tistory.com/4503 추상 클래스에서 생성자가 있을 수 있습니까?]>, 《개인블로그》, 2020-02-04</ref> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{각주}} | {{각주}} | ||
218번째 줄: | 140번째 줄: | ||
* 황기태, 〈[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 |
− | |||
− | |||
− | |||
− | |||
− | |||
== 같이 보기 == | == 같이 보기 == | ||
233번째 줄: | 150번째 줄: | ||
* [[메소드]] | * [[메소드]] | ||
* [[클래스]] | * [[클래스]] | ||
− | * [[필드 | + | * [[필드]] |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | {{프로그래밍| | + | {{프로그래밍|토막글}} |