🔯  추상클래스 abstract class

1. 추상클래스란? 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!

> 메소드가 미완성되어 있으므로

3. 추상클래스와 실체클래스는 어떤관계? 상속관계! (추상 클래스는 부모 클래스 역할 (단독 객체X)

4. 하나의 추상 클래스에 정의된 기능을 여러개의 하위 클래스에서 서로 다른 형태로 구현하여 사용할 수 있다

 

class 정의 특징
실체 클래스 실체가 드러나는 클래스
>실제 객체를 생성할 정도의 구체성을 가짐
실체클래스는 자식 클래스
추상 클래스 실체 클래스의 공통적인 부분을 추출해 어느정도 규격을 잡아놓은 추상적인 클래스
>메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다!
추상 클래스는 부모 클래스 

 

▶ 사용하는 이유

1. 공통된 필드와 메서드를 통일할 목적

더보기

10명 개발자에게 자동차를 상속받아 각자만의 실체클래스를 구현하라고 주문해보자.

10명 개발자가 생각한 변수명과 메서드명은 제각기 다른 이름을 가지고 구현될 것이다. 이렇게 구현이 되면 문제가 있다. 만약, 수만줄에 이르는 코드에 A라는 자동차 실체클래스 객체를 선언하고 해당 객체의 필드와 메서드를 떡칠했다고 치자. 헌데, A자동차가 계약만료되고, B자동차를 새로 교체해야한다고 하자....응?

 

느낌이 오는가? 만약 B자동차의 변수와 메서드명이 A자동차와 동일하면 객체 인스턴스만 변경하면 되는데, 필드와 메서드를 전부다 체크해서 변경해줘야한다. 유지보수는 개뿔 이건 아예 새로 개발하는 느낌일 것이다. 따라서 추상클래스를 만든다! 즉, 추상클래스에서 미리 정의한 필드와 메서드가 있다면, 실체클래스는 추상클래스의 필드와 메서드명을 변경할 수 없고 무조건 해당 명명으로 구현해야한다. 따라서, 필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성을 유지할 수 있다.

2. 실체클래스 구현시, 시간절약

더보기

자자 실무적으로 생각해보자! 나는 SI개발자이다. 헌데 시간이 겁나 없다 빨리 개발해야하는데.. 갑자기 나보고 자동차라는 어마무시한 클래스를 일주일 안에 구현하라고한다. 그럼 설계부터 생각한다. 음..자동차는 바퀴가 있어야하고, 굴러가야하고 아 맞어 백미러도 있어야하고...트렁크도 있어야하고 ...응?

 

느낌이 오는가? 여기서 추상클래스는 효과를 발휘한다. 내가 자동차를 구현해야하는데, 자동차 추상클래스를 상속받으면, 자연스럽게 자동차에 공통적으로 들어가야하는 필드와 메서드가 녹여져있는 필드와 메서드가 똭 하고 오버라이딩 된다. 즉, 강제로 주어지는 필드와 메서드를 가지고 나만의 스타일대로 구현만 하면 된다. 설계 시간이 절약된다..구현하는데만 집중할 수 있다!!

 

그럼 여기서 잠깐! 그런 추상클래스는 결국 누군가 설계해야하는데 누가하나요? 결국 시간절약이 안되는거 아니에요? 보통 당신이 취업하면 바로 그런일을 안한다. 그럼 누가할까? 그런 설계적인 일만 하라고 있는 고급개발자?가 있다. 바로 AA!! 어플리케이션 아키텍쳐(application architecture)가 멋지게 설계해줄거다. ㅎㅎ 그러니 우리는 일단! 추상클래스가 어떤건지 알고, 이를 상속받아서 멋지게 구현하면 된다는 사실을 기억하자.

3. 규격에 맞는 실체클래스 구현

더보기

2.실체클래스 구현시, 시간절약과 비슷할 수도 있는 내용이다. 하지만 따로 분류해서 설명해야할 것 같아서 굳이 규격에 맞는 실체클래스 구현이라고 했다. 이미 설명했지만, 아무리 자기 스타일대로 클래스를 구현한다고 해도 그것도 결국엔 규격안에서 구현하는 것을 허락한다는 것이지, 규격도 없이 아무렇게나 구현을 해서는 안된다. 왜냐...혼자서 개발하는 일이 아니다. 모두가 약속한 필드와 메서드 그리고 설계 규칙에 녹아져있는 규격에 맞는 클래스를 구현해야한다. 그래야 코드 수정시, 영향도를 적게 가져가면서 유지보수성을 높일 수 있다. 따라서 선임 설계개발자가 와꾸(?)를 잡아주고, 해당 규격에 맞게 클래스를 구현하면 된다. 

 

여기서 추상클래스의 강력한 기능이 나온다. 추상클래스를 상속받은 실체클래스들은 반드시!! 추상메서드를 재정의(오버라이딩)해서 실행 내용을 작성해야 한다. 만약 그렇지 않으면 컴파일 에러를 발생시켜 실행조차 못하게 막는다. 따라서, 코더들은 강제적으로 추상메서드를 구현해야한다. 여기서 추상메서드라는 것이 갑자기 나왔는데, 추상클래스 안에 abstract 키워드를 가지고 있는 메서드는 추상메서드라고 하고, 상속시 반드시 재정의해야하는 메서드라는 뜻이다.

 

아무튼! 중요한건, 소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용하기도 한다. 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손 쉽게 수정이 가능하기 때문이다.

추상클래스를 상속받아 실체클래스를 구현하는 실무현장

 

🔯  추상 클래스 선언

- 클래스 앞에 abstract 키워드를 붙이면 된다

1. 메서드 선언 시 본문을 구현하지 않을 때 abstrct로 선언해야 함
2. 추상 클래스의 추상메서드는 선언부만 있기 때문에 이를 상속한 자식 클래스에서는 반드시 재정의 해야 한다

public abstract class 클래스명; {     

     //필드

     //생성자

     //메서드

     //추상메서드

}

-------------------------------------------------------------------------

 추상 메소드 선언

- 추상 메소드는 자식 클래스에서 재정의할때 오버라이딩(Override)을 먼저 써둬야함

- 메서드 리턴타입 앞에 abstract 키워드를 붙이면 된다

-------------------------------------------------------------------------

public abstract void 메서드명(매개변수);

-------------------------------------------------------------------------

 

 

 추상 메소드와 오버라이딩의 차이점

∘ 메소드 이름은 동일하지만, 실행 내용이 실체 클래스마다 다른 메소드

∘  예: 동물은 소리를 낸다. 하지만 실체 동물들의 소리는 제각기 다르다.

  차이점 구현 방법
추상 메소드 이러한 메서드를 사용할꺼다 라고
리턴타입 메소드명 매개변수만 명시한다
직접적인 구현은 이 추상 메서드를 상속받은 자식 클래스에서 한다
추상 클래스는 메소드의 선언부만 작성 
(추상 메소드)
오버라이딩 자식 클래스에서 부모클래스 메소드의 쓰임을 변경하고자 할 때 쓴다
리턴타입 메소드명 ③매개변수의 개수, 타입, 순서가 반드시 똑같아야 한다.
실체 클래스는 메소드의 실행 내용 작성 
(오버라이딩)

 

 추상 메소드와 오버라이딩/클래스

추상 메소드와 오버라이딩                                                                                              클래스

 

✔ 추상 클래스 예시

더보기

1. 추상 클래스

//추상클래스
public abstract class Animal {		
	
	//필드
	public String kind;
	
	//일반 메서드
	public void breath(){
		System.out.println("숨 쉰다.");
	}
	
	//추상메서드
	public abstract void sound();
	//1. 구체적인 구현부는 없음!
	//2. 여기서 해당 추상클래스를 상속받는 실체클래스들은 
	//3. 반드시 sound()라는 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
}

2. 자식 클래스

//실체클래스
//extends를 통해, Animal 추상클래스를 상속받음
public class Dog extends Animal{

	//추상 클래스 필드 사용
	public Dog(){
		this.kind = "포유류";
	}
	
	//1. sound() 추상메서드 재구현
	//2. 여기서 오버라이딩을 하면, 다형성이 발생된다
	//3. 규격에 맞게끔 필드명과 메서드명이 통일되어 있음을 알 수 있다 (규격이 맞춰져 있다는 뜻
	@Override
	public void sound() {
		System.out.println("왈왈!");
	}

}

3. 자식 클래스

public class Owl extends Animal{

	public Owl(){
		this.kind = "조류";
	}
	@Override
	public void sound() {
		System.out.println("야~옹!");
	}

}

4. 실행 클래스

public class Run {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Dog dog = new Dog();
		Owl owl = new Owl();
		
		dog.sound();
		owl.sound();
		
		Animal animal = null;
		
		animal = new Dog(); //자동 타입변환
		animal.sound(); //Dog에 구현된 Sound()메서드 실행
		
		animal = new Owl(); //자동 타입변환
		animal.sound(); //Cat에 구현된 Sound()메서드 실행
		
		
		animalSound(new Dog()); //자동 타입변환 (매개변수도 가능)
		animalSound(new Owl()); //자동 타입변환 (매개변수도 가능)
	}
	//자동 타입변환 : 추상클래스 타입 변수는 추상클래스를 상속받은 실체클래스의 타입으로 자동 타입변환이 된다. 
	private static void animalSound(Animal animal) {
		animal.sound();
	}
}

'Language > Java' 카테고리의 다른 글

다형성 (Polymorphism)  (0) 2022.02.21
인터페이스 (interface)  (0) 2022.02.21
클래스  (0) 2022.02.21
자바  (0) 2022.02.18
예외객체  (0) 2022.02.18