자바에서 추상 클래스와 추상 메소드란? 언제 사용해야 하나요? 튜토리얼 첨부
게시 됨: 2019-09-12
며칠 전에 Java의 인터페이스란 무엇이며 어떻게 사용되는가에 대한 기본 Java 기초에 대한 기사를 작성했습니다. 이 튜토리얼은 또한 기본 Java 기본 " Abstract Class and Abstract Method
"와 관련이 있습니다.
추상 클래스 란 무엇입니까?
먼저 Abstract 클래스에 대한 이해를 시작하고 예제를 살펴보겠습니다.
- 추상 클래스 는
abstract
으로 선언된 클래스입니다. - 추상 클래스는 인스턴스화할 수 없습니다.
- 추상 클래스는 하위 클래스로 분류할 수 있습니다.
- 추상 메서드를 포함하거나 포함하지 않을 수 있습니다.
- 추상 클래스가
subclassed
클래스는 일반적으로 상위 클래스의 모든 추상 메서드에 대한 구현을 제공합니다. - 하위 클래스가 구현을 제공하지 않으면 하위 클래스도
abstract
로 선언되어야 합니다.
이것은 매우 basic Java Interview Question
입니다. 아마 면접 중에 받는 1 st Java Interview Question
것입니다.
추상 메서드를 추가하지 않고 추상 클래스를 정의할 수 있습니까?
물론 예. 클래스 추상을 선언한다는 것은 자체적으로 인스턴스화하는 것을 허용하지 않는다는 것을 의미합니다. 비 추상 클래스에는 추상 메서드가 있을 수 없습니다.
추상 방법이란 무엇입니까?
-
abstract method
는 구현 없이 선언된 메서드입니다. - 메서드 서명만 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package crunchify . com . tutorial ; /** * @author Crunchify.com * Simple Abstract Class and Method Example with live result * */ public abstract class CrunchifyExam { public enum ExamStatus { PASSED , FAILED } private String examTime ; private ExamStatus status ; public CrunchifyExam ( String examTime , ExamStatus status ) { this . examTime = examTime ; this . status = status ; } public String getExamTime ( ) { return examTime ; } public void setExamTime ( String examTime ) { this . examTime = examTime ; } public void setExamStatus ( ExamStatus status ) { this . status = status ; } public ExamStatus getExamStatus ( ) { return status ; } abstract public void checkResult ( ) ; } |
예제부터 시작하겠습니다. 문제 설명:
-
checkResult()
라는 추상 메서드가 하나 있는CrunchifyExam.java
클래스를 만듭니다. - Abstract 클래스
Crunchify1stSchoolExamResult.java
를 확장하는 Crunchify1stSchoolExamResult.java 클래스를CrunchifyExam.java
- Abstract 클래스
Crunchify2ndSchoolExamResult.java
를 확장하는 Crunchify2ndSchoolExamResult.java 클래스를CrunchifyExam.java
- 이제 위의 두 클래스 모두 checkResult() 메서드에 대한 구현을 제공해야 합니다.
- 두 학교 모두 사용자가
PASSED or FAILED
인지 확인하기 위해 자체적으로 다른procedure
또는number of checks
를 가질 수 있으며, 각자의checkResult()
구현을 자유롭게 사용할 수 있습니다.
Crunchify1stSchoolExamResult.java에서 CrunchifyExam
클래스를 확장하면 Eclipse는 Crunchify1stSchoolExamResult.java
에 언급된 추상 메서드를 구현하라는 메시지를 CrunchifyExam.java
합니다.

