국비 수업 14일차

김성수·2022년 11월 5일
0
post-thumbnail
post-custom-banner

1. 상속 클래스

  • 클래스는 다양한 객체를 카테고리로 나누는 성격을 가진다
  • 상속 : 이미 만들어진 클래스의 속성과 기능을 그대로 물려받아서 새로운 클래스를 작성
  • 상속받은 클래스를 그대로 사용하기보다, 추가속성을 만들거나, 추가 기능을 정의한다
  • 혹은 상속받은 기능의 형식은 유지하되, 내용을 수정하여 새로 만든다 (오버라이딩)
		/*
		 * 							사물(유형)			개념(무형)
		 * 
		 * 					생물		무생물
		 * 
		 * 	 			 동물   식물
		 * 
		 *  		 척추    무척추
		 *   
		 * 양서류 포유류 파충류 어류 조류
		 * 
		 * 개구리 고양이    
		 */

2. 부모 클래스 (슈퍼 클래스)

  1. 특성을 물려주는 클래스를 부모 클래스, 슈퍼 클래스, 상위 클래스라고 한다
  2. 특성을 물려받는 클래스를 자식 클래스, 서브 클래스, 하위 클래스라고 한다
  3. extends 는 확장하다 라는 뜻이다. 슈퍼 클래스의 개념을 더욱 확장한 새로운 클래스를 말한다
  4. 서브클래스는 슈퍼클래스의 생성자를 호출해야 객체를 생성할 수 있다
    이때, 명시되지 않으면 슈퍼클래스의 기본생성자를 호출하게 된다
  5. 서브클래스의 생성자에서 슈퍼클래스의 생성자를 호출하려면 this대신 super를 사용한다
  6. 상속받은 메서드의 형식을 그대로 유지하면서 내용만 새로 작성할 수 있다 (오버라이딩)
package inheritance;

class Pos {	// 2차원의 좌표를 표현할 수 있는 객체를 만들기 위한 클래스 Pos
	int x;
	int y;
	
	Pos(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	void showPos() {
		System.out.printf("x : %d, y : %d\n", x, y);
	}
}

//class Pos3D {		// 상속을 사용하지 않고, 3차원의 좌표를 표현하기 위한 클래스를 작성
//	int x;
//	int y;
//	int z;
//	
//	Pos3D(int x, int y, int z) {
//		this.x = x;
//		this.y = y;
//		this.z = z;
//	}
//	void showPos() {
//		System.out.printf("x : %d, y : %d, z : %d\n", x, y, z);
//	}
//}

class Pos3D extends Pos {
//	int x;	// Pos 클래스에서 물려받아서 안보이지만 가지고 있음
//	int y;	// Pos 클래스에서 물려받아서 안보이지만 가지고 있음
	int z;
	
	Pos3D(int x, int y, int z) {
		super(x, y);	// Pos(x, y)
		this.z = z;
	}
	
//	void showPos() { 	// Pos 클래스에서 물려받아서 안보이지만 가지고 있음
//		System.out.printf("x : %d, y : %d\n", x, y);
//	}
	
	@Override			// 이 함수는 오버라이딩 되었습니다
	void showPos() {	// 상속받은 메서드와 형식이 일치하고, 내용은 새로 작성되었습니다
		System.out.printf("x : %d, y : %d, z : %d\n", x, y, z);
	}
}

public class Ex02 {
	public static void main(String[] args) {
		Pos ob1 = new Pos(2, 3);
		ob1.showPos();
		
		Pos3D ob2 = new Pos3D(5, 8, 7);
		ob2.showPos();
	}
}

3. 업 캐스팅과 다운 캐스팅


package inheritance;

// 클래스의 상속관계를 이용하여 공통 속성은 슈퍼클래스에,
// 개별 속성은 각각의 서브 클래스에 만들어준다

class Human {
	String name;
	int age;
	
	Human(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	void show() {
		System.out.printf("이름 : %s, 나이 : %d살\n", name, age);
	}
}
class Student extends Human {
	int score;
	
	Student(String name, int age, int score) {
		super(name, age);
		this.score = score;
	}
	
	@Override
	void show() {
		System.out.printf("이름 : %s, 나이 : %d, 점수 : %d\n", name, age, score);
	}
}
class Doctor extends Human {
	String major;
	
	Doctor(String name, int age, String major) {
		super(name, age);
		this.major = major;
	}
	
	@Override
	void show() {
		System.out.printf("%s 의사 %s, %d살\n", major, name, age);
	}
	
	// Doctor 클래스의 고유 기능 (치료), 오버라이딩이 아님
	void heal(Human other) {
		System.out.printf("%s가 %s를 치료합니다\n", this.name, other.name);
	}
}

public class Ex04 {
	public static void main(String[] args) {
		Student st1 = new Student("이지은", 30, 99);
		Student st2 = new Student("홍진호", 41, 22);
		Doctor d1 = new Doctor("김재준", 36, "신경외과");
		Doctor d2 = new Doctor("김사부", 45, "내과");
		
		st1.show();
		st2.show();
		d1.show();
		d2.show();
		
		Human h1 = st1;	// 학생은 사람이다
		Human h2 = st2;
		Human h3 = d1;	// 의사는 사람이다
		Human h4 = d2;
		
		System.out.println(h1.name);
		System.out.println(h2.name);
		System.out.println(h3.name);
		System.out.println(h4.name);
		
//		System.out.println(h1.score); // score cannot be resolved or is not a field
		System.out.println(((Student)h2).score); // 강제 형변환
//		System.out.println(h3.major);
		System.out.println(((Doctor)h4).major);
		
		// 다형성에 의해 서로 다른 타입으로 참조할 수 있지만, 타입에 따라 참조가능한 필드 범위가 달라진다
		
		h1.show(); 	// show() 메서드는 Human 타입에 정의되어 있어서 호출이 가능하다
		h2.show();	// 각 객체의 메서드는 서브클래스에 의해 오버라이딩(덮어씌우기)되어 있다
		h3.show();	// 호출이 가능하지만, 호출한 후 실행되는 내용은 덮어씌운 내용으로 실행된다
		h4.show();	// 강제 형변환이 없어도 서브 클래스의 내용대로 실행된다
		
		((Doctor)h4).heal(h2);	// 오버라이딩이 아니라서 강제 형변환이 필요하다
		
		// 같은 자료형의 여러데이터를 묶어서 저장하는 구조 : 배열
		Human[] arr = { h1, h2, h3, h4 };
		
		for(int i = 0; i < arr.length; i++) {
			arr[i].show();
		}
	}
}

위 코드를 보며 프로그램의 상속 관계를 이해하고 자식 클래스의 내부 함수를 업캐스팅 된 클래스에서 어떻게 실행시킬 수 있는지를 파악한다.

4. 추상 클래스

  • 동물이라는 개념은 객체화 할수 없다
  • 동물의 특성을 물려받은 여러 하위 클래스가 존재하는 것
  • 추상 클래스 : 일반 메서드도 포함할 수 있고, 추상 메서드도 포함할 수 있다
  • 추상 클래스는 미완성된 내용이 포함되어 있어서, 생성자를 통해 객체를 직접 생성할 수 없다
  • 추상 메서드는 함수의 형식만 정의되어 있고, 함수의 내용(body)이 없는 함수
package animalHospital;


public abstract class Animal {
	
	String name;
	int age;
	
	Animal(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// 추상 메서드. 함수 내용이 없다
	public abstract void bark();	// 울음소리	

}
profile
다들 잘하는데 나만 못해?
post-custom-banner

0개의 댓글