본문 바로가기

IT

15-2. 자바 - 사용제한자 추상화(abstract)

1. 추상화란?

추상화란, 공통된 특징을 묶어 하나의 클래스로 정의하는 것을 말한다.

예를들어, 람보르기니와 페라리 2대의 차를 보았을때 각 차에는 핸들, 바퀴, 문, 창문 등의 요소를 가지고 있는 것을 알 수 있다. 이렇게 람보르기니와 페라리는 서로 다른 객체이지만 공통된 특징과 기능을 지니고 있다. 이런 공통점을 모아 하나의 '자동차'라는 범주, 즉 '클래스'로 묶을 수 있다.

 

2. 추상화를 왜 하는가?

- 추상화를 통해 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 현저히 줄어들 것 이다.

-> 코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과!

-> 잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가한다. 

 

추상화가 잘 되어 있는 코드는 내부 코드를 전부 이해하지 않아도 가져다가 사용할 수 있다는 장점이 있지만 반대로 그렇기 때문에 내부를 파악하거나 수정하는 것이 어려울 수 있다!

 

 

* abstract

abstract 키워드는 클래스와 메서드에 적용됩니다.

추상클래스는 실체 클래스들의 멤버변수와 메서드들의 이름을 통일할 목적으로 사용한다.

추상메서드가 있는 클래스는 반드시 추상 클래스여야한다.

그러나 추상 클래스에 반드시 추상메서드만 선언할 필요는 없고 일반 메서드도 선언할수 있다.

 

* 추상클래스

추상클래스는 new키워드를 이용해서 객체를 만들지 못하고 오직 상속을 통해서 자식 클래스로 구체화 시켜야한다.

추상 클래스도 일반 클래스와 마찬가지로 멤버변수, 생성자, 메서드를 선언할 수 있다.

new를 사용하여 직접 생성자를 호출할수는 없지만 자식 객체가 생성될 때 super()를 호출하여 추상 클래스 객체를 생성하므로 추상클래스도 생성자가 반드시 있어야한다.

 

* 추상 메서드

추상메서드는 추상클래스 내에서만 선언가능.

추상 메서드는 메서드의 선언부만 있고 메서드 실행 내용이 들어가는 중관호 {}가 없는 메서드를 말한다.

추상 클래스를 설계할때 자식 클래스가 반드시 실행내용을 채우도록 강요하고 싶은 메서드가 이쓸 경우, 해당 메서드를 추상 메서드로 선언한다.

자식 클래스에서 반드시 부모 추상 클래스의 추상 메서드를 재정의하여 실행 내용을 작성해야한다. 그렇지 않으면 컴파일 에러가 발생된다.

 

추상화 사용

1. 메서드 이름을 통일시킬때 추상화를 사용

2. 자식과 부모클래스를 강제로 통일 시킬때 추상화를 사용

3. 오버라이딩을 강요할때 추상화를 사용

그럼 추상화를 언제쓸까? 

만약 회사에서 팀장님이 설계용 추상클래스를 만들어놨으면 메서드 오버라이딩 해서 사용하면된다. 

그면 강제화가 되니깐 이름을 틀리지 않고 만들수 있다. 


실습.

package abs.goodcase;

public abstract class HeadStore {
	
	/*
	  1. 메서드에 abstract를 붙이면 해당 메서드는 추상 메서드가 되며
	    이 메서드는 상속을 통해 자식 클래스에서 반드시 오버라이딩을 해야
	    합니다. 그렇지 않으면 에러가 발생합니다.
	  2. 추상 메서드는 실체가 존재하지 않는 메서드의 틀 역할을 하기 때문에
	    메서드의 바디부분 ({})이 없고 세미콜론으로 메서드 선언을 마감합니다.
	  3. 일반 클래스에서는 추상 메서드를 선언할 수 없습니다. 추상 메서드가
	    하나라도 존재하는 클래스는 반드시 추상 클래스가 되어야 합니다.
	  4. 추상 클래스 내부에서는 추상 메서드만을 선언할 필요는 없습니다.
	    일반 메서드도 모두 선언할 수 있습니다.
	 */
	public HeadStore() {
		System.out.println("HeadStore의 생성자 호출됨!");
	}	
	
	public abstract void orderApple(); // 실체가 없기때문에 {}가 없다.
	public abstract void orderBanana();
	public abstract void orderGrape();
	public abstract void orderMelon(); // 관여안함.대신 우리가 지정해야함.
	
	public void orderWaterMelon() {  //지침이지만 수정가능
		System.out.println("수박 쥬스의 가격은 4000원입니다.");
	}
	
	public final void orderPeach() {  //고정
  		System.out.println("복숭아 쥬스의 가격은 2000원입니다.");
	}
	
}

 

 

package abs.goodcase;

public class Store extends HeadStore {
	
// 아래 오버라이딩 안하면 위 public class Store extends HeadStore에 애러발생
//아래 오버라이딩 쉽게 쓰는법 위 에러에 마우스 올리고 add unimplemented methods 클릭
//또 다른방법은 대충 over치고 ctal+엔터 하면 뜸.	
	public void orderBanana() {
		System.out.println("바나나 쥬스의 가격은 2800원입니다.");
	}
	public void orderMelon() {
		System.out.println("멜론 쥬스의 가격은 4800원입니다.");
	}
	public void orderGrape() {
		System.out.println("멜론 쥬스의 가격은 4800원입니다.");
	}
	public void orderApple() {
		System.out.println("멜론 쥬스의 가격은 4800원입니다.");
	}
	
	@Override
	public void orderWaterMelon() {
		System.out.println("수박 쥬스의 가격은 4500원입니다.");
	}
//	public void orderPeach() {
//		System.out.println("복숭아 쥬스의 가격은 2500원입니다.");
//	}
}
package abs.goodcase;

public class MainClass {

	public static void main(String[] args) {
		
		/*
		 - 추상 클래스는 스스로 객체를 생성할 수 없습니다.
		 - 반드시 상속을 통해 클래스를 구체화시켜야 합니다.
		 */
	//	HeadStore h = new HeadStore();
		HeadStore s = new Store();
		s.orderApple();
		s.orderWaterMelon();
		s.orderPeach();

	}

}

 

 

참조 : (JAVA) 추상화와 추상클래스 :: 혀래이의 개발이야기 (tistory.com)

'IT' 카테고리의 다른 글

14. 자바 - 다형성  (0) 2022.09.28
프린터 오프라인 상태로 인쇄 안될 때 해결 방법  (0) 2022.09.28
15-1. 자바 - 사용제한자 final  (1) 2022.09.26
15. 자바 - 사용제한자 static  (1) 2022.09.26
13-1. 자바 - 은닉  (1) 2022.09.25