검수요청.png검수요청.png

"Abstract"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
 
(다른 사용자 한 명의 중간 판 2개는 보이지 않습니다)
2번째 줄: 2번째 줄:
  
 
==개요==
 
==개요==
abstract은 한국어로는 추상으로 번역된다. [[추상메소드]](abstract method)는 [[자식클래스]](class)에서 반드시 [[오버라이딩]](overriding)해야만 사용할 수 있는 [[메소드]]를 의미한다. [[자바]]에서는 이러한 하나 이상의 추상메소드(method)를 포함하는 [[클래스]](class)를 가리켜 [[추상클래스]](abstract class)라고 한다.<ref name="TCP SCHOOL"></ref>
+
abstract은 한국어로는 추상으로 번역된다. [[추상메소드]]는 [[자식클래스]](class)에서 반드시 [[오버라이딩]](overriding)해야만 사용할 수 있는 [[메소드]]를 의미한다. [[자바]](Java)에서는 이러한 하나 이상의 추상메소드(method)를 포함하는 [[클래스]](class)를 가리켜 [[추상클래스]]라고 한다.<ref name="TCP SCHOOL"></ref>
  
 
==추상 메소드==
 
==추상 메소드==
 
===문법===
 
===문법===
추상메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩(overriding)해야만 사용할 수 있는 메소드를 의미한다. 자바(Java)에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함이다. 예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다. 이러한 추상메소드는 [[선언부]]만이 존재하며, [[구현부]]는 작성되어 있지 않다. 바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.
+
[[추상메소드]]란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 자바에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함이다. 예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다. 이러한 추상메소드는 [[선언부]]만이 존재하며, [[구현부]]는 작성되어 있지 않다. 바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.
 
  abstract 반환타입 메소드이름();
 
  abstract 반환타입 메소드이름();
