객체지향의 상속
- 부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받음
- 부모의 생물학적 특성을 물려받는 유전과 유사
- 상속을 통해 간결한 자식 클래스 작성
- 동일한 특성을 재정의할 필요가 없어 자식클래스가 간결해짐
장점
클래스의 간결화
- 멤버의 중복 작성 불필요
클래스 관리 용이
- 클래스들의 계층적 분류
소프트웨어의 생산성 향상
- 클래스 재사용과 확장 용이
- 새로운 클래스의 작성 속도 빠름
자바의 상속과 객체
상속 선언 - extends 키워드 사용 -> 슈퍼 클래스를 확장한다는 개념
- 부모 클래스 <-> 자식 클래스
- 슈퍼 클래스 <-> 서브 클래스
클래스 상속 만들기 - Point와 ColorPoint 클래스
class Point {
private int x, y; //한 점을 구성하는 x, y 좌표
public void set(int x, int y) {
this.x = x; this.y;
}
public void showPoint(){ //점의 좌표 출력
System.out.println("(" + x + "," + ")");
}
}
class ColorPoint extends Point { //Point를 상속받은 ColorPoint 선언
private String color; //점의 색
public void setColor(String color) {
this.color = color;
}
public void showColorPoint() { //컬러 점의 좌표 출력
System.out.print(color);
showPorint(); //Point 클래스의 showPoint() 호출
}
}
public class ColorPointEx {
public static void main(String[] args) {
p.set(1. 2); //Point 클래스의 set() 호출
p.showPoint();
ColorPoint cp = new ColorPoint();
cp.set(3, 4); //Point의 setColor() 호출
cp.setColor("red") //ColorPoint의 setColor() 호출
cp.showColorPoint(); //컬러와 좌표 출력
}
}
출력 결과
(1,2)
red(3,4)
객체 생성
서브클래스에서 슈퍼 클래스의 멤버 접근
자바 상속의 특징
- 클래스의 다중 상속 지원하지 않음
- 상속 횟수 무제한
- 상속의 최상의 부모 클래스는 java.lang.Object 클래스
- 모든 클래스는 자동으로 java.lang.Object를 상속받은
- 자바 컴파일러에 의해 자동으로 이루어짐
상속과 접근 지정자
접근 지정자 | 슈퍼 클래스의 [접근 지정자] 멤버 |
private | - 다른 클래스에 접근 불허 - 클래스 안의 멤버들에게만 접근 허용 |
디폴트 | - 클래스 내의 멤버 |
public | - 다른 모든 클래스에 접근 허용 |
protected | - 같은 패키지 내의 모든 클래스 접근 허용 - 다른 패키지에 있어도 서브 클래스는 슈퍼 클래스의 protected 멤버 접근 가능 |
서브 클래스/슈퍼 클래스의 생성자
호출 및 실행
new에 의해 서브 클래스 객체가 생성될 때
- new에 의해 서브 클래스 생성자 모두 실행됨
- 호출 순서: 서브 클래스의 생성자가 먼저 호출, 서브 클래스의 생성자는 실행 전 슈퍼 클래스 생성자 호출
- 실행 순서: 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자 실행
생성자 선택
상속 관계에서의 생성자
- 슈퍼 클래스와 서브 클래스 각각 여러 생성자 작성 가능
서브 클래스 생성자 작성 원칙
- 서브 클래스 생성자에서 슈퍼 클래스 생성자 하나 선택
서브 클래스에서 슈퍼 클래스의 생성자를 선택하지 않는 경우
- 컴파일러가 자동으로 슈퍼 클래스의 기본 생성자 선택(기본 생성자 없을 경우 오류)
생성자를 선택하는 방법
super() 이용
서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출
- super(parameter);
- 인자를 이용하여 슈퍼 클래스의 적당한 생성자 호출
- 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함
업캐스팅
- 서브 클래스의 객체 = 서브 클래스의 멤버 + 슈퍼 클래스의 멤버
- 서브 클래스의 객체는 슈퍼 클래스의 객체로 취급할 수 있음
업캐스팅 - 서브 클래스 객체를 슈퍼 클래스 타입으로 형 변환
class Person { ... }
class Studend extends Person { ... }
Student s = new Student();
Person p = s; //업캐스팅, 자동 타입 변환
업케스팅된 레퍼런스는 슈퍼 클래스의 멤버만 접근 가능
업캐스팅 사례
class Person {
String name;
String id;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String grade;
String department;
public Student(String name) {
super(name);
}
}
public class UpcastingEx {
public static void main(String[] args) {
Person p;
Student s = new Student("지웅초이");
p = s; //업캐스팅
System.out.println(p.name); //오류 없음
//p.grade = "A"; -> 컴파일 오류
//p.department = "com"; -> 컴파일 오류
}
}
실행 결과 -> 지웅초이
- 레퍼런스 p를 이용하면 Student 객체의 멤버 중 Person의 멤버만 접근 가능하다. -> name, id, Person()
- 레퍼런스 s를 이용하면 위의 6개 멤버에 모두 접근 가능하다. -> name, department, Person, grade, department, Student()
다운캐스팅
- 슈퍼 클래스 객체를 서브 클래스 타입으로 변환
- 개발자의 명시적 타입 변환 필요
class Person { ... }
class Student extend Person { ... }
Person p = new Student("지웅초이"); //업캐스팅
Student s = (Student)p; //다운캐스팅, (Student)의 타입 변환 표시 필요
다운캐스팅 사례
public class DowncastingEx { //업케스팅 예시의 Person, Student 클래스를 참고할 것
public static void main(String[] args) {
Persin p = new Student("지웅초이"); //업캐스팅
Student s;
s = (Student)p; //다운캐스팅
System.out.println(s.name); //오류 없음
s.grade = "A"; //오류 없음
}
}
실행 결과 -> 지웅초이
두 레퍼런스 모두 Person의 멤버만 접근 가능 -> name, id, Person()
instanceof 연산자와 객체의 타입 판단
업캐스팅된 레퍼런스로 객체의 타입 판단 어려움
- 슈퍼 클래스는 여러 서브 클래스에 상속되기 때문
instanceof 연산자
- 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용
- 사용법
객체레퍼런스 instanceof 클래스 타입
연산의 결과: true/false 불린 값
'전공 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향프로그래밍][Java] 상속 3 (추상 메소드, 추상 클래스, 인터페이스) (0) | 2023.05.08 |
---|---|
[객체지향프로그래밍][Java] 상속 2 (오버라이딩) (0) | 2023.04.27 |
[객체지향프로그래밍][Java] 클래스와 객체 2 (접근 지정자, static, final) (0) | 2023.04.18 |
[객체지향프로그래밍][Java] 클래스와 객체 1 (클래스의 구성, 생성자, this, 객체 배열, 오버로딩, 가비지 컬렉션) (0) | 2023.04.18 |
[객체지향프로그래밍] 이론 (0) | 2023.04.17 |