상속 (부모 객체 -> 자식 객체) (속성,기능) 자식 객체는 둘다 사용가능
속성,기능 -> 속성,기능
다른 클래스(부모 객체)가 가지고있는 멤버(필드,메소드)들을 새로 작성할 클래스(자식 객체)에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
상속의 목적
클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
상속의 장점
1.보다 적은 양의 코드로 새로운 클래스 작성 가능
2.코드를 공통적으로 관리하기 떄문에 코드의 추가 및 변경 용이
3.코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
사용 방법
클래스 간의 상속 시에는 extends 키워드 사용
표현식

단일 상속과 다중 상속
단일 상속(Single Inheritance)
클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성
자바에서는 다중 상속 미지원-> 단일상속만지원
상속의 특징
1. 모든 클래스는 Object클래스의 후손
Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능
ex) java.long.String 클래스의 equals()와 toString()
2.부모클래스의 생성자,초기화 블록은 상속 안됨
자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super()활용
3.부모의 private멤버는 상속은 되지만 직접 접근 불가
자식 객체 생성시에 부모의 필드 값도 전달 받은 경우,
자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입불가
super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나
setter,getter 메소드를 이용하여 접근
super()와 super.
super()
부모 객체의 생성자를 호출하는 메소드로 기본적으로 후손 생성자에 부모 생성자 포함
후손 객체 생성 시에는 부모부터 생성이 되기 때문에 후손 클래스 생성자 안에는
부모 생성자를 호출하는 super()가 첫 줄에 존재 (부모 생성자가 가장 먼저 실행되어야 하기
때문에 명시적으로 작성 시에도 반드시 첫 줄에만 작성)
매개변수 있는 부모 생성자 호출은 super(매개변수,매개변수)를 넣으면 됨
super.
상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수
자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 시 사용
오버라이딩(Overriding) (Over/초과 위 상위) (riding/타다 탐) 올라타다라는 뜻
뜻(재정의하다)
자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것
부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로
자식 객체를 통한 실행 시 후손 것이 우선권을 가짐
특징
메소드 헤드라인 위에 반드시 Annotation, @Override표시
접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능
부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능
장점 : 유지보수성,재사용성 증가 , 코드길이감소
오버라이딩(Overrriding)
성립 조건 :
부모 클래스의 메소드와 자식 클래스의 메소드 비교
-메소드 이름 동일
-매개변수의 개수,타입,순서 동일
-리턴 타입 동일
오버로딩(Overloading)
한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는것
성립 조건
같은 메소드 이름
다른 매개변수 선언부(매개변수 타입,개수,순서)
주의사항
메소드의 리턴타입은 오버로딩 조건과 관계없음
오버라이딩(Overriding)과 오버로딩(Overloading)

