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(); 은 부모 클래스를 호출하는 코드.
  • 자식 생성자를 먼저 호출하고 자식 생성자에서 부모 생성자를 호출하지만 실행되는 순서는 부모>자식 순으로 한다.
    1. 자식생성자 호출
    2. 부모생성자 호출>실행
    3. 자식생성자 실행
    4. 자식 객체 생성
  • 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