[포스코x코딩온] 웹개발자 풀스택 부트캠프8기

[포스코x코딩온] Java(클래스의 상속, 오버라이딩, 추상 메소드, 추상 클래스)

항상 발전하는 개발자 2023. 10. 25. 09:08
728x90

클래스의 상속

  • 부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려받는 것
  • 장점
    • 멤버의 중복 작성 제거
    • 클래스의 계층적 분류 가능
    • 클래스의 재사용과 확장성 용이
  • 사진처럼 신분별로 클래스를 정의했다고 했을 때, "말하기, 먹기, 걷기, 잠자기"의 행동은 모든 신분에서 동일하게 정의된다. 

  • 이를 계층화하여, 아래와 같이 표현이 가능하다.
    • Person이라는 부모 클래스를 만들고 Student, Researcher, ... 클래스에서 상속받도록 하는것
    • Person을 부모클래스 혹은 슈퍼클래스라고 하고, Student를 자식 클래스 혹은 서브 클래스라고 한다.
     

  • 상속 문법
    • extends 키워드 사용
public class Person{
...
}

public class Researcher extends Person{
...
}
public class Professor extends Researcher{
...
}
public class Student extends Person{
...
}

메소드 오버라이딩

  • 오버라이딩이란, 슈퍼 클래스의 메소드를 서브 클래스에서 재정의 하는 것
    • 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것을 동일하게 작성
     

Student클래스는 Person에게서 상속 받는다.

  • 코드
  • Person.java
    • Object는 원래 생략.
package Java_OOP;


//기본으로 Object를 상속 받는다.
public class Person extends Object{
	private String name;
	private int age;
	
	//생성자
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}
	
	//기존에 Object에 있는 것 내가 마음대로 변경해서 사용한다.
	//어노테이션
	@Override
	public String toString() {
		return "Person/ name: " + name + ", age: "+ age;
	}
	
	
}
  • Student.java
package Java_OOP;

public class Student extends Person{
	private String major;
	
	public Student(String name, int age, String major) {
		//super() : 하위클래스에서 상위클래스 생성자를 호출하는 데 사용.  
		//super 키워드는 상위 클래스에서 오버라이드된 메소드를 호출하는 데 사용
		super(name, age);
		this.major = major;
		
	}
	
	@Override
	public String toString() {
		return "Student/ super: " + super.toString() + ", 전공:"+ major;
	}
	
}
  • Main.java
package Java_OOP;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//Person 클래스 인스턴스 생성
		Person person = new Person("홍길동", 30);
		System.out.println(person.toString());
//		System.out.println(person.getName());
//		System.out.println(person.getAge());

		
		//Student 클래스의 인스턴스 생성
		Student student = new Student("이몽룡", 32, "컴퓨터공학");
		System.out.println(student.toString());
		
		System.out.println(student.getName());
		System.out.println(student.getAge());
		
	}

}

추상 클래스와 추상 메소드

추상 클래스

  • 추상 메소드: 선언은 되어 있으나 구현이 되어 있지 않은 메소드
  • 추상 메소드를 갖는 클래스는 추상 클래스가 된다.
  • 추상 메소드 없이도 추상 클래스를 만들 수 있다.
  • 추상 클래스를 상속받는 서브 클래스에서 추상 메소드를 오버라이딩 해줘야 한다.

추상 클래스의 용도

  • 설계와 구현 분리
  • 슈퍼 클래스에서는 개념 정의
    • 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언
  • 서브 클래스에서 구체적 행위 구현
    • 서브클래스마다 목적에 맞게 추상 메소드를 다르게 구현

추상 클래스의 구현

  • abstract 키워드 사용
    • 추상 클래스안에 변수를 넣을 수 있다.
public abstract class Person{
	private int age;
	private String name;
...
	abstract public void printName();
}
  • 상속 받은 자식 클래스에서는 무조건 추상 클래스에 있는 메소드를 사용해야 한다.
//Student Class
public void printName(){
	System.out.println("학생" + getName());
}

※예시

package Java_OOP;

//추상 클래스
abstract class Animals {
	//추상 메서드: 하위 클래스에서 구현해야하는 메서드
	//Aniaml를 상속받는 클래스들에는 sound가 항상 들어가야 한다.
	abstract public void sound();
	
	public void sleep() {
		System.out.println("동물이 잠을 잔다.");
	}
}

//추상클래스 Animals을 상속받는 Dog클래스
class Chicken extends Animals{
	
	//필수 부분 넣기(sound);
	@Override
	public void sound() {
		System.out.println("꼬꼬댁");
	}
}

public class Abstract_ex {
	public static void main(String[] args) {
	//추상 클래스는 인스턴스로 할당 불가.
	//	Animals ani = new Animals();	
	
		
	Chicken chicken = new Chicken();
	
	chicken.sound();
	chicken.sleep();
	}
}
728x90