Crunchify1 st SchoolExamResult.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package crunchify . com . tutorial ; /** * @author Crunchify.com */ public class Crunchify1stSchoolExamResult extends CrunchifyExam { public Crunchify1stSchoolExamResult ( String examTime , ExamStatus status ) { super ( examTime , status ) ; // TODO Auto-generated constructor stub } @Override public void checkResult ( ) { String studentName = "Crunchify1" ; String studentResult = "85%" ; // School NO-1 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "PASSED". System . out . println ( "Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus ( ) + ", ExamTime: " + getExamTime ( ) ) ; } } |
Crunchify2nd SchoolExamResult.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
package crunchify . com . tutorial ; import java . text . DateFormat ; import java . text . SimpleDateFormat ; import java . util . Date ; /** * @author Crunchify.com */ public class Crunchify2ndSchoolExamResult extends CrunchifyExam { public Crunchify2ndSchoolExamResult ( String examTime , ExamStatus status ) { super ( examTime , status ) ; } @Override public void checkResult ( ) { String studentName = "Crunchify2" ; String studentResult = "45%" ; // School NO-2 will provide all their formula to find if user is passed or failed. // After detailed calculation let's say student's grade is "FAILED". log ( "Hey.. this is user " + studentName + " with grade " + studentResult + " - " + getExamStatus ( ) + ", ExamTime: " + getExamTime ( ) ) ; } public static void main ( String args [ ] ) { DateFormat dateFormat = new SimpleDateFormat ( "yyyy/MM/dd HH:mm:ss" ) ; // 1st School's checkResult() Date date = new Date ( ) ; String examTime = dateFormat . format ( date ) ; log ( "Initializing 1st School object at time " + examTime ) ; // We are setting up time and Result for 1st School Crunchify1stSchoolExamResult object = new Crunchify1stSchoolExamResult ( examTime , ExamStatus . PASSED ) ; object . checkResult ( ) ; // Let's wait 5 seconds wait to see time difference in console log try { Thread . sleep ( 5000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } // 2nd School's checkResult() date = new Date ( ) ; examTime = dateFormat . format ( date ) ; log ( "\nInitializing 2nd School object at time " + examTime ) ; // We are setting up time and Result for 2nd School Crunchify2ndSchoolExamResult object2 = new Crunchify2ndSchoolExamResult ( examTime , ExamStatus . FAILED ) ; object2 . checkResult ( ) ; } // Simple log method private static void log ( String value ) { System . out . println ( value ) ; } } |
Eclipse 콘솔 결과:
Crunchify2ndSchoolExamResult.java
를 마우스 오른쪽 버튼으로 클릭하고 Java Application
으로 실행하면 아래 결과를 볼 수 있습니다.

1 2 3 4 5 |
Initializing 1st School object at time 2016 / 11 / 30 14 : 24 : 37 Hey . . this is user Crunchify1 with grade 85 % - PASSED ExamTime : 2016 / 11 / 30 14 : 24 : 37 Initializing 2nd School object at time 2016 / 11 / 30 14 : 24 : 42 Hey . . this is user Crunchify2 with grade 45 % - FAILED ExamTime : 2016 / 11 / 30 14 : 24 : 42 |
이제 질문이 있을 수 있습니다.
Abstract Method
와 Class
를 사용하고 CrunchifyExam을 인터페이스로 사용하는 대신 인터페이스를 사용할 수 없는 이유는 무엇입니까?
Sure you could
. 하지만 getExamTime
(), setExamTime
(), getExamTime
(), setExamTime
() 메서드도 구현해야 합니다.
추상 클래스를 사용하여 다른(비추상) 메서드의 구현을 상속할 수 있습니다. 인터페이스로는 그렇게 cannot provide
.
Java에서 추상 및 최종 클래스를 생성할 수 있습니까?
- 추상과 최종은 상호 배타적인 개념입니다.
- 따라서 대답은 NO입니다. Java에서 추상 클래스나 메서드를 최종적으로 만들 수 없습니다.
- 최종 클래스는 완전한 클래스이며 더 이상 확장할 수 없습니다.
- 추상 클래스는 불완전 클래스라고 하며 다른 구체적인 클래스에 의해서만 확장될 수 있으며 모든 추상 메소드를 구현해야 합니다.
- 또한 최종 클래스에 추상 메서드를 가질 수도 없고 방법이 없습니다.
Java의 여러 추상 클래스에서 상속할 수 있습니까?
- Java는 다중 상속을 지원하지 않습니다.
- Java에서는 단일 클래스만 확장할 수 있습니다.
- Java에서는 많은 소스에서 인터페이스를 구현할 수 있습니다.