학원에서 학습한 내용을 개인정리한 글입니다.
[접근제한자] class 클래스명 extends 클래스명 {}
public class Academy extends Company {}
💡
?: 부모자식간의 관계에서 자식이 몇대까지 내려올수있는지..? e.g. 부모의 자식, 자식의 자식, 그. 자식의 자식의 자식?
Teacher: 계층구조로 나눠서 하는 건 가능! 근데 위에서부터 아래까지 쭉 내려올거라면 잘 생각해서 설계해야할 것..
Temi: parent를 상속받은 child가 child 안에서 상속받은 필드 변수를 수정하면 부모의 값이 바뀌는건지?
Teacher : 안바뀐다. child new 로 생길때마다 새로운 인스턴스가 생기는거다. 다른 child가 생기더라도 각자의 값을 가질 수 있다

public void basicInherit() {
//기본 상속에 대해 알아보자
//선언 되어 있는 클래스의 내용을 가져와 사용
//클래스간의 관계를 설정
//클래스 선언부에 extend 예약어를 사용해서 설정
//e.g. public class Child(sub) extends Parent(super){}
A_Child child = new A_Child();
child.gender = '남';
child.test();
System.out.println(child.gender);
child.setData("오");
System.out.println(child.getData());
A_Child child2= new A_Child();
System.out.println(child2.gender);
//부모 클래스의 필드, 메소드에 접근할 때 부모 클래스에 선언된 접근제한자 우선처리
// child2.weight = 66.4;
}
public A_Parent(String data) {
this.data = data;
}
public class A_Child extends A_Parent{
private String[] names;
public A_Child() {
super("우와 ");
}
public void childTest() {
//data = "hi"; // private 라 접근 X
//getter. setter 를 이용하여 접근
setData("안녕");
//protected 접근 제한자는 자식 클래스에서 직접접근이 가능
weight = 65.5;
}
}
public class A_Child2 extends A_Parent{
//부모는 여러명의 자식을 가질 수 있다
private int[] numbers;
public void setNumbers(int[] numbers) {
this.numbers = numbers;
}
public int[] getNumbers() {
return numbers;
}
}
package com.inherit.model.vo;
public class Person {
protected String name;
protected int age;
protected char gender;
public Person() {
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
package com.inherit.model.vo;
public class Developer extends Person {
private int experience;
private String majorLanguage;
public Developer() {
}
public Developer(String name, int age, char gender, int experience, String majorLanguage) {
super.setName(name);
super.setAge(age);
super.setGender(gender);
this.experience = experience;
this.majorLanguage = majorLanguage;
}
public int getExperience() {
return experience;
}
public void setExperience(int experience) {
this.experience = experience;
}
public String getMajorLanguage() {
return majorLanguage;
}
public void setMajorLanguage(String majorLanguage) {
this.majorLanguage = majorLanguage;
}
public void inform() {
System.out.println(super.name + " " + super.age + " " + super.gender + " " + this.experience + " " + this.majorLanguage);
}
}
Developer dp = new Developer("aaa", 15, 'f', 5, "java");
dp.inform();
Instructor i = new Instructor("ㅇㅇㅇ", 20, 'm', 5, "국어", 5000);
i.inform();
OfficeWorker o = new OfficeWorker("OOO", 15, 'f', 12, "daasd", "dsad");
o.inform();
Student s = new Student("AAA", 24, 'f', 3, "컴공","한국대학교");
s.inform();
| 오버라이딩 | 오버로딩 |
|---|---|
| 하위 클래스에서 메소드 정의 | 같은 클래스에서 메소드 정의 |
| 메소드 이름 동일
매개변수 동일
리턴타입 동일 | 메소드 이름 동일
매개변수 다름(개수, 타입)
리턴 타입 상관 없음 |
| 자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야함 | 접근 제어자와 상관 없음 |
| 자식 메소드의 예외 수가 부모 메소드의 예외 수보다 적거나 범위가 좁아야 함 | 예외처리와 상관 없음 |
package com.inherit.model.vo;
public class C_Animal {
private String name;
private int age;
private double weight;
public C_Animal() {
}
public C_Animal(String name, int age, double weight) {
super();
this.name = name;
this.age = age;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void move() {
System.out.println(name + " 앞으로 움직임");
}
public void bark() {
System.out.println(name + " 울어요");
}
}
package com.inherit.model.vo;
public class C_Dog extends C_Animal{
public C_Dog() {
}
public void move() {
System.out.println(getName() + "이 우당탕탕 움직임");
}
@Override
public void bark() {
System.out.println(getName() + "이 멍멍멍 짖음");
}
}
package com.inherit.model.vo;
public class C_Cat extends C_Animal{
public C_Cat() {
}
public void move() {
System.out.println(getName() + "이 사뿐사뿐 움직임");
}
@Override
public void bark() {
System.out.println(getName() + "이 야오옹 울음");
}
}
public class C_OverrideController {
public void overrideTest() {
C_Dog dog = new C_Dog();
dog.setName("덕만");
dog.setAge(5);
dog.setWeight(5.5);
dog.move();
dog.bark();
C_Cat cat = new C_Cat();
cat.setAge(4);
cat.setName("김춘식");
cat.setWeight(6.1);
cat.move();
cat.bark();
}
}
💡
Temi: 한정적으로 상속을 받을 수도 있는건지? 필요없는게 있을 수 있다.
Teacher : 가능하다. Interface라는 것이 있는데 추후에 배울 것. 지금은 디폴트 값을 다르게 하고 서로 약속을 해두면 된다.
@Override
public String toString() {
return no +" "+ name;
}
@Override
public boolean equals(Object obj) {
//this값, 매개변수 객체와 비교
//동등한 값에 대한 기준을 설정
D_ObjectTest param = (D_ObjectTest)obj;
if(this.no == param.no && this.name.equals(param.name)) {
return true;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(no, name);
}
@Override
public D_ObjectTest clone() {
return new D_ObjectTest(no, name);
}

