| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- ncbi
- 딥러닝
- COVID
- SVM
- 인공지능
- 오류역전파
- 결정트리
- 인공지능 수학
- 서열정렬
- CNN
- 바이오파이썬
- HMM
- 인공신경망
- 이항분포
- MERS
- 파이썬
- Kaggle
- 자바
- 생물정보학
- 캐글
- BLaST
- 블록체인
- 시그모이드
- RNN
- AP
- 생명정보학
- 바이오인포매틱스
- Java
- AP Computer Science A
- bioinformatics
- Today
- Total
데이터 과학
추상 클래스와 오버라이딩 본문
추상(Abstract) 클래스에 대한 예제를 보면서 추상화에 대한 개념을 설명해 봅니다.
자바 프로그램을 작성하다 보면 상속 이후에 사용하지 않는 메소드들이 나타납니다.
아래 예제는 보면 도형이라는 클래스안에 그리다라는 메소드가 정의되어 있습니다. 이 그리다라는 메소드는 삼각형이라는 클래스에서 재정의가 이루어집니다. 이를 오버라이딩(Overriding)이라고 합니다.
오버라이딩. 재정의를 하면 메소드의 본문이 변경됩니다.
오버라이딩. 재정의 목적은 부모클래스의 메소드의 본문을 변경하는데 있습니다.
class 도형{
double 면적;
public void 그리다() {
System.out.println("도형을 그린다"); // 이 구문은 실행되지 않습니다.
}
public double 면적구하기(){
return 면적;
}
}
class 삼각형 extends 도형{ // 도형 클래스를 상속받습니다.
double 밑변, 높이;
public 삼각형(int a, int b){ // 생성자
밑변=a;
높이=b;
면적=밑변*높이/2;
}
public void 그리다(){ // 부모클래스에 있는 그리다 메소드를 오버라이드(Override), 재정의합니다.
System.out.println("삼각형을 그린다");
}
}
public class Abstract2{
public static void main(String[] args){
도형 tr=new 삼각형(100,200);
System.out.println(tr.면적구하기());
tr.그리다();
}
}
오버라이딩을 하다 보면 메소드 안에 있는 본문이 실행되지 않습니다.
결과가 나오지도 않는 본문을 가지고 있어야 할 이유가 없겠죠.
그래서 메소드의 본문 { } 을 삭제합니다.
메소드의 본문이 삭제된 메소드를 추상(abstract)메소드라고 합니다.
이렇게 본문이 없는 추상메소드가 선언되면 그 클래스는 추상(abstract)클래스가 됩니다.
그렇다면 추상클래스는 추상메소드가 있기에 선언되는 것이겠죠.
그래서 추상클래스는 추상메소드도 가지고 있고, 일반 메소드도 가질 수 있습니다.
그렇지만, 추상클래스는 객체가 될 수 없습니다.
도형을 추상클래스로 정의하면 추상화를 만들 수 없습니다.
도형 a=new 도형();
이렇게 하면 컴파일 할 때 에러가 납니다.
아래 예제는 도형을 추상 클래스, 부모클래스로 정의 한 후 작성한 예제입니다.
삼각형과 사각형은 자식클래스가 되겠지요.
abstract class 도형{ // 추상 클래스
double 면적;
public abstract void 그리다(); // 추상 메소드
public double 면적구하기(){
return 면적;
}
}
class 삼각형 extends 도형{ // 상속
double 밑변, 높이;
public 삼각형(int a, int b){ // 생성자
밑변=a;
높이=b;
면적=밑변*높이/2;
}
public void 그리다(){ // 상속받은 추상 메소드를 오버라이드 합니다.
System.out.println("삼각형을 그린다");
}
}
class 사각형 extends 도형{ // 상속
double 가로,세로;
public 사각형(int a, int b){ // 생성자
가로=a;
세로=b;
면적=가로*세로;
}
public void 그리다(){
System.out.println("사각형을 그린다");
}
}
public class Abstract1{
public static void main(String[] args){
도형 tr=new 삼각형(100,200);
도형 re=new 사각형(100,200);
System.out.println(tr.면적구하기());
tr.그리다();
System.out.println(re.면적구하기());
re.그리다(); // tr과 re는 모두 그리다()를 사용하여 그린다. }
}
}
결과
10000.0
삼각형을 그린다
20000.0
사각형을 그린다
위 예제를 보면
도형 tr=new 삼각형(100,200);
도형 re=new 사각형(100,200);
이렇게 선언되어서 사용합니다. 이 부분은 가능하겠죠.
도형은 데이터 타입 형태로 선언됩니다. 각각 tr과 re라는 객체가 만들어지는데 이는 삼각형과 사각형을 참조합니다.
추상클래스는 데이터 타입으로는 가능하고, 그 대상으로는 선언이 안됩니다. 어려운가요.
쉽게 생각하면 구체화가 되지 않으면 만들어 질 수가 없습니다. 그래서 메소드 오버라이딩을 통해 추상메소드의 본문(body, { } )를 생성하여서 구체화를 해야 객체의 대상으로 정해 질 수 있습니다.
구체적인 상태가 되어야만 객체의 능력을 부여 할 수 있는 것입니다.
이상 추상 클래스와 오버라이딩에 대해 알아보았습니다.
'프로그래밍 언어론 > JAVA 기초' 카테고리의 다른 글
| static 메소드 (0) | 2023.03.19 |
|---|---|
| 인터페이스 (interface) (0) | 2022.11.13 |
| 상속(Inheritance) (10) | 2022.11.06 |
| 메소드 오버로딩 (7) | 2022.11.05 |
| 생성자 (constructor) (8) | 2022.10.30 |