728x90
수업내용 정리 (Java)
1. 상속
- 상속은 오버라이딩을 통해 다형성을 활용하기 위해서 사용한다.
- 부모(상위) 클래스와 자식(하위) 클래스로 나눈다.
- 자식 클래스가 부모 클래스를 상속. 이때, 정보은닉이 우선적이라 상속을 해도 직접 부모 클래스의 private 필드를 언급할 수 없다.
- 부모타입 참조변수는 자식 인스턴스를 참조할 수 있다. 반대의 경우, 불가능!
- Person p(참조변수) = new Student("kim", 20, 1);(자료형 변수)
- IS-A 관계(Person⬅️Student ⬅️PartTimeStudent / ex: Student is a Person)
1-1) Ex01 ㄱ
더보기
메인 클래스
Person p = new Person("cha", 20);
- Person class 객체
Student s1 = new Student("kim",30,1);
s1.eat();
s1.sleep();
s1.study();
s1.exam();
s1.showInfo();
System.out.println(s1);
- Student class 객체
Student pts = new PartTimeStudent("choi", 22, 5, 9620, 20);
// Student 눈에는 Student의 멤버만 보인다.
pts.showInfo();
pts.sleep();
pts.eat();
pts.study();
pts.exam();
//pts.work();
- Student 타입의 PartTimeStudent class 객체
- Student class를 참조변수로 PartTimeStudent class를 자료형 변수로 사용한 경우.
- Student class나 Student의 상위 클래스의 메소드만 사용할 수 있다. (오버라이딩 가능/PartTimeStudent class 메소드 사용 불가능)
- PartTimeStudent class에는 work 메소드가 있지만 Student class에 work 메소드가 없기 때문에 사용 시 에러가 난다.
fct(new Person("사람",10));
fct(new Student("학생",20,1));
fct(new PartTimeStudent("근로학생",30,2,9000,10));
- fct 메소드 사용
private static void fct(Person person) {
person.showInfo();
System.out.println("-----------");
}
- 다형성
- fct 메소드에 매개변수로 Person 객체를 생성한다.
- 자식(하위) 객체를 생성할 때, 변수 타입을 부모(상위) 클래스로 사용할 수 있다.
- 단, 부모(상위) 객체를 생성할 때, 자식(하위) 클래스를 타입으로 사용할 수는 없다.
1-2) Person ㄱ
더보기
부모(조상, 상위) 클래스
// 필드(특성)
private String name;
private int age;
- 자식 클래스가 공유하는 필드
// 생성자
public Person() {
System.out.println("Person() call");
this.name = "noName";
this.age = 1;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
- 기본 생성자로 객체를 생성하면 자동으로 name은 noName, age는 1로 값이 들어간다.
- 자식 클래스에서 생성할 때, 호출하여 사용할 수 있다.
// 메소드(행위)
public void sleep() {
System.out.println("사람은 8시간 잔다.");
}
public void eat() {
System.out.println("사람은 세끼를 먹는다.");
}
public void showInfo() {
System.out.println("name: "+name);
System.out.println("age : "+age);
}
- 해당 메소드를 자식 클래스에서 호출하여 사용할 수 있다.
@Override
public String toString() {
String str = ("name: "+name+"\nage : "+age);
return str;
}
- 기본적으로 toString 메소드가 숨겨진 상태로 존재하는데 불러서 고쳐서 사용하는 것을 오버라이딩이라고 한다.
1-3) Student ㄱ
더보기
자식(후손, 하위) 클래스
// 필드
// name, age, sleep(), eat()
private int sNo;
- 두번째 줄의 주석처리 부분은 부모 클래스에서 상속한 필드 및 메소드
// 생성자
public Student(String name, int age, int sNo) {
super(name,age); // 부모 클래스 호출
this.sNo = sNo;
}
- super(); 은 부모 클래스를 호출하는 코드.
- 자식 생성자를 먼저 호출하고 자식 생성자에서 부모 생성자를 호출하지만 실행되는 순서는 부모>자식 순으로 한다.
- 자식생성자 호출
- 부모생성자 호출>실행
- 자식생성자 실행
- 자식 객체 생성
- ex) super(); == Person(); / super(name, age); == Person(name, age);
- super로 부모 클래스를 호출했기 때문에 this.sNo만 저장하면 된다.
// 메소드
public void study() {
System.out.println("학생은 공부를 한다.");
}
public void exam() {
System.out.println("학생은 시험을 본다.");
}
/* 빈 칸에 두고 ctrl+spece bar 누르면 Override(재정의) 할 메소드가 뜸! */
// 메소드 재정의(오버라이딩)
@Override
public void sleep() {
super.sleep(); //Person의 sleep();
System.out.println("GAME, TV를 줄인다.");
}
@Override
public void eat() {
System.out.println("학생은 두끼를 먹는다.");
}
@Override
public void showInfo() {
super.showInfo(); // Person.showInfo();
System.out.println("sNo : "+sNo);
}
@Override
public String toString() {
String str = "\nsNo : "+sNo;
return super.toString()+str;
/* super.toString(); == 부모의 toString을 호출
* toString(); == 본인의 toString을 호출
* toString에서 return toString을 하면 에러가 남 */
}
- 메소드 위에 @Override가 있으면 메소드에 오류가 있을때 걸러준다.
- 부모 클래스에 있는 메소드를 해당 클래스에 맞춰 재정의하는 것이 오버라이딩이다.
- toString에서 return toString을 하면 본인의 메소드를 계속 재실행하기 때문에 에러가 난다.
1-4) PartTimeStudent ㄱ
더보기
자식(후손, 하위)의 자식 클래스
// 필드
private int pay;
private int workTime;
// 생성자
public PartTimeStudent(String name, int age, int sNo, int pay, int workTime) {
super(name, age, sNo);
this.pay = pay;
this.workTime = workTime;
}
- super();을 통해 부모 생성자를 호출하여 저장하고, 본인 필드에 값을 저장한다.
// 메소드
public void work() {
System.out.println("근로학생은 일을 한다.");
workTime++;
}
// 오버라이딩(메소드 재정의)
@Override
public void showInfo() {
super.showInfo(); // Student.showInfo();
System.out.println("주급 : "+(pay*workTime));
}
@Override
public void sleep() {
System.out.println("근로학생은 4시간 잔다.");
}
@Override
public String toString() {
String str = "\n주급 : "+(pay*workTime);
return super.toString()+str;
}
- 맨 위의 메소드는 부모메소드를 호출하고, 추가적으로 출력할 내용을 추가했다.
질문한 내용이나 어려웠던 점 메모
1. 상속
- 부모타입 참조변수는 자식 인스턴스를 참조할 수 있다.
- ⬆️를 이해하지 못해서 일단 외우기로 했다.
전체 피드백
- 이해하진 못하더라도 응용할 수 있게 외우기
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 18일차 (23/10/16) - Java (1) | 2023.10.16 |
---|---|
수업일지 17일차 (23/10/13) - Java (0) | 2023.10.14 |
수업일지 15일차 (23/10/11) - Java (1) | 2023.10.11 |
수업일지 14일차 (23/10/10) - Java (0) | 2023.10.10 |
수업일지 13일차 (23/10/06) - Java (1) | 2023.10.07 |