-
Java 상속이란? + 문제풀이☕Java 2024. 12. 15. 20:18728x90
객체지향 프로그래밍에서 가장 중요한 개념 중 하나인 **상속(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단계 상속 구조를 가진 클래스들을 구현하세요:
- Content 클래스 (최상위 클래스)
- Video 클래스 (Content를 상속)
- Movie 클래스 (Video를 상속)
각 클래스에서 다음 요구사항을 구현하세요:
- 모든 클래스는 적절한 생성자를 가져야 합니다.
- play() 메서드를 각 클래스에서 오버라이드하세요.
- displayInfo() 메서드를 각 클래스에서 오버라이드하여 해당 클래스의 모든 속성을 출력하게 만드세요.
- 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'☕Java' 카테고리의 다른 글
Java에서 문자열과 숫자 간 변환: 쉽게 이해하기(부록 문자열 함수소개) (0) 2024.12.16 Java 추상(Abstract) 클래스와 인터페이스(Interface): 개념 잡고 활용하기 (0) 2024.12.16 자바 초보자를 위한 Constructor (생성자) 활용법 – 주소록 프로그램 만들기 (0) 2024.12.11 🖥️ 자바에서 명령어가 메모리를 활용하여 구동되는 원리 (완전 쉬운 설명!) (0) 2024.12.10 Java 객체지향 프로그래밍으로 책 정보 관리 시스템 구현하기 (0) 2024.12.10