[수업 10일차] 21.08.13 상속(inheritance), 메서드 재정의(Method overloading) Exam 문제 풀이 (다시)
07_Class2-car
이 메개변수에 의한값을 멤버변수의 초기값에 할당.
this는 현재객체 자기자신에 참조주소,
number라는 클래스에 private 접근지정자를 주면 num1을 감싸서 보호해준다.
p310
p295
07_Class
package : inheritance
class : Car -Sonata- Ex01_Car
상속 : 물려 받는 것
자바에서 상속 : 있던 자산이 없어지는게 아니고 남아있고 자식에게 물려주는 것
자산을 복사해주는 개념, (잘라내기x)
부모클래스에는 대표성이 있는 코드를 작성
* 상속(Inheritance)?
* -객체지향 프로그램 4대 특징 중 하나.
* - 실세계에서의 상속은 상위 객체의 속성이 하위 객체에 물려져서
* 하위 객체가 상위 객체의 속성을 모두 가지는 개념임.
* - 자바의 상속은 자식클래스가 부모클래스의 속성을 물려 받고
* 기능을 추가하여 확장(extends) 하는 개념임.
* - 상속은 슈퍼클래스의 필드(멤버변수)와 메서드를 물려 받아서 코드를
* 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄일 수 있음.
* - 기존에 이미 잘 만들어진 클래스를 재사용하여
* 새로운 클래스를 생성하는 자바 문법. - 아주 중요함.
* 즉, 특정 클래스를 만들 떄 기존의 클래스의 데이터 (속성)와
* 기능(메서드)을 그대로 물려 받아서 중복적인 코드를 없애줌.
* (클래스의 재사용, 코드의 중복을 없애줌)
* - 자식과 부모의 관계로 형성되어 있음.
* ==> 부모클래스: Super ,Parent 클래스라고 하기도 함.
* ==> 자식클래스 : sub, child 클래스라고 하기도함.
* ==> 자식은 부모의 멤버보다 같거나 많다.
* - 상속의 대상은 멤버(멤버변수, 멤버메서드)
* ==> 단, 생성자나 private 접근 제한을 갖는 멤버변수와
* 멤버메서드는 상속에서 제외.
* - 상속시 사용되는 키워드 : extends
* - 상속은 단일 상속만 가능함.
* ==> 즉, 상속을 받을 수 있는 클래스는 하나이다.
* - 상속의장점은 클래스의 수정을 최소화시킬 수 있는 장점이 있음.
* 또한 유지보수의 시간을 최소화시켜 준다는 장점이 있음.
*
* 형식)//(자식이 부모를 선택하는 관걔)
* [접근제한] class 자식클래스명 extends 부모클래스명 {.... }
*
* -상속관계 : "~은~이다" ==> is~ a 관계
* 포함관계 : "~은~를 가지고 있다" ==> has ~a관계
* ==>사람은 (name, age, id)가지도있다.
*
* - 주의사항) 부모클래스는 반드시 기존에 미리 정의되어야 함
1.
package inheritance;
/*
* 상속(Inheritance)?
* -객체지향 프로그램 4대 특징 중 하나.
* - 실세계에서의 상속은 상위 객체의 속성이 하위 객체에 물려져서
* 하위 객체가 상위 객체의 속성을 모두 가지는 개념임.
* - 자바의 상속은 자식클래스가 부모클래스의 속성을 물려 받고
* 기능을 추가하여 확장(extends) 하는 개념임.
* - 상속은 슈퍼클래스의 필드와 메서드를 물려 받아서 코드를
* 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄일 수 있음.
* - 기존에 이미 잘 만들어진 클래스를 재사용하여
* 새로운 클래스를 생성하는 자바 문법. - 아주 중요함.
* 즉, 특정 클래스를 만들 떄 기존의 클래스의 데이터 (속성)와
* 기능(메서드)을 그대로 물려 받아서 중복적인 코드를 없애줌.
* (클래스의 재사용, 코드의 중복을 없애줌)
* - 자식과 부모의 관계로 형성되어 있음.
* ==> 부모클래스: super ,parent 클래스라고 하기도 함.
* ==> 자식클래스 : sub, child 클래스라고 하기도함.
* ==> 자식은 부모의 멤버보다 같거나 많다.
* - 상속의 대상은 멤버(멤버변수, 멤버메서드)
* ==> 단, 생성자나 private 접근 제한을 갖는 멤버변수와
* 멤버메서드는 상속에서 제외.
* - 상속시 사용되는 키워드 : extends
* - 상속은 단일 상속만 가능함.
* ==> 즉, 상속을 받을 수 있는 클래스는 하나이다.
* - 상속의장점은 클래스의 수정을 최소화시킬 수 있는 장점이 있음.
* 또한 유지보수의 시간을 최소화시켜 준다는 장점이 있음.
*
* 형식)//(자식이 부모를 선택하는 관걔)
* [접근제한] class 자식클래스명 extends 부모클래스명 {.... }
*
* -상속관계 : "~은~이다" ==> is~ a 관계
* 포함관계 : "~은~를 가지고 있다" ==> has ~a관계
* ==>사람은 (name, age, id)가지도있다.
*
* - 주의사항) 부모클래스는 반드시 기존에 미리 정의되어야 함
*/
public class Car { //부모 클래스
//멤버 변수
int cc; // 차량 배기량
int door; // 차량 문짝 수
}
자동차의 자식클래스(sonata)
car라는 클래스의 멤버변수를 사용하기 위해서 sonata라는 클래스가 car라는 클래스를 부모클래스로 삼는다.
extends를 사용해서 상속을 결정 짓는다. 자식 클래스가 부모 클래스를 선택하는 것이다.
멤버변수를 선언 대표성이 있는 멤버- 부모클래스
자식클래스 - 디테일 하게 선택
void output이라는 메서드를 선언.
package inheritance;
public class Sonata extends Car { //(부모클래스와 자식 클래스의 상속을 결정하는 코드
//멤버클래스에서 가져다가 써야겠다, 자식클래스가 부모클래스를 선택)
//멤버변수
//int cc; // 상속을 받으면 부모클래스의 멤버는 생략
//int door; // 상속을 받으면 부모클래스의 멤버는 생략
String model; // 차량 모델명
void ouput() {
System.out.println("모델명 >>> " + model);
System.out.println("배기량 >>> " + cc);
System.out.println("차량 문짝 수 >>> " + door);
}
}
* Sonata 클래스의 객체 생성 과정
* Sonata 클래스의 객체 생성 시 JVM이 우선적으로 Car 부모클래스의 객체를 셍상힌 후에 그 다음에 Sonata 클래스의 객체를 생성. //(부모클래스를 먼저 생성 그 다음 자식)
자식 클래스에 생략된 멤버변수가 있기 때문에 먼저 생성이 되야지 넘어올 수 있기 때문에 생성 순서를 지켜야한다.
package inheritance;
public class Ex01_Car {
public static void main(String[] args) {
/*
* Sonata 클래스의 객체 생성 과정
* Sonata 클래스의 객체 생성 시 JVM이
* 우선적으로 Car 부모클래스의 객체를
* 셍상힌 후에 그 다음에 Sonata 클래스의 //(부모클래스를 먼저 생성 그 다음 자식)
* 객체를 생성.
*/
// 상속시에는 자식클래스의 객체 생성
Sonata sonata = new Sonata();
sonata.out.println();
sonata.model = "소나타";
sonata.cc = 2000;
sonata.door = 4;
sonata.ouput();
}
}
07_Class
package : inheritance
class : Car2 -Avante- Ex02_Car2
자식의 멤버가 부모의 멤버보다 우선순위가 훨씬 더 높다.
package inheritance;
public class car2 { //부모 클래스
//멤버 변수
int cc;
int door;
String color = "검정색";
}
* 1. super 키워드
* -부모의 멤버를 호출하는 명령어
* 형식) super.부모클래스멤버(멤버변수, 멤버메서드)
* 2. this 키워드
* - 현재 클래스에 소속된 멤버를 호출하는 명령어.
* - this 키워드는 현대 객체 자기 자신을 의미함.
* 형식) this.자식클래스멤버(멤버변수, 멤버메서드)
package inheritance;
/*
* 1. super 키워드
* -부모의 멤버를 호출하는 명령어
* 형식) super.부모클래스멤버(멤버변수, 멤버메서드)
* 2. this 키워드
* - 현재 클래스에 소속된 멤버를 호출하는 명령어.
* - this 키워드는 현대 객체 자기 자신을 의미함.
* 형식) this.자식클래스멤버(멤버변수, 멤버메서드)
*/
public class Avante extends car2{
// 멤버 변수
// int cc;
// int door;
// String color = "검정색";
String color = "흰색";
void output() { //(부모의 멤버보다 자식의 멤버가 우선순위)
System.out.println
("엔진 : " +cc+", 문짝수 : " +door + ", 색상 : "+ color);
System.out.println
("엔진 : " +cc+", 문짝수 : " +door + ", 색상 : "+ super.color);
System.out.println
("엔진 : " +cc+", 문짝수 : " +door + ", 색상 : "+ this.color); //(현재클래스에 소속된 멤버를 호출)
}
}
package inheritance;
public class Ex02_Car2 {
public static void main(String[] args) {
Avante avante = new Avante();
avante.cc = 1600;
avante.door = 4;
avante.output();
}
}
07_Class
package : inheritance
class : Human - Student - Employee - Ex03_Human
부모클래스는 공통적인 내용을 작성하고 자식들은 그 내용을 상속
package inheritance;
public class Human { // 부모 클래스
//멤버 변수
String name; // 이름
int age; // 나이
String job; // 직업
}
package inheritance;
public class Student extends Human {
// 멤버 변수
// String name;
// int age;
// String job;
//(위에가 생략 , 중복을 제거)
String major; //학과
void studentInfo() { //(메서드 선언)
System.out.println("이름 >>> " + name);
System.out.println("나이 >>> " + age);
System.out.println("직업 >>> " +job);
System.out.println("학과 >>> " +major);
}
}
package inheritance;
public class Employee extends Human{
// 멤버 변수
// String name;
// int age;
// String job;
int salary; // 급여
void employeeIndo() {
System.out.println("이름 >>> " +name);
System.out.println("나이 >>> " +age);
System.out.println("직업 >>> " +job);
System.out.println("급여 >>> " +salary);
}
}
package inheritance;
public class Ex03_Human {
public static void main(String[] args) {
Student student = new Student(); //(자식 객체 생성)
student.name = "홍길동";
student.age = 27;
student.job = "대학생";
student.major = "컴공과";
student.studentInfo();
System.out.println();
Employee employee = new Employee();
employee.name = "임정훈";
employee.age = 38;
employee.job = "IT학원강사";
employee.salary = 5000;
employee.employeeIndo();
//(중복되는 클래스는 부모클래스에 집어넣고 자식 클래스에는 자식에서만 작성할 수 있는 것을 넣음
//(상속의 특징으로 중복되는 코드를 없애준다. )
}
}
중복되는 코드는 부모클래스에 넣고
자식 클래스에서만 작성할 수 있는 내용만을 작성한다. (상속의 특징)
07_Class
package : inheritance
class : Point(부모클래스) - Point3D - Ex04_Point
package inheritance;
public class Point { // 부모 클래스
// 멤버 변수
int x;
int y;
public Point() { } // 기본 생성자
public Point(int x, int y) {
this.x = x;
this.y = y;
}//인자 생성자
}
기본생성자
super(); //부모클래스의 기본생성자를 호출하는 명령어.
( ) 괄호 안이 비어있으면 기본생성자를 호출하는 명령어
==> public Point() { } // 기본 생성자
이것을 호출한다.
인자생성자
super(x,y); //(부모클래스에 인자생상자를 호출) ==>
public Point(int x, int y) {
this.x = x;
this.y = y;
이것을 호출한다.
(자식클래스의 인자가 두개인 생성자를 호출한다.)
this(x, y);
==> public Point3D(int x, int y) {
//this.x = x;
//this.y = y;
super(x,y); //(부모클래스에 인자생상자를 호출)
이것을 호출한다.
* 1. super() 키워드
* -자식클래스에서 부모클래스의 생성자를 호출하는 명령어.
* 형식) super(인자); // 인자는 생략도 가능.
* 2. this() 키워드
* - 현재 클래스에서 현재 클래스의 다른 생성자를 호출하는 명령어.
* 형식) this(인자) ;
* 주의) 생성자 첫 문장에 와야 한다. 그렇지 않으면 error 발생.
* * 이유 : 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면
* 호출된 다른 생성자도 멤버변수들의 초기화 작업을 진행할 것이므로
* 다른 생성자를 호출하기 이전에 진행되는 초기화 작업들은
* 무의미한 작업이 될 수 있기 떄문임.
package inheritance;
/*
* 1. super() 키워드
* -자식클래스에서 부모클래스의 생성자를 호출하는 명령어.
* 형식) super(인자); // 인자는 생략도 가능.
* 2. this() 키워드
* - 현재 클래스에서 현재 클래스의 다른 생성자를 호출하는 명령어.
* 형식) this(인자) ;
* 주의) 생성자 첫 문장에 와야 한다. 그렇지 않으면 error 발생.
* * 이유 : 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면
* 호출된 다른 생성자도 멤버변수들의 초기화 작업을 진행할 것이므로
* 다른 생성자를 호출하기 이전에 진행되는 초기화 작업들은
* 무의미한 작업이 될 수 있기 떄문임.
*
*/
public class Point3D extends Point{
// 멤버 변수
// int x;
// int y;
int z;
public Point3D() {
super(); //부모클래스의 기본생성자를 호출하는 명령어.
//(super는 부모 의 생성자를 추출, 부모의 기본생성자를 추출)
}
public Point3D(int x, int y) {
//this.x = x;
//this.y = y;
super(x,y); //(부모클래스에 인자생상자를 호출)
}
public Point3D(int x, int y, int z) {
this(x, y); //(자기자신의 생성자 중에서 인자가 두개짜리인 생성자를 호출,
this.z = z;
}
void output() {
System.out.println("x 좌표 >>> " + x);
System.out.println("y 좌표 >>> " + y);
System.out.println("z 좌표 >>> " + z);
}
}
package inheritance;
public class Ex04_Point {
public static void main(String[] args) {
Point3D point3d = new Point3D(2, 3, 5);
point3d.output();
}
}
07_Class
package : inheritance
class : Volume(부모클래스) - TV - Radio - Computer - Ex05_Remote
package inheritance;
public class Volume {
// 멤버 변수
int vol = 1;
public void setVolume(int vol) {
this.vol = vol;
}
public int getVolume() {
return vol;
}
//볼륨을 올리는 메서드
void volumeUp() {
vol++;
if(vol > 15) {
vol = 15;
}
}
// 볼륨을 내리는 메서드
void volumeDown() {
vol--;
if(vol < 1) {
vol = 1;
}
}
}
package inheritance;
public class TV extends Volume {
}
package inheritance;
public class Computer extends Volume {
}
package inheritance;
public class Radio extends Volume {
}
package inheritance;
import java.util.Scanner;
public class Ex05_Remote {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
TV tv = new TV();
Computer computer = new Computer();
Radio radio = new Radio();
//(반복시키겠다)
while(true) { // 무한 반복
System.out.print
("1. TV / 2. Radio / 3. Computer / 4. 종료 : ");
int menu = sc.nextInt();
if(menu == 4) {
break; //(if문을 제외한 첫번째 블럭에 빠져나옴)
}
System.out.print("1. 볼륨Up / 2. 볼륨Down : ");
int volume = sc.nextInt(); //(볼륨이라는 변수에 숫자 저장)
switch(menu) {
case 1 : // TV를 선택한 경우
if(volume == 1) { // 볼륨Up을 선택한 경우
tv.volumeUp();
}else { // 볼륨Down을 선택한 경우
tv.volumeDown();
}
break;
case 2 : // Radio를 선택한 경우
if(volume == 1) { // 볼륨Up을 선택한 경우
radio.volumeUp();
}else { // 볼륨Down을 선택한 경우
radio.volumeDown();
}
break;
case 3 : // Computer를 선택한 경우
if(volume == 1) { // 볼륨Up을 선택한 경우
computer.volumeUp();
}else { // 볼륨Down을 선택한 경우
computer.volumeDown();
}
break;
} // switch ~ case 문 end
System.out.println();
System.out.println("================================");
System.out.println
("TV : "+tv.getVolume()+" / Radio : "+radio.getVolume()
+" / Computer : "+computer.getVolume());
} // while문 end
System.out.println();
System.out.println("수고 많이 하셨습니다.~~~");
sc.close();
}
}
07_Class
package : overriding
class : Animal - Dog -Cat -Tiger -Ex01_Animal
package overriding;
public class Animal {
void sound() {
System.out.println("소리를 냅니다. ~~~");
}
}
* 메서드 재정의(method overloading) //(부모클래스에서 상속 받은 것을 자식 클래스에 맞게끔 재정의)
* - 부모클래스에서 정의한 메서드를 자식 클래스에서
* 다시 작성(재정의) 하는 것을 말함.
*
* [메서드 재정의 특징]
* 1. 반드시 상속 관계에서만 발생함.
* (메서드 다중정의 - 동일한 클래스에서 발생)
* 2. 부모클래스의 원형(원래형태) 메서드를 자식클래스에서 재정의 (다시 작성).
*
*
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
* [메서드 재정의 조건]
* 1. 반드시 접근지정자, 리턴타입(반환형), 매개변수 모두 일치해야함.
* (매서드 다중정의- 매개변수의 갯수가 다르던지, 갯수가 같다면 자료형이 다르던지 해야 함)
* 2. 접근지정자는 확장 가능(축소 불가능).
package overriding;
/*
* 메서드 재정의(method overloading) //(부모클래스에서 상속 받은 것을 자식 클래스에 맞게끔 재정의)
* - 부모클래스에서 정의한 메서드를 자식 클래스에서
* 다시 작성(재정의) 하는 것을 말함.
*
* [메서드 재정의 특징]
* 1. 반드시 상속 관계에서만 발생함.
* (메서드 다중정의 - 동일한 클래스에서 발생)
* 2. 부모클래스의 원형(원래형태) 메서드를 자식클래스에서 재정의 (다시 작성).
*
*
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
* [메서드 재정의 조건]
* 1. 반드시 접근지정자, 리턴타입(반환형), 매개변수 모두 일치해야함.
* (매서드 다중정의- 매개변수의 갯수가 다르던지, 갯수가 같다면 자료형이 다르던지 해야 함)
* 2. 접근지정자는 확장 가능(축소 불가능).
*
*/
public class Dog extends Animal{
//(접근지정자, 리턴타입 반환형 다 똑같은데 멍멍멍만 다름, )
// 메서드 재정의.
@Override
void sound() {
//super.sound();
System.out.println("멍멍멍~~~");
}
//void sound() { //(숨어있던것을 들춰냄)
//System.out.println("멍멍멍.~~~~");
}
package overriding;
public class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹~~~~");
}
}
package overriding;
public class Tiger extends Animal {
@Override
void sound() {
System.out.println("어흥~~~~~");
}
}
package overriding;
public class Ex01_Animal {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Tiger tiger = new Tiger();
dog.sound();
cat.sound();
tiger.sound();
}
}
07_Class
package : overriding
class : Shape - Rectangle - Circle -Ex02_Shape
package overriding;
public class Shape {
void draw() {
System.out.println("그리다~~~");
}
}
package overriding;
public class Rectangle extends Shape {
@Override
void draw() {
System.out.println("사각형을 그리다~~~~");
}
}
package overriding;
public class Circle extends Shape {
@Override
void draw() {
System.out.println("원을 그라다~~~~");
}
}
package overriding;
public class Ex02_Shape {
public static void main(String[] args) {
Line line = new Line();
Rectangle rectangle = new Rectangle();
Circle circle = new Circle();
line.draw(); rectangle.draw(); circle.draw();
}
}
07_Class
package : overriding
class : Flyer - Bird - Airplane -Ex03_Flyer
package overriding;
/*
* [문제] 부모클래스의 Flyer 클래스에 takeOff(),
* fly(), land() 원형 메서드가 있다.
* Bird, Airplane 자식 클래스에 Flyer 클래스를
* 상속받아서 메서드를 재정의 해 보시길 바랍니다.
* 자식의 특성에 맞게 재정의 할 것.
*/
public class Flyer { // 부모 클래스
void takeOff() {
System.out.println("땅에서 하늘로 오르다....");
}
void fly() {
System.out.println("하늘을 날아다닌다....");
}
void land() {
System.out.println("하늘에서 땅으로 내려온다....");
}
}
package overriding;
public class Bird extends Flyer {
@Override
void takeOff() {
System.out.println("새가 날아오른다.....");
}
@Override
void fly() {
System.out.println("새가 하늘을 날아다닌다....");
}
@Override
void land() {
System.out.println("새가 나뭇가지에 앉는다....");
}
}
package overriding;
public class Airplane extends Flyer {
@Override
void takeOff() {
System.out.println("비행기가 날아오른다...");
}
@Override
void fly() {
System.out.println("비행기가 하늘을 날아다닌다....");
}
@Override
void land() {
System.out.println("비행기가 공항에 착륙한다....");
}
}
package overriding;
public class Ex03_Flyer {
public static void main(String[] args) {
Flyer flyer = new Flyer();
flyer.takeOff();flyer.fly(); flyer.land();
System.out.println();
Bird bird = new Bird();
bird.takeOff();bird.fly();bird.land();
System.out.println();
Airplane airplane = new Airplane();
airplane.takeOff();airplane.fly();airplane.land();
}
}
Exam 문제풀이 다시 해보세요~~