● 상속
- 기존에 사용하던 클래스의 필드를 새롭게 만들 클래스에서 사용하고 싶을 때 활용하는 문법
public class 자식클래스명 extends 부모클래스명 {
멤버...
}
● 메소드 오버라이딩(재정의)
- 부모클래스에 존재하는 메소드의 이름과 똑같은 이름으로 메소드를 다시 정의하는 것을 의미한다.
- 자식클래스 타입 객체 : 자식에서 재정의된 메소드가 호출된다.
- 부모클래스 타입 객체 : 부모에서 정의된 메소드가 호출된다.
● 다형성
1. 오버로딩
- 매개변수의 타입 혹은 갯수가 다르지만 이름이 같은 메소드
2. 오버라이딩
- 부모필드에 선언된 메소드를 자식에서 같은 이름으로 선언하는 것
※ @Override
- 메소드가 오버라이딩 됨을 설명하는 어노테이션 주석
실습(접근 제어자 복습)
1. 학생 검색 후 정보 수정
(1) Student.java에 getter와 setter 생성
public class Student {
private String name;
private int kor;
private int eng;
public Student(String name, int kor, int eng) {
this.name = name;
this.kor = kor;
this.eng = eng;
}
public void show() {
System.out.println("---학생성적---");
System.out.println("이름 : " + this.name);
System.out.println("국어 : " + this.kor);
System.out.println("영어 : " + this.eng);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
}
(2) Main.java에서 실행
import java.util.Scanner;
import accessTest.Test;
public class Main {
public static void main(String[] args) {
// Student 객체가 요소로 들어있는 배열
Student[] students = {new Student("김철수", 90, 80),
new Student("박영희", 100, 100),
new Student("홍길동", 70, 60)};
String name;
boolean check = false; // flag 변수
while(true) {
Scanner sc = new Scanner(System.in);
System.out.println("1. 성적정보검색 2. 성적수정 3. 종료");
int choice = Integer.parseInt(sc.nextLine());
if(choice == 3) {
break;
} else if(choice == 1) {
// 이름으로 학생을 검색해서 해당 학생의 성적 정보 출력하기
System.out.print("이름 입력 >> ");
name = sc.nextLine();
for(Student st : students) {
if(st.getName().equals(name)) {
check = true;
st.show();
}
}
if(check == false) {
System.out.println("해당 학생을 찾을 수 없습니다");
}
} else if(choice == 2) {
// 이름으로 학생을 검색해서 해당 학생의 국어점수, 수학점수 수정하기
System.out.print("이름 입력 >> ");
name = sc.nextLine();
for(int i = 0; i < students.length;i++) {
if(students[i].getName().equals(name)) {
check = true;
System.out.print("수정할 국어점수 >> ");
students[i].setKor(Integer.parseInt(sc.nextLine()));
System.out.print("수정할 영어점수 >> ");
students[i].setEng(Integer.parseInt(sc.nextLine()));
}
}
if(check) {
System.out.println("수정성공!");
} else {
System.out.println("수정실패!");
}
} else {
System.out.println("잘못입력했습니다");
}
}
}
}
![](https://blog.kakaocdn.net/dn/xVzzV/btrrn26kwz7/aTssNGY2lvF9IA1W6gjKBk/img.png)
실습(상속)
1. Car.java에 메소드 생성
public class Car {
public void go() {
System.out.println("앞으로 갑니다");
}
public void engineOn() {
System.out.println("열쇠로 시동을 켰습니다");
}
}
2. SuperCar.java에 Car.java를 상속받아 메소드 재정의
public class SuperCar extends Car{
public void engineOn() { // 메소드 오버라이딩(재정의)
System.out.println("버튼으로 시동 켬");
}
}
3. Main.java에서 Car.java 및 SuperCar.java 안의 메소드 사용
public class Main {
public static void main(String[] args) {
Car momCar = new Car();
SuperCar myCar = new SuperCar();
momCar.go();
momCar.engineOn();
// myCar는 SuperCar 타입이지만 Car 클래스를 상속받았기 때문에
// Car 클래스 안에 존재하는 멤버들(메소드, 변수)을 사용할 수 있다.
myCar.go();
myCar.engineOn(); // 자식에서 재정의된 메소드가 호출됨
}
}
![](https://blog.kakaocdn.net/dn/bQlYhB/btrrlT9GMNB/CDurZm8WXQHTW0NxrN4uw0/img.png)