본문 바로가기
Programming/JAVA(eclipse)

java 9일차 _ 04. 추상클래스(2)

by yoon9i 2024. 3. 20.

3) 특징
- 불완전한 클래스이다. 따라서 객체생성이 불가능하다. ( new 불가 )
- 불완전한 클래스인 자신은 인스턴스가 안되지만
  상속을 통해서 자식 클래스를 이용해서 추상클래스의 구성요소를
  인스턴스화 할 수 있다.

=> 문법:

추상클래스: 
public abstract class AAA {
- 변수
- 생성자
- 메서드
- 추상메서드: public abstract void a ( );
}

AAA x = new AAA( ); // 에러발생

자식클래스:
public class BBB extends AAA {
// 부모의 변수 사용
// 부모의 메서드 사용
// 부모의 생성자 사용불가 ( 생성자는 상속안됨 )

// 부모의 추상메서를 반드시 오버라이딩( overriding ) 해야하는 제약이
   붙는다. 만약에 추상메서드를 오버라이딩 하지 않으면 에러가 발생된다.
}

- 추상클래스는 불완전한 클래스이지만 상속관계이기 때문에
  자식클래스보다 큰 타입이다. 따라서 다형성을 적용할 수 있다.
  ex)
AAA x = new BBB( ); // 다형성

- abstract 는 이탤릭체( 기울어진글씨체 )로 표현.

 

< 추상클래스 적용전 >

package exam15_추상클래스2_적용전;

public class TestMain7 {

	public static void main(String[] args) {
		
		Engineer7 eng = new Engineer7("홍길동",100,"JAVA");
		Manager7 m = new Manager7("이순신", 200, "인사");
		Secretary7 s = new Secretary7("유관순", 200);
		
		System.out.println(eng.getEngineer());
		System.out.println(m.getManager());
		System.out.println(s.getSecretary());
	}

}
package exam15_추상클래스2_적용전;

// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public class Employee7 {
	String name;
	int salary;
	
	// getter, setter
	
	public String getEmployee() {
		return name+"\t"+salary;
	}
}
package exam15_추상클래스2_적용전;

// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer7 extends Employee7 {
	
	String skill;
	
	public Engineer7(String name, int salary, String skill) {
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getEngineer() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam15_추상클래스2_적용전;

// 관리자 클래스
public class Manager7 extends Employee7 {
	
	String depart; // 부서명
	
	public Manager7(String name, int salary, String depart) {
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getManager() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam15_추상클래스2_적용전;

// 비서 클래스
public class Secretary7 extends Employee7 {
	
	String name;
	int salary;
	
	public Secretary7(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	public String getSecretary() {
		return name+"\t"+salary;
	}
}

 

<추상클래스적용후>

package exam15_추상클래스3_적용후;

public class TestMain8 {

	public static void main(String[] args) {
		
		Employee8 eng = new Engineer8("홍길동",100,"JAVA");
		Employee8 m = new Manager8("이순신", 200, "인사");
		Employee8 s = new Secretary8("유관순", 200);
		
		System.out.println(eng.getEmployee());
		System.out.println(m.getEmployee());
		System.out.println(s.getEmployee());
	}

}
package exam15_추상클래스3_적용후;

// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public abstract class Employee8 { // 추상메서드가 하나라도 있으면 추상클래스로 바꿔줘야한다.
	String name;
	int salary;
	
	// getter, setter
	
	public abstract String getEmployee(); // 추상메서드
}
package exam15_추상클래스3_적용후;

// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer8 extends Employee8 {
	
	String skill;
	
	public Engineer8(String name, int salary, String skill) {
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성 
	@Override // 재정의
	public String getEmployee() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam15_추상클래스3_적용후;

// 관리자 클래스
public class Manager8 extends Employee8 {
	
	String depart; // 부서명
	
	public Manager8(String name, int salary, String depart) {
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	
	@Override // 재정의
	public String getEmployee() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam15_추상클래스3_적용후;

// 비서 클래스
public class Secretary8 extends Employee8 {
	
	String name;
	int salary;
	
	public Secretary8(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	@Override // 재정의
	public String getEmployee() {
		return name+"\t"+salary;
	}
}

 

부모의 추상메서를 반드시 자식클래스에서 
오버라이딩( overriding ) 해야하는 제약을 갖도록 하는 것이다. ( 메서드강제 )
+ 부모의 변수/메서드( concrete method ) 를 자식이 상속받아서 재사용.
ex)
버전1: 일반 클래스 Pet 인 경우

Pet
- name, age
- eat( ){ }

// 자식인 Cat, Dog, Bird, ... 에서 eat 기능의 메서드를 마음대로 작성가능.
   관리어려움

Cat
eatCat( ) { s.o.u("쩝쩝"); }
Dog
eatDog( ) { s.o.u("냠냠"); }
Bird
@Override
eat( ) { s.o.u("짹짹"); }

ex)
        
버전2: 추상 클래스 Pet 인경우
// 자식인 Cat, Dog, Bird,... 에서 eat( ) 메서드로만 사용하도록 강제.
abstract Pet
- name, age
- abstract eat( ){ }

Cat
@Override
eat( ) { s.o.u("쩝쩝"); }
Dog
@Override
eat( ) { s.o.u("냠냠"); }
Bird
@Override
eat( ) { s.o.u("짹짹"); }

'Programming > JAVA(eclipse)' 카테고리의 다른 글

java 10일차 _ 9일차 정리  (0) 2024.03.21
java 9일차 _05. 인터페이스  (0) 2024.03.20
java 9일차 _04. 추상클래스  (0) 2024.03.20
java 9일차 _03. 접근지정자  (0) 2024.03.20
java 9일차 _02. Object 의 toString( )  (0) 2024.03.20