Java100 Part.4 - 추상 클래스, 추상 메소드

Jeong Woosi·2022년 2월 13일
0

Java100 Part.4

목록 보기
1/14

요약

1.추상(부모) 클래스는 다른(자식) 클래스들의 공통적인 특징을 변수나 메소드로 정의만 해 놓은 것을 말한다. ➡️ 추상 메소드
2. abstract를 앞에 붙이고 클래스 안에 추상 메소드를 포함하고 있다는 것을 제외하면 사실 일반 클래스와 별반 차이가 없다.
3. Field, Constructor, Method(추상 메소드 말고 일반 메소드)도 포함할 수 있다.
4. 메소드 선언만 있고 구체적인 내용은 없으므로 객체를 생성할 수 없다.
5. 따라서, 부모 클래스로서의 역할은 하지만, 구체적인 사용은 상속받은 자식 클래스에서 재정의(오버라이딩)하여 사용해야 한다. ➡️ 강제성
6. 추상 클래스에서 선언만 해놓음으로써 이후 새로운(자식) 클래스들이 이를 상속 받아 구현하므로 새로운 클래스를 작성할 때 하나의 틀이 된다.

와이 쓰지?

  1. 우선 강제하기 위함이다.
  2. 부모(추상) 클래스가 선언해놓은 메소드를 상속받은 자식 클래스들이 이름 그대로 재정의해서 구현하라고 강제하는 것이다.
  3. 상속받은 자식 클래스 입장에서는 자칫 상속만 받고 재정의해서 사용을 안 할 수 있기 때문이다.
  4. 즉, 알반 메소드로 구현하면 누군가는 해당 메소드를 구현 안 할 수도 있다.
  5. 무조건 상속받은 자식 클래스 입장에서는 추상 메소드를 재정의해서 구현하도록 강제하기 위함이다.

꼭 재정의(override)해야만 하는 가?

  1. 일단 그렇다.
  2. 자식 클래스는 일단은 무조건 부모(추상) 클래스로 부터 상속받은 추상 메소드는 오버라이딩해서 재정의를 해야 한다.
  3. 추상 메소드를 포함하고 있다면 곧 추상 클래스여야 한다.

만약, 재정의를 하고 싶지 않다면?

  1. 자식 클래스에서 상속 받은 추상 메소드를 구현하지 않는다면 자식 클래스도 abstract를 붙여서 추상으로 만들어준다.
  2. class 앞에다가 abstract를 붙인다.

결론

  1. 부모(추상) 클래스에서 구현을 하지 않는 이유는 해당 메소드의 구현이 상속받는 클래스에 따라서 달라질 수 있기 때문에 선언만 해둔 것이다.
  2. 이러한 추상 클래스는 여러면의 개발자가 작업할 때 코드의 확장과 분업을 효율적으로 처리할 수 있게 해준다.
  3. 분업화된 시스템에서 공통의 프로젝트를 진행할 때 많이 사용되어지는 중요한 문법이다.

  • 추상 메소드를 하나라도 가지고 있다면 그 클래스는 abstract를 붙여줘야 한다.
abstract class Animal {
	// 구체적인 내용은 작성하지 않고 공통적인 특징을 추상적으로 선언 --> 리턴값 조차도 없이 메소드명만 선언
   abstract void cry();
}

class Dog extends Animal {
	void cry() {System.out.println("멍멍~");}
}

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

class Cow extends Animal {
	void cry() {System.out.println("음메~");}
}

Public class Java100_oop_AbstractClassMethod {
	public static void main(String[] args) {
		
        //[1]: 추상 클래스는 구체적인 내용이 없기 때문에 객체를 생성할 수 없다.
        
        // [2]: 추상 클래스 사용은? --> 상속을 받아서 사용.
        // 즉, 추상 (부모)클래스를 상속받은 자식 클래스에서 해당 메소드를 오버라이딩하여 재정의한 후 사용한다.
        Dog dog = new Dog();
        dog.cry(); // -- 멍멍
        
        Cat cat = new Cat();
        cat.cry; // --야옹야옹
        
        Cow cow = new Cow();
        cow.cry(); // -- 음메~
   }
} 
profile
Let's start to Coding

0개의 댓글