상속

Dec 21, 2023
상속

💡
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); } }
notion image
notion image
notion image
💡
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); } }
notion image
 
 

메소드 오버라이딩

부모 클래스의 메소드를 재정의 하는 것
💡
메소드의 이름, 매개변수, 반환형은 동일해야 함
💡
1. 부모 클래스의 매개변수와 같아야 함
  1. 철자가 틀리면 새로운 이름으로 인식
  1. @Override 어노테이션을 붙이는 것이 좋음
부모 클래스에 해당 이름의 메소드가 없으면
컴파일러 오류 발생
어노테이션 : JVM이 인식하는 힌트
 
재정의의 장점
부모와 자식이 같은 것을 가지고 있을 때
→ 부모의 것을 무효화해서 자식 것 호출
notion image
 
💡
오버로딩 : 같은 메소드 이름을 가진
여러 개의 메소드 작성
컴파일할 때 다형성을 지원
오버로딩의 한계 // 한계가 있을 때
오버라이딩 : 부모 클래스의 메소드를 재정의 하는것
실행할 때 다형성을 지원
재정의 : 부모의 같은 이름의 메소드를 가지고 와서
수정하는 것
다형성 : 무엇을 가르킬 것인지 선택할 수 있음
두 가지 이상의 이름을 가지고 있는 것
동적 바인딩 : 동적으로 메서드가 실행되면서 결정되는 것
자기 것을 무효화 시키면서 자식 것을 호출하는 것
 
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(); } }
notion image
 
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(); } }
notion image
 
 

연습문제

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(); } }
notion image
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(); // 자식의 메소드 호출 } }
notion image
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()); } }
notion image
 
오버로딩 : 같은 메소드 이름을 가진 여러 개의 메소드 작성
오버로딩의 한계

준비


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); } }
 
notion image
 
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); } }
notion image
 
상태는 행위를 통해 변경한다.
오브젝트를 추상화시켜서 만든다. // 상속하여 모두 부모를 바라보게 한다.
Share article

vosw1