본문 바로가기
언어/JAVA

[JAVA] 추상 클래스, 추상 메소드

by 새벽물망초 2022. 7. 12.

추상 메소드(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

댓글