8일차
클래스 상속
- 프로그램에서의 상속은 자식이 부모를 선택합니다.
- 자식 클래스를 선언할때 어떤 부모 클래스를 상속 받을 것인지 결정 합니다.
- 여러개의 부모 클래스를 상속할수 없습니다.
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속대상에서 제외 됩니다.
부모 생성자 호출
- 자식객체를 생성하게 되면 부모 객체가 먼저 생성됩니다.(부모 없이 자식이 있을수 없기 때문입니다.)
& 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하는 경우
자식 클래스(매케변수 선언, ) {
super(매개값, );
}
예제
부모 클래스)
package sec07.exam01;
public class People {
public String name;
public String ssn;
public People(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
자식 클래스)
package sec07.exam01;
public class Student extends People {
public int studentNo;
public Student(String name, String ssn, int studentNo) {
super(name, ssn);
this.studentNo = studentNo;
}
}
자식 객체 이용)
package sec07.exam01;
public class StudentExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student = new Student("전우치", "123456-7891011", 1);
System.out.println("name: " + student.name);
System.out.println("ssn: " + student.ssn);
System.out.println("studentNo: " + student.studentNo);
}
}
메소드 재정의
- 하위 클래스가 상위 클래스로 부터 상속받은 메소드를 자신의 필요에 맞게 다시 정의하는것 입니다.
&메소드 재정의 방법
- 메소드 재정의는 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 말합니다.
부모의 메소드와 동일한 시그니처를 가져야 합니다. |
접근 제한을 더 강하게 재정의 할수 없습니다. |
새로운 예외를 throw할수 없습니다. |
예제
부모 클래스)
package sec07.exam01;
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 실행");
return 3.14159 * r * r;
}
}
자식 클래스)
package sec07.exam01;
public class Computer extends Calculator {
@Override
double areaCircle(double r) {
System.out.println("Computer 실행");
return Math.PI * r * r;
}
}
메소드 재정의 테스트)
package sec07.exam01;
public class ComputerExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int r = 10;
Calculator calculator = new Calculator();
System.out.println(calculator.areaCircle(r));
System.out.println();
Computer computer = new Computer();
System.out.println(computer.areaCircle(r));
}
}
부모 메소드 호출
- 상속 계층 구조에서 하위 클래스가 부모 클래스의 메소드를 재정의 하고 있을때 유용합니다.
상속 할수 없는 final 클래스
- 클래스를 선언할때 final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스가 됩니다.
- 부모 클래스가 될수 없어 자식 클래스를 만들수 없습니다.
재정의 할수 없는 final 메소드
- 메소드를 선언할때 final 키워드를 붙이면 이 메소드는 최종적인 메소드가 됩니다.
- 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할수 없습니다.
자동 타입 변환
- 타입 변환이란 타입을 다른 타입으로 변환시키는 행위 입니다.
- 자동타입 변환은 프로그램 실행 도중에 자동적으로 타입변환이 일어나는것을 말합니다.
강제 타입변환
- 강제 타입변환은 부모 타입을 자식 타입으로 변환하는 것을 말합니다.
- 모든 부모타입을 자식타입으로 강제변환 할수 있는 것은 아닙니다.
예제
부모 클래스)
package sec07.exam01;
public class Parent2 {
public String field1;
public void method1() {
System.out.println("Parent-method1");
}
public void method2() {
System.out.println("Parent-method2");
}
}
자식 클래스)
package sec07.exam01;
public class Child2 extends Parent2 {
public String field2;
public void method3() {
System.out.println("child method3");
}
}
강제타입변환)
package sec07.exam01;
public class ChildExample2 {
public static void main(String[] args) {
Parent2 parent = new Child2();
parent.field1 = "data1"; //자동 타입 변환
parent.method1();
parent.method2();
Child2 child = (Child2) parent; //강제 타입 변환
child.field2 = "yyy";
child.method3();
}
}
추상 클래스
- 일부 메소드의 구현을 하위 클래스에게 위임하는것입니다.
- 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스를 말합니다.
- 공통된 필드와 메소드의 이름을 통일할 목적으로 사용합니다.
- 실체 클래스를 작성할때 시간이 절약됩니다.
&추상 클래스 선언
- 클래스 선언에 abstract 키워드를 붙이면 됩니다.
- abstract를 붙일경우 new 연산자를 이용해서 객체를 만들지 못합니다.
예제
추상 클래스)
package sec07.exam01;
public abstract class Phone {
public String owner;
public Phone(String owner) {
this.owner = owner;
}
public void turnOn() {
System.out.println("폰을 켭니다.");
}
public void turnOff() {
System.out.println("폰을 끕니다.");
}
}
실체 클래스)
package sec07.exam01;
public class SmartPhone extends Phone {
public SmartPhone(String owner) {
super(owner);
}
public void internetSearch() {
System.out.println("검색");
}
}
실행 클래스)
package sec07.exam01;
public class PhoneExample {
public static void main(String[] args) {
SmartPhone smartPhone = new SmartPhone("전우치");
smartPhone.turnOn();
smartPhone.internetSearch();
smartPhone.turnOff();
}
}
추상 메소드와 재정의
- 추상 클래스에서만 선언이 가능합니다.
- 메소드 선언부에 있는 메소드를 말합니다.
- 추상 메소드는 자식 클래스에서 재정의 되어 실행 내용을 결정해야 합니다.
기본미션
p. 330 문제 5번 실행 결과 인증 화면 캡처하기
package sec07.exam01;
public class Parent {
public String nation;
public Parent() {
this("대한민국");
System.out.println("Parent() call");
}
public Parent(String nation) {
this.nation = nation;
System.out.println("Parent(String nation) call");
}
}
package sec07.exam01;
public class Child extends Parent {
private String name;
public Child() {
this("홍길동");
System.out.println("Child() call");
}
public Child(String name) {
this.name = name;
System.out.println("Child(String name) call");
}
}
package sec07.exam01;
public class ChildExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Child child = new Child();
}
}
'학습단 > JAVA 학습단' 카테고리의 다른 글
10. 혼공자 10일차(중첩 인터페이스 & 중첩 클래스) (0) | 2023.07.15 |
---|---|
9. 혼공자 9일차(인터페이스) (0) | 2023.07.14 |
7. 혼공자 7일차(메소드) (0) | 2023.07.11 |
6. 혼공자 6일차(클래스) (0) | 2023.07.10 |
1주차 완료 (0) | 2023.07.07 |