본문 바로가기
  • Coding & Book
학습단/JAVA 학습단

8. 혼공자 8일차(상속)

by 루이3 2023. 7. 13.

8일차

클래스 상속

  • 프로그램에서의 상속자식이 부모를 선택합니다.
  • 자식 클래스를 선언할때 어떤 부모 클래스를 상속 받을 것인지 결정 합니다.
  • 여러개의 부모 클래스상속할수 없습니다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속대상에서 제외 됩니다.

 

부모 생성자 호출

  • 자식객체를 생성하게 되면 부모 객체가 먼저 생성됩니다.(부모 없이 자식이 있을수 없기 때문입니다.)

 

& 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하는 경우

자식 클래스(매케변수 선언, ) {
	super(매개값, );
}

 

 

예제


부모 클래스)

package sec07.exam01;

public class People {
	public String name;
	public String ssn;
	
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
}

자식 클래스)

package sec07.exam01;

public class Student extends People {
	public int studentNo;
	
	public Student(String name, String ssn, int studentNo) {
		super(name, ssn);
		this.studentNo = studentNo;
	}
}

자식 객체 이용)

package sec07.exam01;

public class StudentExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student student = new Student("전우치", "123456-7891011", 1);
		System.out.println("name: " + student.name);
		System.out.println("ssn: " + student.ssn);
		System.out.println("studentNo: " + student.studentNo);
	}

}

메소드 재정의

  • 하위 클래스가 상위 클래스로 부터 상속받은 메소드를 자신의 필요에 맞게 다시 정의하는것 입니다.

 

&메소드 재정의 방법

  • 메소드 재정의는 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 말합니다.
부모의 메소드와 동일한 시그니처를 가져야 합니다.
접근 제한을 더 강하게 재정의 할수 없습니다.
새로운 예외를 throw할수 없습니다.

 

 

예제


부모 클래스)

package sec07.exam01;

public class Calculator {
	double areaCircle(double r) { 
		System.out.println("Calculator 실행");
		return 3.14159 * r * r; 
	}
}

자식 클래스)

package sec07.exam01;

public class Computer extends Calculator {
	@Override
	double areaCircle(double r) {
	System.out.println("Computer 실행");
		return Math.PI * r * r;
	}
}

메소드 재정의 테스트)

package sec07.exam01;

public class ComputerExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int r = 10;		
		Calculator calculator = new Calculator();
		System.out.println(calculator.areaCircle(r));		
		System.out.println();		
		Computer computer = new Computer();
		System.out.println(computer.areaCircle(r));
	}

}

 

 

부모 메소드 호출

  • 상속 계층 구조에서 하위 클래스가 부모 클래스의 메소드를 재정의 하고 있을때 유용합니다.

 

 

상속 할수 없는 final 클래스

  • 클래스를 선언할때 final 키워드 class 앞에 붙이면 이 클래스는 최종적인 클래스가 됩니다.
  • 부모 클래스가 될수 없어 자식 클래스를 만들수 없습니다.

 

재정의 할수 없는 final 메소드

  • 메소드를 선언할때 final 키워드를 붙이면 이 메소드는 최종적인 메소드가 됩니다.
  • 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할수 없습니다.

 

자동 타입 변환

  • 타입 변환이란 타입을 다른 타입으로 변환시키는 행위 입니다.
  • 자동타입 변환은 프로그램 실행 도중에 자동적으로 타입변환이 일어나는것을 말합니다.

 

강제 타입변환

  • 강제 타입변환은 부모 타입을 자식 타입으로 변환하는 것을 말합니다.
  • 모든 부모타입을 자식타입으로 강제변환 할수 있는 것은 아닙니다.

 

예제


부모 클래스)

package sec07.exam01;

public class Parent2 {
	public String field1;
	
	public void method1() {
		System.out.println("Parent-method1");
	}
	
	public void method2() {
		System.out.println("Parent-method2");
	}
}

자식 클래스)

package sec07.exam01;

public class Child2 extends Parent2 {
	public String field2;
	
	public void method3() {
		System.out.println("child method3");
	}
}

강제타입변환)

package sec07.exam01;

public class ChildExample2 {
	public static void main(String[] args) {
		Parent2 parent = new Child2();
		parent.field1 = "data1"; //자동 타입 변환
		parent.method1();
		parent.method2();
		
		Child2 child = (Child2) parent; //강제 타입 변환
		child.field2 = "yyy";
		child.method3();
		}

}

 

 

 

 

 

추상 클래스

  • 일부 메소드의 구현 하위 클래스에게 위임하는것입니다.
  • 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스를 말합니다.
  • 공통된 필드와 메소드의 이름을 통일할 목적으로 사용합니다.
  • 실체 클래스를 작성할때 시간이 절약됩니다.

 

 

&추상 클래스 선언

  • 클래스 선언에 abstract 키워드를 붙이면 됩니다.
  • abstract를 붙일경우 new 연산자를 이용해서 객체를 만들지 못합니다.

 

예제


추상 클래스)

package sec07.exam01;

public abstract class Phone {
	public String owner;
	
	public Phone(String owner) {
		this.owner = owner;
	}
	
	public void turnOn() {
		System.out.println("폰을 켭니다.");
	}	
	public void turnOff() {
		System.out.println("폰을 끕니다.");
	}
}

실체 클래스)

package sec07.exam01;

public class SmartPhone extends Phone {
	public SmartPhone(String owner) {
		super(owner);
	}
	
	public void internetSearch() {
		System.out.println("검색");
	}
}

실행 클래스)

package sec07.exam01;

public class PhoneExample {
	public static void main(String[] args) {
	SmartPhone smartPhone = new SmartPhone("전우치");
	
	smartPhone.turnOn();
	smartPhone.internetSearch();
	smartPhone.turnOff();
	}
}

 

 

추상 메소드와 재정의

  • 추상 클래스에서만 선언이 가능합니다.
  • 메소드 선언부에 있는 메소드를 말합니다.
  • 추상 메소드는 자식 클래스에서 재정의 되어 실행 내용을 결정해야 합니다.

 

 

 

 

 


기본미션

p. 330 문제 5번 실행 결과 인증 화면 캡처하기

package sec07.exam01;

public class Parent {
	public String nation;
	
	public Parent() {
		this("대한민국");
		System.out.println("Parent() call");
	}
	
	public Parent(String nation) {
		this.nation = nation;
		System.out.println("Parent(String nation) call");
	}
}

 

 

package sec07.exam01;

public class Child extends Parent {
	private String name;
	
	public Child() {
		this("홍길동");
		System.out.println("Child() call");
	}
	
	public Child(String name) {
		this.name = name;
		System.out.println("Child(String name) call");
	}
}

 

 

package sec07.exam01;

public class ChildExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Child child = new Child();
	}

}