[JAVA] 상속 & 추상화

김채원·2025년 2월 25일
0
post-thumbnail

1. 상속이란 ?

  • 클래스간의 관계를 부모(상위), 자식(하위)으로 바라보는 개념
  • 이 구조를 통해 상속에서는 재사용, 확장 이 가능
  • extends를 사용해서 상속관계를 구현
  • 상속을 통해 코드 중복을 줄이고 유지보수성을 높일 수 있음

2. super

super는 부모클래스의 멤버(변수, 메서드)에 접근할 때 사용하는 키워드

public class Child extends Parent {

		private String familyName = "gim"

    public void superExample() {
        System.out.println("우리 " + this.familyName + " 가문은 ");
        System.out.println("원래 가문의 이름은 " + super.familyName);
    }
}
  • super - 생성자
    상속 관계를 사용하며 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출
    부모의 생성자를 호출할 때는 super ... ()를 사용
public class Child extends Parent {

		...

    public Child() {
        super(); 
        // 추가로직
    }
}
public class Parent {
    public Parent() {} // 부모 생성자
}

super()는 항상 생성자의 첫 줄에 위치해야함

3.재사용성

부모 클래스의 내용을 물려받아 그대로 재사용 가능

public class Parent {
    public String familyName = "김";
    public int honor = 10;

    public void introduceFamily() {
        System.out.println("우리 " + this.familyName + " 가문은 대대로 명성을 이어온...");
    }
}
class Child extends Parent { 
}

extends를 통해 상속받을 수 있음

public class Main {

    public static void main(String[] args) {
        Child child = new Child();
        System.out.println(child.honor); // 부모의 속성을 물려받아 사용
        System.out.println(child.familyName); // 부모의 속성을 물려받아 사용
        child.introduceFamily(); // 부모의 메서드를 물려받아 사용
    }
}

4. 확장

부모클래스의 기능을 유지하면서 자식클래스에서 기능을 확장할 수 있음 (메서드 추가)

class Child extends Parent { 
// 부모에는 없지만 자식에만 있는 기능
    public void output() {
        System.out.println("출력합니다");
    }
}
public class Main {

    public static void main(String[] args) {
		    ...
        child.showSocialMedia(); // 부모에는 없지만 자식에만 있는 기능
    }
}

5.오버라이딩

하위클래스에서 상위클래스의 메서드를 재정의하는것

오버라이딩 조건

  • @Override 애노테이션 사용
  • 메서드 이름이 같아야함
  • 파라미터 타입, 순서, 갯수가 같아야함
  • 반환 타입이 같아야함
  • 오버라이딩 메서드의 접근제어자가 상위 클래스의 메서드보다 제한적이어선 안됨
  • static, final, private 키워드가 붙은 메서드는 오버라이딩 x
  • 생성자는 오버라이딩 안됨

6. 추상클래스

공통 기능을 제공하면서 하위 클래스에 특정 메서드 구현을 강제하기 위해 사용

  • 객체를 생성할 목적이 아니라 설계도 역할을 할때 적합
  • abstract 키워드로 클래스를 선언하면 추상클래스
  • abstract 키워드로 메서드를 선언하면 자식클래스에서 강제로 구현
  • 추상클래스로 객체를 생성할 수 없음
  • 일반 클래스처럼 변수와 메서드를 가질 수 있음
abstract class Animal {

    private String name; // 변수선언가능

    abstract void eat(); // 추상메서드: 상속 받은 자식은 강제 구현

    public void sleep() { // 자식클래스에서 재사용가능
        System.out.println("쿨쿨");
    }
}
public class Cat extends Animal {
    
    @Override
    void eat() {
        System.out.println("냠냠"); //  자식클래스에서 강제 구현해야합니다.
    }
}
public class Main {

    public static void main(String[] args) {
        // Animal animal = new Animal(); // 추상클래스는 구현할 수 없음

        Cat cat = new Cat();
        cat.eat(); // 강제 구현한 메서드 사용
        cat.sleep(); // 부모클래스의 매서드 사용
    }
}

7. 추상클래스와 인터페이스 차이점

  • 상속이 계층적 구조를 선언하기 적합
  • 인터페이스는 표준을 제공하는 데 적합
  • 인터페이스는 인스턴스 변수를 선언할 수 없음
  • 계층적 구조를 표현하면서 공통 속성과 기능을 재사용할 때 추상클래스를 사용하는것이 적합

8. 추상화

추상화란?

  • 고양이 → 동물 → 생명체
  • 추상화란 불필요한 정보를 제거하고 본질적인 특징만 남기는 것을 의미
  • 객체지향 프로그래밍에서는 추상화의 계층적 특징을 활용해서 유지보수성이 좋은 프로그램을 만들 수 있음
  • 계층구조를 자바의 특징(인터페이스 상속, 클래스 상속)으로 구현할 수 있음
  • 추상화의 특징은 다형성에서 활용
profile
김채원 판교간다

0개의 댓글