Developer/JAVA

JAVA , 추상 클래스

단님 2024. 8. 8. 00:51
728x90
자바의 다형성을 이용한 클래스

 

다형성을 보다 체계적으로 더 잘 운영하기 위하여 추상이라는 개념이 나왔다.

추상이란 규칙만 명시해놓은 것을 말한다.

추상이 가능하냐 ? 라고 물어본다면 , 상속과 다형성이 가능하냐 ? 라는 뜻으로 보기도 한다.

추상클래스는 타입으로 사용하는 조상의 개념이고 , 직접 생성할 수는 없고 자손을 통한 생성을 하게된다.

  • 다형성의 장점

1 . 유연성 : 코드가 더 유연해지고 유지보수가 용이하다. 새로운 클래스나 메서드를 추가할 때 기존 코드를 거의 수정하지 않아도 된다.

2. 재사용성 : 동일한 인터페이스를 사용하여 다양한 객체를 처리할 수 있어 코드의 재사용성이 높아진다.

3. 가독성 : 코드를 읽고 이해하기 쉽게 만들어준다. 같은 메서드 이름을 사용하여 의미를 전달 할 수 있다.

 

추상 클래스란 ?

 

abstract : 추상 : 구체화 되어 있지 않은, 보는 사람의 주관적인 해석이 들어감.

추상 메서드를 가지고 있어야 추상  클래스가 된다.

추상 메서드란 , 몸체가 구현되지 않은 메서드를 의미한다. 즉 , 바디가 정의 되지 않았다.

추상 메서드를 만들어 놓는 이유는 이름만 만들어 놓고 후손 클래스들이 구현을 강제한다.

  • 추상 클래스의 예시

 

추상 클래스에서 정의한 추상메서드는 후손이 반드시 구현해야하며 , 

아무것도 하지 않는다고 하더라도 형태를 의무적으로 만들어야 한다.

추상 클래스를 만들고,
후손 클래스에서 사용해보자

 

  • 추상클래스 (아빠)
//하나라도 추상 메서드가 포함된다면 클래스 또한  추상 클래스로 ,abstract 명시,
abstract class Animal{ 
	
	String kind;
	
	//일반 메서드가 와도 됨.
	void breath() {
		System.out.println(kind + "는(은) 숨을 쉽니다.");
	}
	
	//추상 메서드 : 헤더명시 + 세미클론 표기 + abstract 명시
	abstract void sound();
    
    Animal(){
		System.out.println("Animal의 기본 생성자 , class ) Animal ");
	}
}

 

  • 후손클래스 (아들)

후손 클래스 생성시 , 빨리 추상메서드를 생성하라고 빨간 밑줄까지 그어가며 확인 시켜줌.

 

class Cat extends Animal{
	
	Cat(){
		kind = "고양이";
		//super.kind="고양이"; //위와 동일
	}
	
	@Override
	void sound() {
		System.out.println("야옹 야옹 , class ) Cat -Animal ");
		
	}
	
	void eyeColor() {
		System.out.println("고양이 눈은 반짝 반짝 ! , class ) Cat -Animal");
	}
	
}

class Dog extends Animal{

	Dog(){
		kind = "강아지";
		//super.kind="강아지"; //위와 동일
	}
	
	@Override
	void sound() {
		System.out.println("몽몽 몽몽  , class ) Dog -Animal");
	}
	
	void speed() {
		System.out.println("우리집 강아지는 초수피드 !  , class ) Dog -Animal");
	}
}

 

메인 메서드에서 사용해보자.

 

  • 추상 클래스 생성해보기
Animal animal = new Animal(); 
//  컴파일 오류  : Cannot instantiate the type Animal

 

추상클래스는 타입으로 이용이 가능하나 , 직접적인 생성이 불가함을 볼 수 있다.

 

후손 인스턴스를 통해 생성한다.

  • 후손인스턴스를 통한 추상클래스 이용해보기
Animal cat1 = new Cat();
cat1.sound();
cat1.breath();
Animal dog1 = new Dog();
dog1.sound();
dog1.breath();

Animal cat1 = new Cat();

→클래스 교체를 하려면 우측의 생성자 명만 수정하면된다.

 

★조상의 타입으로 정의했다는 것은 즉 , 조상에 선언된 멤버들만 사용했다는 것을 의미한다. ★

→ 즉 , cat에만 새로이 정의한 멤버는 사용 하지 않았다는 뜻.

→ dog로 새로 인스턴스를 생성하여 담아도 문제가 되지 않는다는 뜻.

 

Animal dog1 = new Dog();
dog1 = new Cat();

→ 이런식으로 다른 클래스 인스턴스 생성을 이용할 수 있다는 뜻.

 

  • cat 타입의  cat 의 인스턴스 생성하기
System.out.println("순수 cat 인스턴스");
Cat cat2 = new Cat();
cat2.sound();
cat2.breath();
cat2.eyeColor();

→이렇게 생성하면 , 클래스 교체할 적 , 생성문자체를 수정해야함.