상속
Dec 21, 2023

Contents
메소드 오버라이딩extends + 상속하는 클래스명 : 상속하기
super.부모변수 : 부모가 가진 변수에 접근할 때 사용
다중 상속을 지원하지 않음
package ex06;
import java.sql.SQLOutput;
class Shape { // 부모
int x, y;
public Shape(){
System.out.println("Shape 생성됨");
}
}
class Circle extends Shape { // 자식
int radius; // 반지름
public Circle(int radius) { // 생성자
System.out.println("Circle 생성됨");
this.radius = radius;
System.out.println("1");
super.x = 0;// 부모의 변수에 접근
super.y = 0;
}
double getArea(){
return 3.14 * radius * radius;
}
}
public class CircleTest {
public static void main(String[] args) {
Circle circle = new Circle(10);
}
}



super(); : 부모 클래스의 디폴트 생성자가 호출
없으면 오류남 → 직접 super(파라미터) 해서 직접 호출
연습문제
package ex06;
class Person {
String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
}
class Employee extends Person {
String id;
public Employee() {
super();
}
public Employee(String name) {
super(name);
}
public Employee(String name, String id) {
super(name);
this.id = id;
}
@Override
public String toString() {
return "Employee [" +
"id='" + id + '\'' +
" name='" + name + '\'' +
']';
}
}
public class EmployeeTest {
public static void main(String[] args) {
Employee e = new Employee("Kim", "20210001");
System.out.println(e);
}
}

메소드 오버라이딩
부모 클래스의 메소드를 재정의 하는 것
메소드의 이름, 매개변수, 반환형은 동일해야 함
1. 부모 클래스의 매개변수와 같아야 함
- 철자가 틀리면 새로운 이름으로 인식
@Override
어노테이션을 붙이는 것이 좋음
부모 클래스에 해당 이름의 메소드가 없으면
컴파일러 오류 발생
어노테이션 : JVM이 인식하는 힌트
재정의의 장점
부모와 자식이 같은 것을 가지고 있을 때
→ 부모의 것을 무효화해서 자식 것 호출

오버로딩 : 같은 메소드 이름을 가진
여러 개의 메소드 작성
컴파일할 때 다형성을 지원
오버로딩의 한계 // 한계가 있을 때
오버라이딩 : 부모 클래스의 메소드를 재정의 하는것
실행할 때 다형성을 지원
재정의 : 부모의 같은 이름의 메소드를 가지고 와서
수정하는 것
다형성 : 무엇을 가르킬 것인지 선택할 수 있음
두 가지 이상의 이름을 가지고 있는 것
동적 바인딩 : 동적으로 메서드가 실행되면서 결정되는 것
자기 것을 무효화 시키면서 자식 것을 호출하는 것
super : 부모 클래스의 메소드나 필드를 명시적으로 참조할 때 사용
오버라이딩 → 부모 클래스의 메소드 호출
재정의 하는 이유?
부모가 들고 있는 것을 자식이 재정의하면
메모리의 포인터를 부모의 것으로 바꿔 호출할 수 있음
자식이 들고 있으면 부모의 것이 무효화됨⇒오버라이드
연습
package ex06.example;
class Animal {
void speak() {
System.out.println("멍멍");
}
void run() {
System.out.println("달린다");
}
}
class Cat extends Animal{
@Override
void speak() {
System.out.println("야옹"); // 재정의
}
}
public class AnimalEx01 {
public static void main(String[] args) {
Cat c1 = new Cat();
c1.speak();
c1.run();
}
}

package ex06;
class Shape0 {
public void draw(){
System.out.println("Shape");
}
}
class Circle0 extends Shape0 {
@Override
public void draw() {
System.out.println("Circle을 그립니다.");
}
}
class Rectangle extends Shape0 {
@Override
public void draw() {
System.out.println("Rectangle을 그립니다.");
}
}
class Triangle extends Shape0 {
@Override
public void draw() {
System.out.println("Triangle을 그립니다.");
}
}
public class ShapeTest {
public static void main(String[] args) {
Rectangle s = new Rectangle();
s.draw();
}
}

연습문제
1)
package ex06;
class Shape1 {
public void draw() {
System.out.println("Shape 중의 하나를 그릴 예정입니다.");
}
}
class Circle1 extends Shape1 {
@Override
public void draw() {
super.draw();
System.out.println("Circle을 그립니다.");
}
}
public class ShapeTest1 {
public static void main(String[] args) {
Circle1 s = new Circle1();
s.draw();
}
}

2)
package ex06;
class Animal0 {
public static void A() {
System.out.println("static method in Aninal0");
}
}
public class Dog0 extends Animal0 {
public static void A() {
System.out.println("static method in Dog0");
}
public static void main(String[] args) {
Dog0 dog = new Dog0();
Animal0 a = dog;
a.A(); // 부모의 메소드 호출
dog.A(); // 자식의 메소드 호출
}
}

3)
package ex06;
class Employee1 {
public int baseSalary = 3000000; // 기본급
int getSalary() {
return baseSalary;
}
}
class Manager extends Employee1{
@Override
int getSalary() {
return (baseSalary + 2000000);
}
}
class Programmer extends Employee1 {
@Override
int getSalary() {
return (baseSalary + 3000000);
}
}
public class EmployeeTest {
public static void main(String[] args) {
Manager obj1 = new Manager();
System.out.println("관리자의 월급: " + obj1.getSalary());
Programmer obj2 = new Programmer();
System.out.println("프로그래머의 월급: " + obj2.getSalary());
}
}

오버로딩 : 같은 메소드 이름을 가진 여러 개의 메소드 작성
오버로딩의 한계
준비
package ex06.example3;
public class Dark {
String name;
public Dark(String name) {
this.name = name;
}
public void attack(){
System.out.println("다크템플러가 공격합니다" + name);
}
}
package ex06.example3;
public class Dragoon {
String name;
public Dragoon(String name) {
this.name = name;
}
public void attack(){
System.out.println("드라군이 공격합니다" + name);
}
}
package ex06.example3;
public class River {
String name;
public River(String name) {
this.name = name;
}
public void attack(){
System.out.println("리버가 공격합니다" + name);
}
}
package ex06.example3;
public class Zealot {
String name;
public Zealot(String name) {
this.name = name;
}
public void attack(){
System.out.println("질럿이 공격합니다" + name);
}
}

package ex06.example3;
public class StarApp {
public static void gameStart(Zealot u1, Dragoon u2){
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, Zealot u2){
u1.attack();
u2.attack();
}
public static void gameStart(Zealot u1, Zealot u2){
u1.attack();
u2.attack();
}
public static void main(String[] args) {
// 질럿과 드라군 생성
Zealot z1 = new Zealot();
Dragoon d1 = new Dragoon();
Zealot z2 = new Zealot();
gameStart(z1, d1);
gameStart(d1, z1); //타입이 달라서 에러 -> 오버로딩 해야함
gameStart(z1, z2);
}
}

상태는 행위를 통해 변경한다.
오브젝트를 추상화시켜서 만든다. // 상속하여 모두 부모를 바라보게 한다.
Share article