PL 상속(8)
Java, C++, Python에서의 상속 구현 방식, 다형 참조와 동적 바인딩, 타입 캐스팅, 추상 클래스와 가상 함수의 개념, 그리고 다중 상속의 특징에 대해 설명합니다.
상속
상속 – 자식 클래스가 부모 클래스를 포함하는 집합 느낌(부모 메소드, 변수 + 자신꺼 사용하니까)
1-1. Java 상속
extends 사용, 단일 상속만 지원(python, C++ 은 여러개 지원!)
super – 부모 클래스 참조
오버라이딩(메소드 재정의) - 부모 클래스의 메소드를 자식 클래스가 재정의 + 서명 동일
오버로딩(중복정의) - 한 클래스 내에 같은 이름이 여러 개의 메소드 + 서로 다른 서명
- 메소드 서명(signature) - 메소드의 매개변수 이름, 개수, 순서, 타입
1-2. 다형 참조
다형 참조 – 참조변수는 선언된 클래스의 객체뿐만 아니라 자손 클래스의 객체도 참조 가능
-
동적 바인딩(실행시간에 바인딩) - 호출될 메소드는 참조 변수의 타입이 아닌 실행시간에 참조된 객체 타입에 결정
-
다형 참조로 동적 바인딩 한 것은 해당 함수가 서로 있으니까 현재 참조하는 객체에 맞는 함수를 실행해준 것
- 예시로
emp = manager; emp.pay();
은 오버라이딩한 manager꺼 pay()를 호출하게 됨
- 예시로
참고로 이렇게 암묵적 확장만 가능하지 축소는 정보손실 때매 애초에 불허
1-2. 타입 캐스팅
타입 캐스팅 – 부모클래스가 해당 함수 없을 때 사용(반드시 동적 바인딩과 구분!!!)
- 자바에서 자동 축소 아예 불허인데 INT형만 가능(범위 이내 가능. 예외적 상황임).
- 캐스팅(범위 이상 가능). 즉, 캐스팅은 강제로 변환!(double->int같은것). 정보손실도 상관없다는 것. 다만!!
-
클래스에선 상속에 다형참조 여야 가능
- 예시로
Employee e = new Manager(); e.getbonus();
getbonus() 메소드가 Manager꺼다? 그럼 부모엔 함수 없어서 사용불가.
이럴 때 아예 타입을 바꿔야 한다는 것!(타입 캐스팅).(Manager) e.getbonus();
가 올바르다.
- 예시로
-
타입 캐스팅이 오류인 예?
-
Employee a = new Employee(); Manager b = (Manager) a;
다형 참조가 아니기 때문에 캐스팅 불가.
-
즉, 다형참조 후에 캐스팅해야 캐스팅 가능, 다형참조 아니면 캐스팅 불가
1-3. 추상 클래스
추상 클래스 – 덜 구현된 클래스. 따라서 실체화될 수 없다(객체 생성X)
자식클래스가 부모 클래스의 해당 추상메소드를 구현하지 않으면 자신도 추상 클래스가됨(강제 오버라이딩 시키는구조라 판단)
-
abstract class 클래스이름 { abstract 리턴타입 메소드이름(매개변수선언); // 본체가 없다 }
- 추상 메소드는 final, static으로 선언X
- 추상 메소드는 코드처럼 본체가 없다
추상클래스가 Worker였고, pay()메소드가 추상메소드였다면?
- 자식 클래스인 Employee와 Parttimer또한 메소드 오버라이딩 했을 것이다.
-
그럼
Worker work = new Employee() 나 Parttimer()
로 work가 원하는 pay()메소드 사용가능 - 추상 클래스를 쓰면 이렇게 공통된 하나의 Worker로 표현이 가능. 이것이 주로 추상을 사용하는 이유!
2-1. C++ 상속
명칭 구분
-
C++ : 데이터 멤버, 멤버함수
-
Java : 인스턴스 변수, 메소드
C++의 가상 함수 – virtual로 선언된 함수로 자식클래스에서 재정의 가능한 함수(Java 메소드는 virtual!!)
- 가상 함수 호출 – 객체 타입에 따라 동적 바인딩
C++의 순수 가상 함수 – 자식클래스에서 정의되는 함수(Java의 추상 메소드). 본체가 정의 안된 함수로 암기
- 가상 함수가 아니라면 정적 바인딩을 한다.(컴파일시간. 타입선언)
- 정적 바인딩 장점은 실행 효율. 그래서 C++은 자바보다 기본적으로 빠름.
유효범위 해결 연산자 – Student::sleep() 혹은 Worker::sleep()
- 다중상속의 죽음의 다이아몬드 문제를 해결
3-1. Python 상속
C++의 virtual선언 같은 것이 필요없고, 자바처럼 바로 재정의(오버라이딩)가능
다중상속의 죽음의 다이아몬드 문제없음
- 다중상속의 메소드를 메소드 탐색 순서대로 확인하기 때문
댓글남기기