ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 상속이란? + 문제풀이
    ☕Java 2024. 12. 15. 20:18
    728x90

    객체지향 프로그래밍에서 가장 중요한 개념 중 하나인 **상속(Inheritance)**에 대해 알아보겠습니다. 상속은 마치 부모로부터 자식이 특징을 물려받는 것처럼, 기존 클래스의 특징을 그대로 이어받아 새로운 클래스를 만드는 것을 의미합니다.

    왜 상속을 사용할까요?

    • 코드 재사용: 이미 만들어진 클래스를 재활용하여 새로운 클래스를 빠르게 만들 수 있습니다.
    • 클래스 계층 구조 형성: 클래스 간의 계층적인 관계를 만들어 코드의 가독성을 높이고 유지보수를 쉽게 합니다.
    • 다형성 지원: 상속을 통해 다형성을 구현하여 유연하고 확장 가능한 프로그램을 만들 수 있습니다.

    상속의 예시

    public class Parent {
        // 이름
        String name;
        // 나이
        int age;
        //  보유자산
        int money;
    
    
    
        public void print(){
            System.out.println("이름 : " +name);
            System.out.println("나이 : " +age);
            System.out.println("자산 : " +money);
        }
        ==========================================================================
        
        public class Child extends Parent{
    // 이름 나이 보유자산은 페어런츠 클래스에 있는 거니까 메번 쓰는거 힘드니까
    // 페어런츠 클래스에 있는거 그대로 가져와서 쓸거다
    // 그렇게 하기 위해서   칠드런 클래스 이름 옆에    extends Parent 써주면 된다
    
        // 상속 받을때 사용 하는 키워드가 extends다.
        // extends 오른쪽에, 상속 받을 클래스 명을 쓴다. (딱1개)- 오리지날 상속
        // 상속 받으면, 덜 상속받는데??
        // 맴버변수와 메소드 모두 눈에 안보이지만, 상속 받은 것!
    
    
    
    //    // 이름
    //    String name;
    //    // 나이
    //    int age;
    //    //  보유자산
    //    int money;
    
        String hobby;
    // 상속 받은 데이터가 있으니 해당 클래스에서도 시스템 아웃할때 다 적어줘야 한다
    // 부모에게 있는 이름 나이 자산 항목을 가져다 가공해서 사용 할 때는
        //@< 어노텐션이라고 한다  @Override 라고 표현을 해줘야 한다
        // 메소드 오버라이딩 : 상속 받은 함수 이름을 그대로 사용하되,
        // 입맛에 맛게 코드를 가공하여 사용하는것
    
        // 회사에 입사했을 떄 고참들이 만들어 놓은 클래스를 상속받아서 사용 하는데
        // 고참이 말함
        // 내가 프린트 함수를 만들었는데 이름은 그대로 쓰고 내용만 맞게 맞춰서 사용하세요
        // 이 클래스의 함수는 다른 클래스에서 사용 하니까
        // 함수 이름은 절대 바꾸지 마세요
        // 함수 안에서 로직을 짜서 사용 하면 됩니다.
    
        // 자바의 의 어노테이션이라고 한다
    
        @Override
        public void print() {
            super;                      // << super가 가르키는 것은 extends 옆의 parent
            System.out.println("취미 : " + hobby);
        }
     

     

    3. 상속의 종류 및 예제

    단일 상속

    • 하나의 클래스가 오직 하나의 부모 클래스만 가질 수 있는 경우를 말합니다.
    • 위의 Dog 클래스 예시가 단일 상속의 대표적인 예입니다.

    다중 상속

    • 하나의 클래스가 여러 개의 부모 클래스를 가질 수 있는 경우를 말합니다.
    • 자바에서는 다중 상속을 직접 지원하지 않지만, 인터페이스를 이용하여 다중 상속과 유사한 기능을 구현할 수 있습니다.

    계층적 상속

    • 클래스들이 계층적인 구조를 이루는 경우를 말합니다.
    • 할아버지 클래스, 아버지 클래스, 아들 클래스처럼 여러 단계의 상속 관계가 형성될 수 있습니다.

    4. 쉽게 풀이 및 설명

    상속은 왜 필요할까요?

    • 자동차 예시: 자동차라는 큰 틀 안에서 승용차, 트럭, 버스 등 다양한 종류의 자동차를 만들 수 있습니다. 이때 자동차가 가진 공통적인 특징(바퀴, 엔진 등)을 상속받아 각각의 자동차를 만들면 코드 중복을 줄이고 효율적으로 개발할 수 있습니다.

    상속의 장점

    • 코드 재사용: 이미 만들어진 코드를 반복해서 사용할 수 있어 개발 시간을 단축합니다.
    • 코드 관리 용이: 클래스 간의 관계를 명확하게 나타내어 코드를 이해하고 관리하기 쉽습니다.
    • 확장성: 새로운 클래스를 만들 때 기존 클래스를 상속받아 기능을 추가하거나 변경할 수 있습니다.

    상속의 단점

    • 클래스 간의 결합도가 높아짐: 부모 클래스에 변경이 생기면 자식 클래스에도 영향을 미칠 수 있습니다.
    • 복잡한 상속 관계: 상속 관계가 복잡해지면 코드를 이해하기 어려워질 수 있습니다.

     

     

    Main 클래스 

    package entity;
    
    public class Content {
        public String title;
        public String duration;
    
    
        // 제목과 재생 시간 정보 출력
        public void displayInfo() {
            System.out.println("제목 : " + title);
            System.out.println("재생시간 : " + duration);
        }
    
        // "[title]을 재생합니다. 재생 시간: [duration]분" 메시지
        public void play() {
            System.out.println(title+"을 재생합니다.");
            System.out.println("재생 시간: "+duration);
        }
    
    
    
    
        //-------------------------생성자-----------------
        public Content() {
        }
    
        public Content(String title, String playtime) {
            this.title = title;
            this.duration = playtime;
        }
    
    
    
    
    //-----------------------개터새터--------------------------
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getPlaytime() {
            return duration;
        }
    
        public void setPlaytime(String playtime) {
            this.duration = playtime;
        }
    }

     

    부모클래스 

    package entity;
    
    public class Content {
        public String title;
        public String duration;
    
    
        // 제목과 재생 시간 정보 출력
        public void displayInfo() {
            System.out.println("제목 : " + title);
            System.out.println("재생시간 : " + duration);
        }
    
        // "[title]을 재생합니다. 재생 시간: [duration]분" 메시지
        public void play() {
            System.out.println(title+"을 재생합니다.");
            System.out.println("재생 시간: "+duration);
        }
    
    
    
    
        //-------------------------생성자-----------------
        public Content() {
        }
    
        public Content(String title, String playtime) {
            this.title = title;
            this.duration = playtime;
        }
    
    
    
    
    //-----------------------개터새터--------------------------
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getPlaytime() {
            return duration;
        }
    
        public void setPlaytime(String playtime) {
            this.duration = playtime;
        }
    }
    

     

    자식 클래스 

    package entity;
    
    public class Video extends Content{
        protected String resolution;
    
    
        // 부모 클래스의 play() 메서드 호출
        // "[resolution] 해상도로 재생합니다." 메시지 추가 출력
        @Override
        public void play() {
            super.play();
            System.out.println(resolution+" 해상도로 재생합니다.");
        }
    
    
        // 부모 클래스의 displayInfo() 메서드 호출
        // 해상도 정보 추가 출력
        @Override
        public void displayInfo() {
            super.displayInfo();
            System.out.println("해상도 : "+resolution);
        }
    
        public void adjustResolution(String newResolution) {
            // resolution을 newResolution으로 변경
            // "해상도가 [newResolution]로 변경되었습니다." 메시지 출력
            this.resolution=newResolution;
            System.out.println(title+"의 해상도가 "+newResolution+"로 변경되었습니다.");
        }
    
    
        //-------------------------생성자-----------------
        public Video(String title, String duration, String resolution) {
            super(title, duration);
            this.resolution = resolution;
        }
    
    //-----------------------개터새터--------------------------
    
        public String getResolution() {
            return resolution;
        }
    
        public void setResolution(String resolution) {
            this.resolution = resolution;
        }
    
    }

     

    손자 클래스 

    package entity;
    
    public class Movie extends Video {
        private String director;
        private int releaseYear;
    
        // 부모 클래스의 play() 메서드 호출
        // "감독: [director], 개봉년도: [releaseYear]" 메시지 추가 출력
        @Override
        public void play() {
            super.play();
            System.out.println("감독 : "+director);
            System.out.println("개봉년도 : "+releaseYear);
        }
    
        // 부모 클래스의 displayInfo() 메서드 호출
        // 감독과 개봉년도 정보 추가 출력
        @Override
        public void displayInfo() {
            super.displayInfo();
            System.out.println("감독 : "+director);
            System.out.println("개봉년도 : "+releaseYear);
        }
    
        // "영화 [title]의 출연진 정보입니다." 메시지 출력
        // (실제 출연진 정보는 구현하지 않음)
        public void displayCast() {
            System.out.println("영화 "+title+"의 출연진 정보입니다.");
            System.out.println("홍길동");
            System.out.println("이몽룡");
        }
    
        // displayInfo() 메서드 호출
        // play() 메서드 호출
        // displayCast() 메서드 호출
        // adjustResolution() 메서드를 호출하여 해상도를 "4K"로 변경
        public void fullDisplay(String aaa) {
            displayInfo();
            play();
            displayCast();
            adjustResolution(aaa);
        }
    
    
    
        //-------------------------생성자-----------------
    
        public Movie(String title, String duration, String resolution, int releaseyeay, String director) {
            super(title, duration, resolution);
            this.releaseYear = releaseyeay;
            this.director = director;
        }
    
    //-----------------------개터새터--------------------------
    
        public String getDirector() {
            return director;
        }
    
        public void setDirector(String director) {
            this.director = director;
        }
    
        public int getReleaseyeay() {
            return releaseYear;
        }
    
        public void setReleaseyeay(int releaseyeay) {
            this.releaseYear = releaseyeay;
        }
    }

    문제 

    문제: 온라인 스트리밍 서비스 관리 시스템

    다음과 같은 3단계 상속 구조를 가진 클래스들을 구현하세요:

    1. Content 클래스 (최상위 클래스)
    2.  
    3. Video 클래스 (Content를 상속)
    4.  
    5. Movie 클래스 (Video를 상속)
    6.  

    각 클래스에서 다음 요구사항을 구현하세요:

    1. 모든 클래스는 적절한 생성자를 가져야 합니다.
    2. play() 메서드를 각 클래스에서 오버라이드하세요.
    3. displayInfo() 메서드를 각 클래스에서 오버라이드하여 해당 클래스의 모든 속성을 출력하게 만드세요.
    4. Movie 클래스에서 모든 상위 클래스의 메서드를 호출하는 fullDisplay() 메서드를 구현하세요.

    Main 클래스에서 Movie 객체를 생성하고 모든 메서드를 호출하여 테스트하세요.

     

    public class Content {

        // 제목

        protected String title;

        // 재생 시간

        protected int duration;

     

        public Content(String title, int duration) {

            // title과 duration을 초기화

        }

     

        public void play() {

            // "[title]을 재생합니다. 재생 시간: [duration]분" 메시지 출력

        }

     

        public void displayInfo() {

            // 제목과 재생 시간 정보 출력

        }

    }

     

    public class Video extends Content {

        // 해상도 : "720p", "1080p", "4K" 

        protected String resolution;

     

        public Video(String title, int duration, String resolution) {

            // 부모 클래스의 생성자 호출

            // resolution 초기화

        }

     

        @Override

        public void play() {

            // 부모 클래스의 play() 메서드 호출

            // "[resolution] 해상도로 재생합니다." 메시지 추가 출력

        }

     

        @Override

        public void displayInfo() {

            // 부모 클래스의 displayInfo() 메서드 호출

            // 해상도 정보 추가 출력

        }

     

        public void adjustResolution(String newResolution) {

            // resolution을 newResolution으로 변경

            // "해상도가 [newResolution]로 변경되었습니다." 메시지 출력

        }

    }

     

    public class Movie extends Video {

        // 감독 이름

        private String director;

        // 개봉년도

        private int releaseYear;

     

        public Movie(String title, int duration, String resolution, String director, int releaseYear) {

            // 부모 클래스의 생성자 호출

            // director와 releaseYear 초기화

        }

     

        @Override

        public void play() {

            // 부모 클래스의 play() 메서드 호출

            // "감독: [director], 개봉년도: [releaseYear]" 메시지 추가 출력

        }

     

        @Override

        public void displayInfo() {

            // 부모 클래스의 displayInfo() 메서드 호출

            // 감독과 개봉년도 정보 추가 출력

        }

     

        public void displayCast() {

            // "영화 [title]의 출연진 정보입니다." 메시지 출력

            // (실제 출연진 정보는 구현하지 않음)

        }

     

        public void fullDisplay() {

            // displayInfo() 메서드 호출

            // play() 메서드 호출

            // displayCast() 메서드 호출

            // adjustResolution() 메서드를 호출하여 해상도를 "4K"로 변경

        }

    }

     

    public class Main {

        public static void main(String[] args) {

            // Movie 객체 생성 (제목, 재생시간, 해상도, 감독, 개봉년도 지정)

            // 생성된 Movie 객체의 fullDisplay() 메서드 호출

        }

    }



    728x90
Designed by Tistory.