자바에서 추상메소드는 이러한 문법으로 선언한다. 이렇게 선언부만 있고 구현부가 없다는 의미로 선언부 끝에 바로 세미클론(;)을 추가한다.<ref name="TCP SCHOOL">,〈[http://tcpschool.com/java/java_polymorphism_abstract 44)추상 클래스]〉 ,《TCP SCHOOL》</ref>
+
자바에서 추상메소드는 이러한 문법으로 선언한다. 이렇게 선언부만 있고 구현부가 없다는 의미로 선언부 끝에 바로 세미클론(;)을 추가한다.<ref name="TCP SCHOOL">〈[http://tcpschool.com/java/java_polymorphism_abstract 44)추상 클래스]〉 , 《TCP 스쿨》</ref>
  
 
===사용 목적===
 
===사용 목적===
자바(Java)에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함으로, 만약 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수 있고, 안 할 수도 있다. 하지만 추상 메소드가 포함된 추상클래스를 상속 받은 모든 자식 클래스는 추상메소드를 구현해야만 [[인스턴스]](instance)를 생성할 수 있음으로, 반드시 구현하게 된다.<ref name="TCP SCHOOL"></ref> 인스턴스는 설계도를 바탕으로 [[소프트웨어]] 세계에 구현된 구체적인 실체라고 볼 수 있다.<ref>heejeong Kwon,〈[https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html 클래스, 객체, 인스턴스의 차이]〉,《Heee's Development Blog》,2018-09-17</ref>
+
자바에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함으로, 만약 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수 있고, 안 할 수도 있다. 하지만 추상 메소드가 포함된 추상클래스를 상속 받은 모든 자식 클래스는 추상메소드를 구현해야만 [[인스턴스]](instance)를 생성할 수 있음으로, 반드시 구현하게 된다.<ref name="TCP SCHOOL"></ref> 인스턴스는 설계도를 바탕으로 [[소프트웨어]] 세계에 구현된 구체적인 실체라고 볼 수 있다.<ref>heejeong Kwon, 〈[https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html 클래스, 객체, 인스턴스의 차이]〉, 《깃허브》, 2018-09-17</ref>
  
 
==추상 클래스==
 
==추상 클래스==
 
===문법===
 
===문법===
자바에서는 하나 이상의 추상메소드를 포함하는 클래스를 가리켜 추상클래스(abstract class)라고 한다.
+
자바에서는 하나 이상의 추상메소드를 포함하는 클래스를 가리켜 추상클래스라고 한다.
 
이러한 추상클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 한다.
 
이러한 추상클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 한다.
 
즉, 반드시 사용되어야 하는 메소드를 추상클래스에 추상메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상메소드를 반드시 재정의해야 한다.
 
즉, 반드시 사용되어야 하는 메소드를 추상클래스에 추상메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상메소드를 반드시 재정의해야 한다.
 +
 
  abstract class 클래스이름 {
 
  abstract class 클래스이름 {
 
     . . .
 
     . . .
 
   abstract 반환타입 메소드이름();
 
   abstract 반환타입 메소드이름();
      . . .
+
    . . .
 
  }
 
  }
이러한 추상클래스는 동작이 정의되어 있지 않은 추상메소드를 포함하고 있으므로, 인스턴스(instance)를 생성할 수 없다.
+
 
추상클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상클래스의 모든 추상메소드를 오버라이딩(overriding)하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다. 참고로, 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
+
이러한 추상클래스는 동작이 정의되어 있지 않은 추상메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다.
 +
추상클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상클래스의 모든 추상메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다. 참고로, 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
 
즉, [[생성자]]와 [[필드]](field), 일반 메소드도 포함할 수 있다.<ref name="TCP SCHOOL"></ref>
 
즉, [[생성자]]와 [[필드]](field), 일반 메소드도 포함할 수 있다.<ref name="TCP SCHOOL"></ref>
  
 
===사용 목적===
 
===사용 목적===
추상클래스는 상속을 강제하기 위한 것으로, [[부모 클래스]]에는 메소드의 시그니처만 정의해놓고 그 메소드의 실제 동작 방법은 메소들 상속받은 하위 클래스의 책임으로 위임한다. 상황에 따라서 동작 방법이 달라지는 메소드는 추상메소드로 만들어서 하위 클래스에서 구현하도록 한다. 그리고 추상클래스를 사용하지 않는 경우에는 메소드의 구현을 강제할 수 없다.<ref>〈[https://opentutorials.org/course/2517/14140 Abstract(추상)]〉,《오픈튜토리얼스》,2016-11-21</ref>
+
추상클래스는 상속을 강제하기 위한 것으로, [[부모 클래스]]에는 메소드의 시그니처만 정의해 놓고 그 메소드의 실제 동작 방법은 메소드를 상속받은 하위 클래스의 책임으로 위임한다. 상황에 따라서 동작 방법이 달라지는 메소드는 추상메소드로 만들어서 하위 클래스에서 구현하도록 한다. 그리고 추상클래스를 사용하지 않는 경우에는 메소드의 구현을 강제할 수 없다.<ref>〈[https://opentutorials.org/course/2517/14140 Abstract(추상)]〉, 《오픈튜토리얼스》, 2016-11-21</ref>
  
 
==예제==
 
==예제==
34번째 줄: 36번째 줄:
 
   abstract void cry();
 
   abstract void cry();
 
  }
 
  }
 
+
  class Cat extends Animal{
+
  class Lion extends Animal{
 
   void cry(){
 
   void cry(){
 
     System.out.println("야옹~!");
 
     System.out.println("야옹~!");
 
   }
 
   }
 
  }
 
  }
 
+
 
  class Bird extends Animal{
 
  class Bird extends Animal{
 
   void cry(){
 
   void cry(){
46번째 줄: 48번째 줄:
 
   }
 
   }
 
  }   
 
  }   
 
+
 
  public class AbstractExample{
 
  public class AbstractExample{
 
   public static void main(String[]args){
 
   public static void main(String[]args){
     //Animal a = new Animal(); //추상 클래스는 인트턴스를 생성할 수 없다.
+
     //Animal a = new Animal(); // 추상 클래스는 인트턴스를 생성할 수 없다.
 
     Lion c = new Lion();
 
     Lion c = new Lion();
 
     Bird d = new Bird();
 
     Bird d = new Bird();
57번째 줄: 59번째 줄:
 
   }
 
   }
 
  }
 
  }
 +
 +
실행 결과
 +
  야옹~!
 +
  짹짹~!
  
실행 결과
+
예제에서 추상클래스인 Animal 클래스는 추상메소드인 cry()메소드를 가지고 있다. Animal 클래스를 상속받는 자식 클래스인 Lion 클래스와 Bird 클래스는 cry()메소드를 오버라이딩해야만 비로소 인스턴스를 생성할 수 있다.<ref name="TCP SCHOOL"></ref>
어흥~!
 
짹짹~!
 
예제에서 추상클래스(abstract class)인 Animal클래스는 추상메소드인 cry()메소드를 가지고 있다. Animal클래스를 상속받는 자식 클래스인 Lion클래스와 Bird클래스는 cry()메소드를 오버라이딩(overriding)해야만 비로소 인스턴스(instance)를 생성할 수 있다.<ref name="TCP SCHOOL"></ref>
 
  
 
{{각주}}
 
{{각주}}
  
 
==참고자료==
 
==참고자료==
* 〈[https://opentutorials.org/course/1223/6062 abstract]〉, 《Opentutorials.org》, 2014-01-27
+
* 〈[https://opentutorials.org/course/1223/6062 abstract]〉, 《오픈튜토리얼스》, 2014-01-27
* 〈[http://tcpschool.com/java/java_polymorphism_abstract 44)추상 클래스]〉 ,《TCP SCHOOL》
+
* 〈[http://tcpschool.com/java/java_polymorphism_abstract 44)추상 클래스]〉, 《TCP 스쿨》
* heejeong Kwon,〈[https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html 클래스, 객체, 인스턴스의 차이]〉,《Heee's Development Blog》,2018-09-17
+
* heejeong Kwon, 〈[https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html 클래스, 객체, 인스턴스의 차이]〉, 《깃허브》, 2018-09-17
* 〈[https://opentutorials.org/course/2517/14140 Abstract(추상)]〉,《오픈튜토리얼스》,2016-11-21
+
* 〈[https://opentutorials.org/course/2517/14140 Abstract(추상)]〉, 《오픈튜토리얼스》, 2016-11-21
  
 
==같이 보기==
 
==같이 보기==

2021년 9월 27일 (월) 14:05 기준 최신판

Abstract(추상)라는 것은 상속을 강제하는 일종의 규제라고 볼 수 있다. 즉, 추상클래스(abstract class)나 추상메소드(abstract method)를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이 'abstract'이다.[1]

개요[편집]

abstract은 한국어로는 추상으로 번역된다. 추상메소드자식클래스(class)에서 반드시 오버라이딩(overriding)해야만 사용할 수 있는 메소드를 의미한다. 자바(Java)에서는 이러한 하나 이상의 추상메소드(method)를 포함하는 클래스(class)를 가리켜 추상클래스라고 한다.[2]

추상 메소드[편집]

문법[편집]

추상메소드란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 자바에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함이다. 예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다. 이러한 추상메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다. 바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.

abstract 반환타입 메소드이름();

자바에서 추상메소드는 이러한 문법으로 선언한다. 이렇게 선언부만 있고 구현부가 없다는 의미로 선언부 끝에 바로 세미클론(;)을 추가한다.[2]

사용 목적[편집]

자바에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상메소드를 구현하도록 하기 위함으로, 만약 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수 있고, 안 할 수도 있다. 하지만 추상 메소드가 포함된 추상클래스를 상속 받은 모든 자식 클래스는 추상메소드를 구현해야만 인스턴스(instance)를 생성할 수 있음으로, 반드시 구현하게 된다.[2] 인스턴스는 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체라고 볼 수 있다.[3]

추상 클래스[편집]

문법[편집]

자바에서는 하나 이상의 추상메소드를 포함하는 클래스를 가리켜 추상클래스라고 한다. 이러한 추상클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 한다. 즉, 반드시 사용되어야 하는 메소드를 추상클래스에 추상메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상메소드를 반드시 재정의해야 한다.

abstract class 클래스이름 {
    . . .
  abstract 반환타입 메소드이름();
    . . .
}

이러한 추상클래스는 동작이 정의되어 있지 않은 추상메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다. 추상클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상클래스의 모든 추상메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다. 참고로, 추상클래스는 추상메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다. 즉, 생성자필드(field), 일반 메소드도 포함할 수 있다.[2]

사용 목적[편집]

추상클래스는 상속을 강제하기 위한 것으로, 부모 클래스에는 메소드의 시그니처만 정의해 놓고 그 메소드의 실제 동작 방법은 메소드를 상속받은 하위 클래스의 책임으로 위임한다. 상황에 따라서 동작 방법이 달라지는 메소드는 추상메소드로 만들어서 하위 클래스에서 구현하도록 한다. 그리고 추상클래스를 사용하지 않는 경우에는 메소드의 구현을 강제할 수 없다.[4]

예제[편집]

abstract class Animal {
  abstract void cry();
}

class Lion extends Animal{
  void cry(){
    System.out.println("야옹~!");
  }
}

class Bird extends Animal{
  void cry(){
    System.out.println("짹짹~!");
  }
}  

public class AbstractExample{
  public static void main(String[]args){
    //Animal a = new Animal(); // 추상 클래스는 인트턴스를 생성할 수 없다.
    Lion c = new Lion();
    Bird d = new Bird();
    
    c.cry();
    d.cry();
  }
}

실행 결과
 야옹~!
 짹짹~!

예제에서 추상클래스인 Animal 클래스는 추상메소드인 cry()메소드를 가지고 있다. Animal 클래스를 상속받는 자식 클래스인 Lion 클래스와 Bird 클래스는 cry()메소드를 오버라이딩해야만 비로소 인스턴스를 생성할 수 있다.[2]

각주[편집]

  1. abstract〉, 《오픈튜토리얼스》, 2014-01-27
  2. 2.0 2.1 2.2 2.3 2.4 44)추상 클래스〉 , 《TCP 스쿨》
  3. heejeong Kwon, 〈클래스, 객체, 인스턴스의 차이〉, 《깃허브》, 2018-09-17
  4. Abstract(추상)〉, 《오픈튜토리얼스》, 2016-11-21

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 Abstract 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.