Published 2022. 8. 18. 10:58
반응형

추상에 대해서 알아보도록 합시다 

 

추상 메서드라고 많이 말들을 하는데 추상 클래스도 있기 때문에 

굳이 메서드라는 단어를 붙이진 않았습니다 ㅎㅎ

 

오늘은 처음부터 결론을 말할게요

 

추상 메서드를 쓰는 이유는 클래스의 상속을 강제하기 위함입니다 

 

public class blogTest {

	public static void main(String[] args) {
		
		AbTest ab = new AbTest();
		
	}

}

abstract class AbTest {
	
	public abstract int b();
	
}

이 코드는 에러가 발생하는 코드입니다 ㅎㅎ 

abstract 즉 추상 클래스나 메서드는 상속을 받아서 사용하는 것이므로 

메인에서 처럼 인스턴스화 해서 바로 사용할 수 없습니다 

자 그럼 우리가 꼭 AbTest 클래스를 인스턴스화 해서 사용해야 하는데 어쩌지... 

 

상속받아서 자식 클래스를 인스턴스화 하면 됩니다 ㅎㅎ 방법은 항상 있죠 우리가 모를 뿐..

(제가 아마 더 낮을 것 같습니다.. 자존감은 낮지 않아요 )

 

public class blogTest {

	public static void main(String[] args) {
		
		AbEx abe = new AbEx();
		abe.b();
		
	}

}

class AbEx extends AbTest{
	
	public int b(){
			System.out.println("이제 되겠죠?");
		return 1;
	}
	
}

abstract class AbTest {
	
	public abstract int b();
	
}

위의 코드와 아래 코드를 비교해보면 우리가 저번에 배웠던 상속할 때 쓰는 키워드 extends(확장)

를 사용해서 새로운 자식 클래스를 만들었습니다 

여기서 끝날게 아니라 우리는 b클래스를 반드시 구현해야 해요 왜냐하면 b가 추상 메서드이고 

이걸 구현하지 않으면 에러가 발생한답니다 ㅎㅎ 추상적인 메서드이니까 이걸 사용하려면

네가 구현해라는 말이에요 

 

처음 말했던 것처럼 추상 클래스 추상 메서드는 상속을 강제하기 위함이에요 

그럼  이런 방식을 왜 사용하는 것인지 생각해볼 필요가 있습니다 

 

작은 단위의 프로젝트는 이런 일이 거의 없습니다 그런데 아주 큰 프로젝트라고 생각을

해봅시다

 

동일한 작업을 하는 메서드가 있는 반면 조금 달라야 하는 메서드가 있다고 한다면 

추상 메서드를 사용하면 간편해집니다 자식 클래스에서 알아서 구현하면 

되거든요 ㅎㅎ 

 

코드로 봅시다 

 

package studyProject;



public class blogTest {

	public static void main(String[] args) {
		
		AbEx abe = new AbEx();
		abe.b();
		
		AAEx aae = new AAEx();
		aae.b();
		
	}

}

class AbEx extends AbTest{
	
	public int b(){
			System.out.println("나는 그냥 출력만 하고 1 을 리턴할래요");
		return 1;
	}
	
}

class AAEx extends AbTest{
	
	public int b(){
		
		int chkVal = 0;
		
		if (1 < 2) {
			System.out.println("1보다 2가크다를 출력하자");
			chkVal = 1;
		}else {
			System.out.println("2보다 1가 크다");
			chkVal = 0;
		}
		return chkVal;
	}
	
}

abstract class AbTest {
	
	public String pntM() {
		System.out.println("나는 공통적으로 사용하는 메서드입니다 달라질게 없거든요");
		return "";
	}
	
	//나는 출력 방식이 서로 달라야합니다 그래서 자식 클래스에게 위임해서 알아서 만드라고 할래요! 근대 구조는 이런식이에요 
	public abstract int b();
	
	
	
}

 

AbTest 추상 클래스를 상속받은 클래스가 2개 있습니다 바로 AbEx와 AAEx입니다 

문제는 b 메서드를 보시면 내부 내용이 다르죠?

이처럼 자식에게 구현을 미루는 행위가 바로 추상입니다

 

실무에서 이런 형태의 클래스를 만난다면 바로 이런 이유일 겁니다 

부장님이 만들어놓은 클래스 A 가 있습니다 워낙 잘 짜서 이 클래스를 상속받아 사용해야겠다 

생각을 했어요 그런데 내가 생각한 것과는 약간 다른 b메서드가 있네요 아 이걸 조금만 바꿔서 

사용하면 안 되나 생각에 부장님께 A클래스에 있는 b메서드가 저랑 조금 다른데 이걸 조금만

바꿔주세요라고 하면 부장님은 아마 이 클래스 다른 사람도 사용하는 클래스라 수정할 수 없다

라고 할 거예요 근데 우리 똑똑한 부장님이 그걸 사전에 미리 파악하고 중요한 핵심기능은 a메서드에

공통적으로 사용하라고 만들어놓고 b메서드는 추상 메서드로 만들어놨습니다 그러면 A클래스를 

수정할 필요가 없어지는 것이죠 

 

이처럼 추상 클래스의 의의는 공통분모의 경우는 모두가 다 공유하게끔 부모 클래스에 두고 

코드 중복을 줄이고 유지보수가 용이하도록 만듭니다 ㅎㅎ 

 

그리고 덧붙이자면 나중에 b클래스가 클라이언트에 의해서 이거 바꿔주세요!!! 빼애애애액 이 

일어났을 때 그냥 b만 바꿀 수 있으니 용이합니다 

 

모든 문제는 유지보수와 코드 중복을 줄인다라고 생각하고만 있었지만 

일상의 예를 들어 이해를 돕고자 했습니다 감사합니다 

반응형

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

[java]컬렉션즈 프레임워크  (0) 2022.08.22
[java] 예외처리  (0) 2022.08.18
[java] 접근제어자  (0) 2022.08.16
[java]오버라이딩  (0) 2022.08.03
[java]상속  (0) 2022.08.02
복사했습니다!