ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [포스코x코딩온] Java(클래스의 상속, 오버라이딩, 추상 메소드, 추상 클래스)
    [포스코x코딩온] 웹개발자 풀스택 부트캠프8기 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
Designed by Tistory.