추상 메소드(abstract method)
정의 : 자식클래스에서 반드시 오버라이딩해야 사용할 수 있는 메소드
cf) 추상 클래스 : 추상메소드가 1개 이상 있는 클래스
abstract class 클래스명 {
abstract 반환타입 메소드명();
}
의의 : 추상메소드가 포함된 추상클래스를 상속받는 자식클래스가 반드시 추상메소드를 구현하도록 함
공통적인 부분은 다 만들어진거 사용하고, 사용하는 쪽에선 자신에게 필요한 부분만 재정의해서 사용해서 생산성 향상됨
문법 :
abstract 반환타입 메소드명();
-> 선언부만 있고 구현부가 없다는 의미로 끝에 세미콜론 붙임
예제 :
abcstract class Animal { // 추상클래스 Aniaml 정의
/*
추상메소드 cry() 정의
추상메소드는 반드시 자식클래스에서 오버라이딩 되야 사용가능함
*/
abstract void cry();
}
class Cat extends Animal { // 클래스 Cat 정의
void cry() { // 메소드 cry() 정의 (메소드 오버라이딩)
System.out.println("냐옹");
}
}
class Dog extends Animal { // 클래스 Dog 정의
void cry() { // 메소드 cry() 정의 (메소드 오버라이딩)
System.out.println("멍멍");
}
}
public class Test {
public static void main(String[] args) {
// Animal a = new Animal(); -> 추상클래스의 인스턴스 생성 불가 !
Cat c = new Cat(); // Cat 클래스의 c 객체 생성
Dog d = new Dog(); // Dog 클래스의 d 객체 생성
c.cry(); // c 객체에서 cry메소드 실행 ( cat클래스의 cry메소드 실행됨 (?) )
d.cry();
}
}
실행결과
냐옹
멍멍
p.232 예제
abstract class Animal { // 추상클래스 Animal 정의
String a = " is animal"; // 문자열 변수 a 선언
abstract void look(); // 추상메소드 look() 정의
void show() { // 메소드 show() 정의
System.out.println("zoo");
}
}
class Chicken extends Animal { // 클래스 Chicken(자식) 정의, 클래스 Animal(부모)에게 상속받음
Chicken() { // Chicken 메소드 정의 (생성자)
look();
}
/*
Animal 클래스에서 look()이라는 추상메소드 정의되어있지만
자식클래스가 우선순위 높으므로 메소드 오버라이딩 발생함
따라서, Chicken 클래스의 look() 메소드 사용
*/
void look() {
System.out.println("Chicken" + a);
}
void display() { // display 메소드
System.out.println("two wings");
}
}
public class Test {
public static void main(String[] args) {
/*
Animal(부모) 클래스에 a 객체 생성하는데, Chicken(자식) 생성자를 이용한다
부모클래스의 객체 변수를 선언하면서 자식클래스의 생성자를 사용하면 형 변환 발생
형 변환 발생시, 부모나 자식클래스에 동일 속성이나 메소드 존재하면 자식클래스꺼로 재정의함
*/
Animal a = new Chicken();
a.show(); // (Animal 클래스의) a객체에 show메소드 실행 ?
}
}
실행결과
Chicken is animal
Zoo
p.283 문제45번
class SuperObject {
public void paint() {
draw();
}
public void draw() {
draw();
System.out.println("Super Object");
}
}
class SubObject extends SuperObject {
public void paint() {
super.draw();
}
public void draw() {
System.out.println("Sub Object");
}
}
public class Test {
public static void main(Stinrg[] args) {
SuperObject a = new SubObject();
a.paint();
}
]
Sub Object
Super Object
* class 자식 extends 부모 : 자식클래스는 부모클래스의 변수 및 메서드 사용 가능
1]
먼저 main함수 ㄱㄱ
SuperObject a = new subObject() 여기서 부모클래스 객체변수 = new 자식생성자 으로 사용됨 (형 변환)
이렇게 되면, 부모와 자식에 동일한 속성이나 메서드가 있으면 자식의 속성이나 메서드로 재정의 됨
따라서 a.paint()는 SubObject클래스의 paint() 함수 실행
2]
-SubObject의 paint()-
public void paint() {
super.draw();
}
이는 부모클래스의 draw()함수를 실행해라 라는 뜻
-SuperObject의 darw()-
public void draw() {
draw();
System.out.println("Super Object");
}
처음에 a객체 생성하면서 형 변환이 일어나면서 부모와 자식에 동일 속성이나 메서드가 있으면
자식의 속성이나 메서드로 재정의된다고 하였다
draw() 함수가 부모와 자식에 동일하게 있고, 현재 부모클래스이므로 메서드재정의에 의해
자식클래스의 draw() 함수를 사용하여야 한다
-SubObject의 draw()-
public void draw() {
System.out.println("Sub Object");
}
Sub Object
끝났으면 방금전의 SuperObject의 darw() 로 이동
-SuperObject의 darw()-
public void draw() {
draw();
System.out.println("Super Object");
}
Sub Object
Super Object
SuperObject의 draw() 종료 -> SubObject의 paint() 종료 -> main() 종료
Q) 이해가 잘 ㄴ
'언어 > JAVA' 카테고리의 다른 글
[JAVA] static 변수(정적 변수) + 지역변수, 전역변수 (0) | 2022.09.23 |
---|---|
변수 자료형 (0) | 2022.09.16 |
[JAVA] 클래스, 상속, 생성자 (0) | 2022.07.12 |
getter/setter 메소드 (0) | 2022.04.04 |
연산자 (0) | 2022.02.18 |
댓글