평행코드

다형성 추상클래스와 인터페이스 본문

Java

다형성 추상클래스와 인터페이스

나의 오류는 누군가 겪었던 오류 2023. 9. 17. 14:09

상속을 이용해 부모 타입으로부터 파생된 여러 가지 타입의 자식 객체를

부모 클래스 타입 하나로 다룰 수 있는 기술

상속관계에 있어야함!!

 

클래스 형변환

* 업 캐스팅(Up Casting)

상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가

모든 자식 타입의 객체 주소를 받을 수 있음

// Sonata 클래스는 Car 클래스의 후손
	Car c = new Sonata();
// Sonata클래스형에서 Car클래스형으로 바뀜
// 부모 클래스타입에 자식객체가 저장될때 upcasting
// 부모 클래스타입에 저장되면 부모에 선언된 내용만 접근이 가능하다.

* 다운 캐스팅(Down Casting)

Person person;
person = new Teacher();
// 자식에 선언되어있는 내용에 접근하려면 downcasting(강제형변환) 해야한다.

((Teacher)person).getCareer();
// .이 우선하기때문에 형변환을 먼저하려면 괄호를 쳐주어야 한다
객체배열과 다형성

다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의
배열 공간에 여러 종류의 자식 클래스 객체 저장 가능

People[] peopleArr = new People[5];
peopleArr[0] = new Student();
peopleArr[1] = new Employee();
peopleArr[2] = new Teacher();
instanceof 연산자

현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용하는 연산자

클래스 타입이 맞으면 true, 맞지 않으면  false를 반환

if(레퍼런스 instanceof 클래스타입) {
//true일때 처리할 내용, 해당 클래스 타입으로 down casting
}
    if(p instanceof Student) {
			System.out.println(((Student)p).info()); 
			//p를 Student로 형변환해주고 info를 프린트해줘
		}
		else if(p instanceof Employee) {
			System.out.println(((Employee)p).info());
		}
		else if(p instanceof Teacher) {
			System.out.println(((Teacher)p).info());
		}

p instanceof Student 
// p가 Student기반으로 만들어졌니?
추상 클래스와 추상메소드

몸체 없는 메소드를 포함한 클래스

추상 클래스일 경우 클래스 선언부에 abstrace 키워드 사용

 

*장점

일관된 인터페이스 제공
꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능)

public abstract class SmartPhone {...}

 

추상메소드

몸체 없는 메소드

추상 메소드의 선언부에 abstract 키워드 사용

상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드

 

자식클래스에서 무조건 사용하게 만듦

public abstract String printInfomation();
인터페이스

1. 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract
2. 변수는 묵시적으로 public static final,
따라서 인터페이스 변수의 값 변경 시도 시 컴파일 시 에러 발생
3. 객체 생성은 안되나 참조형 변수로는 가능

 

* 장점

상위 타입 역할로 다형성을 지원하여 연결
- 해당 객체가 다양한 기능 제공 시에도 인터페이스에 해당하는
 기능만을 사용하게 제한 가능
- 공통 기능 상의 일관성 제공
- 공동 작업을 위한 인터페이스 제공

[접근제한자] interface 인터페이스명 {
	// 상수도 멤버로 포함할 수 있음
	public static final 자료형 변수명 = 초기값;
	// 추상 메소드만 선언 가능
	[public abstract] 반환자료형 메소드명([자료형 매개변수]);
	// public abstract가 생략되기 때문에
	// 오버라이딩 시 반드시 public 표기해야 함
}

public interface Phone {
	public abstract String makeCall();
	String takeCall();
}

// CellPhone이라는 인터페이스를 생성 Phone, Camera를 상속받을수도 있다!
public interface CellPhone extends Phone, Camera{
	String charge();
}
추상클래스와 인터페이스비교
구분 추상 클래스 인터페이스
상속 단일 상속 다중 상속
구현 extends 사용 implements 사용
추상 메소드 abstract 메소드 0개 이상 모든 메소드는 abstract
abstract 명시적 사용 묵시적으로 abstract
객체 객체 생성 불가 객체 생성 불가
용도 참조 타입 참조 타입

 

'Java' 카테고리의 다른 글

자주쓰는 Exception  (0) 2023.09.21
Iterator , 동등성비교(equals @Override)  (0) 2023.09.20
오버라이딩과 오버로딩  (0) 2023.09.13
상속이란? 그리고 super  (0) 2023.09.12
객체배열  (0) 2023.09.11