본문 바로가기

Java

[Java] 21

상속

- 기존에 사용하던 클래스의 필드를 새롭게 만들 클래스에서 사용하고 싶을 때 활용하는 문법

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("잘못입력했습니다");
			}
		}
	
	}
}

 

결과

 

 

실습(상속)

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();  // 자식에서 재정의된 메소드가 호출됨

	}
}

 

결과

 

 

'Java' 카테고리의 다른 글

[Java] 23  (0) 2022.01.23
[Java] 22  (0) 2022.01.22
[Java] 20  (0) 2022.01.18
[Java] 19  (0) 2022.01.17
[Java] 18  (0) 2022.01.13