z2soo's Blog

JAVA의 Class (9) 추상 클래스 본문

Programming/JAVA

JAVA의 Class (9) 추상 클래스

z2soo 2023. 1. 18. 17:32
반응형

Key point

1. 추상 클래스는 실체 클래스의 공통 부분(변수, 메소드)를 추출한 클래스
2. 추상 클래스로는 객체 생성 불가
3. 추상 클래스 - 실체클래스 : 상속관계
4. 추상 클래스의 추상 메소드는 재정의가 필수!

 

1. 추상 클래스와 실체 클래스

추상(abstract) 클래스는 실체 클래스의 공통된 부분(변수, 메소드 등)을 추출하여 선언한 클래스를 의미한다. 이 때, 실체 클래스는 객체를 직접 생성할 수 있는 클래스를 말하며, 추상 클래스로는 객체 생성이 불가능하다. 추상 클래스를 사용하기 위해서는 반드시 상속해서 사용해야 한다. 

  • 실체 클래스 : 객체 생성 가능
  • 추상 클래스 : 객체 생성 불가능

 

2. 추상 클래스의 용도

추상 클래스는 크게  통일성, 시간절약을 위해 사용된다고 본다. 특히 통일성의 경우, 1) 변수와 메소드의 이름이 동일하여 전체적으로 통일감을 주는 것2) 상속받은 추상 메서드를 반드시 오버라이딩(재정의) 함으로써 템플릿의 통일감을 주는 것 두 의미를 지닌다.  

  • 변수와 메소드의 이름을 통일하여 유지보수에 용이
    : 모든 사람이 동일한 명칭의 변수와 메소드를 활용하여 전체적으로 통일성을 준다. 
  • 반복해서 사용하는 변수와 메소드 템플릿화
    : 추상 클래스를 상속받아 사용함으로써 변수, 메소드 생성의 시간을 절약해준다. 

 

3. 추상 클래스 문법

실체 클래스가 상속할 추상 클래스는 앞에 abstract을 붙여서 생성해주며, 상속받는 실체 클래스에서 무조건 구현되어야 하는 추상 메소드에도 abstract을 붙여서 생성해준다. 상속을 받는 실체 클레스에는 extends를 사용해 상속할 추상 클래스를 언급해주자. 

 

예시로 person이라는 추상 클래스와 이를 상속받는 kim, park 실체 클래스를 작성해보자. 

 

추상 클래스 Person

package Pack06;
public abstract class person {
	public String name;
    
	// 추상 메소드:  구현 로직은 없음
	public abstract void name();		
}

 

실체 클래스 Kim

package Pack06;
public class kim extends person {
	public kim() {this.name = "김씨";}
	
	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("성이 김입니다.");
	}		
}

 

실체 클래스 Park

package Pack06;
public class Park extends person {		
	public Park() {	this.name = "박씨";}
	
	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("성이 박입니다.");
	}		
}

 

PersonTest

package Pack06;
public class personTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		kim personKim = new kim();		
		Park personPark = new Park();		
		
		// 오버라이딩된 메소드 호출 
		personKim.name();	 
		personPark.name();				
	}
}

 

추상 클래스를 상속받는 경우 추상 메소드가 있다면, 무조건 오버라이딩(재정의)를 해줘야 한다. 위의 테스트의 경우에도 추상 메소드 오버라이딩(재정의)가 필수로 재정의를 하지 않으면 아래와 같은 에러 메시지가 나타난다. 

 

재정의 후 personTest  파일을 실행하면 아래와 같은 결과가 나온다. 즉, 다른 클래스의 객체임에도 공통된 변수와 메서드를 가지고 그 중 추상 메서드를 상속한 경우는 메서드 명이 같더라도 다른 기능을 구현할 수 있다. 

 

반응형
Comments