자바의 다형성을 이용한 클래스
다형성을 보다 체계적으로 더 잘 운영하기 위하여 추상이라는 개념이 나왔다.
추상이란 규칙만 명시해놓은 것을 말한다.
추상이 가능하냐 ? 라고 물어본다면 , 상속과 다형성이 가능하냐 ? 라는 뜻으로 보기도 한다.
추상클래스는 타입으로 사용하는 조상의 개념이고 , 직접 생성할 수는 없고 자손을 통한 생성을 하게된다.
- 다형성의 장점
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();
→이렇게 생성하면 , 클래스 교체할 적 , 생성문자체를 수정해야함.
'Developer > JAVA' 카테고리의 다른 글
JAVA , 열거형 클래스 enum ! (1) | 2024.09.21 |
---|---|
JAVA , 추상 클래스의 다형성 보기 (1) | 2024.08.08 |
JAVA , 클래스의 다형성, 타입 캐스팅(형변환) , 종단 클래스 (0) | 2024.08.07 |
JAVA , 상속관계 is-a (0) | 2024.08.06 |
JAVA , 클래스간의 관계 : use , has, is (0) | 2024.08.06 |