coding/[2021.08.02~2022.01.24] 수업복습

[수업 10일차] 21.08.13 상속(inheritance), 메서드 재정의(Method overloading) Exam 문제 풀이 (다시)

꽃무늬라떼 2021. 8. 14. 12:48

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();
		
		
	}

}

메서드 재정의 
방법1
방법2

 

 

Exam 문제풀이 다시 해보세요~~