오늘 배운 코드
package edu.kh.inheritance.model.vo;
public class Person extends Object{
//class명에 Object에 대한 상속 구문이 없다면
//컴파일러가 자동으로 extends Object 구문을 추가
//필드
private String name;//이름
private int age;//나이
private String nationality; //국적
//생성자
public Person(){}//기본생성자
public Person(String name,int age,String nationality){ //매개변수 생성자 (오버로딩 기법)
this.name = name;
this.age = age;
this.nationality = nationality; //this 참조변수
}
//메서드
//getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public void breath() {
System.out.println("사람은 코나 입으로 숨을 쉰다");
}
public void move() {
System.out.println("사람은 움직일 수 있다");
}
@Override
public String toString() {
return name + "/" + age + "/" + nationality;
}
}
package edu.kh.inheritance.model.service;
import java.util.Scanner;
import edu.kh.inheritance.model.vo.Employee;
import edu.kh.inheritance.model.vo.Person;
import edu.kh.inheritance.model.vo.Student;
public class InheritanceService {
public void ex1() {
//Person을 상속받은 Student가 Person필드,메소드를
//사용할 수 있는가?
Person p = new Person();
//p.name = "홍길동"; //private 떄문에 직접접근불가(에러발생)
p.setName("홍길동");
p.setAge(25);
p.setNationality("대한민국");
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getNationality());
System.out.println("--------------------------");
//Student 객체 생성
Student std = new Student();
//Student만의 고유한 필드
std.setGrade(3);
std.setClassRoom(5);
//Person 클래스로 부터 상속받은 필드,메서드
std.setName("고길동");
std.setAge(19);
std.setNationality("대한민국");
System.out.println(std.getGrade());
System.out.println(std.getClassRoom());
//Student
System.out.println(std.getName());
System.out.println(std.getAge());
System.out.println(std.getNationality());
//Employee만의 고유 메소드
Employee emp = new Employee();
emp.setCompany("KH정보교육원");
//Person 클래스로부터 상속받은 메서드
emp.setName("이우진");
emp.setAge(24);
emp.setNationality("대한민국");
System.out.println(emp.getCompany());
System.out.println(emp.getName());
System.out.println(emp.getAge());
System.out.println(emp.getNationality());
//추가딘 breath()메서드 상속 확인하기
p.breath();
std.breath();
emp.breath();
//상속의 특징: 코드 추가 및 수정에 용이함
//-> 부모에게 정의하면 상속받은 자식들은 모두 부모의 것을 그댈
//받아서 쓸 수 있음!
}
//super()생성자 사용방법
public void ex2() {
//Student 매개변수 5개짜리 생성자
Student std = new Student("김철수",17,"한국",1,3);
System.out.println(std.getName());
System.out.println(std.getAge());
System.out.println(std.getNationality());
System.out.println(std.getGrade());
System.out.println(std.getClassRoom());
}
//오버라이딩 확인 예제
public void ex3() {
Student std = new Student();
Employee emp = new Employee();
std.move(); // 오버라이딩 X-> Person의 메소드 수행
emp.move(); //오버라이딩 O->
}
public void ex4() {
//모든 클래스는 object 클래스의 후손
//== 모든 클래스의 최상위 부모는 Object
Person p = new Person();
//Object를 상속받은 Person객체 생성
Student std = new Student();
//Person을 상속받은 Student객체 생성
//Object - Person - Student
System.out.println(p.hashCode());
System.out.println(std.hashCode());
//Person이 Object에서 물려받은 hashCode()를
//Student가 또 물려받아 사용
String str = "adc";
Scanner sc = new Scanner(System.in);
System.out.println(str.hashCode());
// String - Object
System.out.println(sc.hashCode());
// Scanner - Object
}
public void ex5() {
Person p = new Person("김철수",17,"한국");
System.out.println(p.toString());
System.out.println(p);
//print 구문 수행 시 참조 변수명을 작성하면
// 자동으로 toString() 메소드를 호출해서 출력한다!
System.out.println("-------------------------");
Student std = new Student("이백점",18,"미국",2,3);
System.out.println(std.toString());
}
}
package edu.kh.inheritance.model.vo;
public class Student extends Person{
//Student 클래스에 Person 클래스 내용을 연장한다
//Student 클래스에 Person 클래스 내용(필드,메서드)을 추가하여 확장한다.
//***상속***
//extends : 확장하다,연장하다..
//private String name;
//private int age;
//private String nationality;
private int grade; // 학년
private int classRoom;//반
public Student() {
//Student() 객체 생성시
// 내부에 상송받은 Person 객체를 생성하기 위한
//Person 생성자 호출 코드 필요하다!
//super : 상위
//super == Person
//Person();
super(); // super() 생성자
// 부모의 생성자를 호풀하는 코드
// 반드시 자식생성자 최상단에 작성되어야 한다!
// 부모의 생성자 실행(필드 초기화+특정기능 수행)
//* super() 생성자 때문에
// 자식 객체 내부에 부모 객체가 생성된다!
//* super()생성자 미작성시
// 컴파일러가 컴파일 단계에서 자동으로 추가해줌.
}
public Student(String name,int age,String natioaloity,int grade,
int classRoom) {
//this.name=name;
//this.age=age;
//this.natioality = natioality;
//this.name=name;
//왜? 부모의ㅏ 필드에 private 접근자한자가 있어서
// 아무리 물려받은 자식이라도 다른 객체이기때문에 직접 접근 불가
// -> 간접접근 방법 사용가능
//setName (name);
//setAge (age);
//setNationality(nationality);
//부모의 setter를 이용할 수 있지만 비효율적이다.
super(name,age,natioaloity); // 부모의 생성자 중, 매개변수 생성자 호출
this.grade = grade;
this.classRoom = classRoom;
}
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// }
//
// public int getAge() {
// return age;
// }
//
// public void setAge(int age) {
// this.age = age;
// }
//
// public String getNatioality() {
// return natioality;
// }
//
// public void setNatioality(String natioality) {
// this.natioality = natioality;
// }
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getClassRoom() {
return classRoom;
}
public void setClassRoom(int classRoom) {
this.classRoom = classRoom;
}
@Override
public String toString() {
return super.toString() + "/" + grade + "/" + classRoom;
}
}
package edu.kh.inheritance.model.vo;
public class Employee extends Person {
//필드
private String name;
private int age;
private String nationality;
private String company;
public Employee() {}
public Employee(String name, int age,String nationality,String company) {
this.name = name;
this.age = age;
this.nationality = nationality;
this.company = company;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
//Person으로부터 상속받은 메서드 중
//move() 메서드를 Employee에 맞게 재정의(==오버라이딩)
//@Override 어노테이션 : 해당 메소드가 오버라이딩 되었음을
// 컴파일러에게 알려주는 역할->컴파일러에게 문법 체크를 하도록알린다
//어노테이션(Annotation) : 컴파일러에게 알려주기 위한 코드(컴파일러 인식용 주석)
@Override
public void move() {
System.out.println("오버라이딩된 move()");
System.out.println("효율적으로 빨리 일하고 움직인다");
}
}
package edu.kh.inheritance.run;
import edu.kh.inheritance.model.service.InheritanceService;
public class InheritanceRun {
public static void main(String[] args) {
InheritanceService service = new InheritanceService();
//service.ex1();
//service.ex2();
//service.ex3();
//service.ex4();
service.ex5();
}
}