Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

객체지향 PART 2 - 상속 본문

JAVA 객체지향 이해하기

객체지향 PART 2 - 상속

dev.hyuck 2025. 12. 10. 18:41

● 메서드 - 모듈화의 시작

● 클래스와 객체

● JVM 메모리 영역

● 래퍼클래스 (기본형 참조형)

● static - 클래스가 공유

● final - 변하지 않는 값

● 인터페이스 - 표준화의 시작

● 객체지향 PART 1 -  캡술 (접근제어자)

● 객체지향 PART 2 -  상속

● 객체지향 PART 3 - 추상화

● 객체지향 PART 4 - 다형성

 

캡 상 추 다 

객체지향 PART 2 -  상속

 

학습 키워드 점검

상속 - 코드를 재사용하고 확장하는 객체지향 개념

super - 부모인스턴스를 가르키는 키워드

오버라이딩 - 상속받은 메서드를 자식 클래스에서 재정의하는 방법

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

 

상속 ( Inherutance ) 이란?

 

● 클래스간의 관계를 부모 (상위 ), 자식 ( 하위 ) 로 바라보는 개념입니다.

● 이 구조를 통해 상속에서는 재사용성, 확장 이 가능합니다. (중요한 키워드 입니다 )

> 물려받은 속성과 기능은 자식 클래스에서 재사용할 수도 있고, 확장할 수도 있습니다.

● extends 키워드를 사용해서 상속관계를 구현합니다.

● 부모의 속성과 기능을 자식이 자연스럽게 물려받는다라고 생각하면 이해하기 쉽습니다.

● 상속을 통해 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.

● 추상화, 다형성을 구현하는데 잘 활용됩니다.

 

 

재사용성

상속의 첫 번째 장점 - 재사용성을 살펴봅시다.

● 상속의 장점은 부모 클래스의 내용을 물려받아 그대로 재사용 할 수 있습니다.

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(); // ✅ 부모의 메서드를 물려받아 사용
    }
}

 

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(); // ✅ (1)부모클래스 생성자를 먼저 호출
        // 추가로직은 여기에 작성
    }
}

public class Parent {
    public Parent() {} // ✅ 부모 생성자
}

 

확장

상속의 두 번째 장점 - 확장

● 부모클래스의 기능을 유지하면서 자식클래스에서 기능을 확장할 수 있습니다.

● 자식클래스에서 새로운 메서드를 추가하면 됩니다.

public class Child extends Parent {

		...

		// ✅ 부모에는 없지만 자식에만 있는 기능
    public void showSocialMedia() {
        System.out.println("우리 가문은 이제 SNS도 합니다. 팔로우 부탁드려요!");
    }
}

public class Main {

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

 

재정의 - 메서드 오버라이딩 ( overriding )

오버라이딩을 통해 부모클래스의 기능을 재정의할 수 있습니다.

● 부모 메서드를 자식 클래스에서 변경하여 재정의하는 것을 의미합니다.

○ 오버라이드된 메서드에서 @Override 키워드를 붙이는 것을 권장합니다. (없어도 동작합니다.)

○ @Override를 붙이면 컴파일러가 부모 클래스에 동일한 메서드가 없다고 경고를 줘서 실수를 방지할 수 있습니다.

● 메서드 이름, 매개변수, 반환타입이 완전히 동일해야합니다.

● 접근 제어자는 부모보다 더 강한 수준으로만 변경 가능합니다.

public class Parent {

    // 기존 기능
    public void introduceFamily() {
        System.out.println("우리 " + familyName + " 가문은 대대로 명성을 이어온 가문입니다.");
    }
}

class Child extends Parent {
		...
    
    @Override
    void introduceFamily() { // ✅ 자식클래스에서 재정의
        System.out.println("오버라이드");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.introduceFamily(); // 출력 "오버라이드"
    }
}

 

추상클래스

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

● 객체를 생성할 목적이 아니라 "설계도" 역할을 할때 적합합니다.

● 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(); // ✅ 부모클래스의 매서드 사용
    }
}

 

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

● 상속이 계층적 구조를 선언하기 적합합니다.

● 인터페이스는 표준을 제공하는데 적합합니다.

● 인터페이스는 인스턴스 변수를 선언할 수 없습니다.

● 계층적 구조를 표현하면서 공통 속성과 기능을 재사용할 때 추클래스를 사용하는것이 적합합니다.