<오버라이딩> - 엄청나게 중요!
오버라이딩은 부모 클래스로부터 상속받은 메소드의 내용을 자식 클래스에서 재정의하는 것.
아래와 같이 Animal 클래스가 있다.
class Animal {
public void move() {
System.out.println("동물이 움직인다.");
}
}
move() 메소드는 모든 동물이 공통적으로 가지고 있는 움직이는 기능을 구현하고 있음.
이제 Animal 클래스를 상속받은 Dog 클래스를 정의해 보자.
class Dog extends Animal {
// Override
public void move() {
System.out.println("강아지가 네 발로 걷는다.");
}
}
Dog 클래스는 Animal 클래스로부터 move() 메소드를 상속받았음.
그래서 이 move() 메소드를 재정의하여 강아지가 네 발로 걷는다는 내용을 추가함.
이렇게 오버라이딩을 하면,
자식 클래스에서 부모 클래스의 메소드를 그대로 사용하거나, 필요에 따라 내용을 재정의하여 사용할 수 있다.
오버라이딩을 하기 위해서는 다음과 같은 조건을 만족해야 함.
- 메소드의 이름, 매개변수의 개수와 타입, 반환 타입이 모두 같아야 함.
- 접근제어자는 부모클래스의 메소드보다 좁아질 수 없다.
- 예외는 부모 클래스의 메소드보다 많이 선언할 수 없다.
접근제어자 :
public: 모든 곳에서 접근 가능.
protected: 같은 패키지와 자손 클래스에서 접근 가능.
default: 같은 패키지에서만 접근 가능.
private: 같은 클래스에서만 접근 가능.
접근 제어자는 멤버 선언 앞에 접근 제어자를 붙여서 사용.
오버라이딩은 다음과 같은 장점을 가지고 있음.
- 코드의 재사용성을 높일 수 있다.
- 코드의 유지보수를 쉽게 할 수 있다.
- 클래스 계층구조를 단순화할 수 있다.
----------------------------------------------------------------------------------------
<상속>
상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고
코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이함.
다음과 같이 Animal 클래스를 정의했다고 가정.
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void move() {
System.out.println("동물이 움직인다.");
}
}
name변수와 move()메소드를 가지고 있음.
이제 Animal 클래스를 상속받은 Dog 클래스를 정의해 보자.
class Dog extends Animal {
public Dog(String name) {
super(name);
}
// Override
public void move() {
System.out.println("강아지가 네 발로 걷는다.");
}
}
Dog 클래스는 Animal 클래스로부터 name변수와 move()메소드를 상속 받았다.
그리고 move() 메소드를 재정의하여 강아지가 네 발로 걷는다는 내용을 추가했다.
이렇게 상속을 하면, 자식 클래스는 부모 클래스의 속성과 메소드를 그대로 사용할 수 있다.
상속은 다음과 같은 장점을 가지고 있다.
- 코드의 재사용성을 높일 수 있다.
- 코드의 유지보수를 쉽게 할 수 있다.
- 클래스 계층 구조를 단순화할 수 있다.
--------------------------------------------------------------------------
Goods.java (부모 클래스)
package oop.goods;
// 부모(상속을 해줄 부모)
public class Goods {
// 멤버변수
// 멤버변수에 private을 쓰고 싶을 땐 output할 때 get함수를 붙여주면 됨.
private String name, price;
private int goodsNo;
// 기본 생성자함수
public Goods() {
}
// 생성자함수 오버로딩
public Goods(String name, String price, int goodsNo) {
this.name = name;
this.goodsNo = goodsNo;
this.price = price;
}
// setter & getter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGoodsNo() {
return goodsNo;
}
public void setGoodsNo(int goodsNo) {
this.goodsNo = goodsNo;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
// output()
public void output() {}
}
ElectGoods.java (자식 클래스)
package oop.goods;
public class ElectGoods extends Goods {
// 멤버변수
String birthDate, capacity;
// 기본 생성자함수
public ElectGoods() {
}
// 생성자함수 오버로딩
public ElectGoods (String name, String price, int goodsNo, String birthDate, String capacity) {
super(price, name, goodsNo);
this.birthDate = birthDate;
this.capacity = capacity;
}
public String getBirthDate() {
return birthDate;
}
public void setBirthDate(String birthDate) {
this.birthDate = birthDate;
}
public String getCapacity() {
return capacity;
}
public void setCapacity(String capacity) {
this.capacity = capacity;
}
// output() : 부모의 메소드를 재정의(=오버라이딩)
public void output() {
System.out.println("<<전자제품>>");
System.out.println("상품코드: " + getGoodsNo() + "상품명: "+ getName() + "단가: " + getPrice());
System.out.println("출시날짜: " + birthDate + "용량: " + capacity);
System.out.println("----------------------------------------");
}
}
Books.java (자식 클래스)
package oop.goods;
public class Books extends Goods {
// 멤버변수
String birthDate, writer;
int pageSize;
// 기본 생성자함수
public Books() {
}
// 생성자함수 오버로딩
public Books (String name, String price, int goodsNo, String birthDate, String writer, int pageSize) {
super(name, price, goodsNo);
this.birthDate = birthDate;
this.writer = writer;
this.pageSize = pageSize;
}
public String getBirthDate() {
return birthDate;
}
public void setBirthDate(String birthDate) {
this.birthDate = birthDate;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
// output() : 부모의 메소드를 재정의(=오버라이딩)
public void output() {
System.out.println("<<책>>");
System.out.println("상품코드: " + getGoodsNo() + "상품명: "+ getName() + "단가: " + getPrice());
System.out.println("작가: " + writer + "출시날짜: "+ birthDate + "페이지수: " + pageSize);
System.out.println("----------------------------------------");
}
}
GoodsHandler.java (핸들러)
package oop.goods;
import java.util.Scanner;
public class GoodsHandler {
private Goods [] goods; // 상품들 저장 배열 객체 변수
private int numOfGoods; // 상품 배열 크기 증가 변수
// 기본 생성자함수
public GoodsHandler(int num) {
goods = new Goods[num]; // 선언된 크기의 배열 생성
numOfGoods = 0; // 실행할 때 마다
}
// 상품 배열에 단일 상품 추가하는 메소드 (가장 중요!)
void addGoods(Goods g) { // 상품객체 주소를 넘겨주면 배열에 추가
goods[numOfGoods++] = g;
}
public void addGoodsInfo(int choice) { // 각 상품정보를 입력받아서 상품객체를 생성하여 넘겨주는 메소드
int pageSize, price;
String goodsNo, name, birthDate, writer, capacity;
Scanner sc = new Scanner(System.in);
System.out.print("상품코드: "); goodsNo = sc.nextLine();
System.out.print("상품명: "); name = sc.nextLine();
System.out.print("상품단가: "); price = Integer.parseInt(sc.nextLine());
if (choice == 1) { // 전자제품이라면
System.out.print("상품출시일: "); birthDate = sc.nextLine();
System.out.print("사양: "); capacity = sc.nextLine();
addGoods(new ElectGoods(name, goodsNo, price, birthDate, capacity));
} else { // 도서상품 이라면
System.out.print("출시날짜: "); birthDate = sc.nextLine();
System.out.print("작가: "); writer = sc.nextLine();
System.out.print("페이지수: "); pageSize = sc.nextInt();
addGoods(new Books(name, goodsNo, price, birthDate, writer, pageSize));
}
}
}
GoodsMain.java (메인)
package oop.goods;
import java.util.Scanner;
public class GoodsMain {
public static void main(String[] args) {
GoodsHandler handler = new GoodsHandler(3);
while(true) {
System.out.println("메뉴선택");
System.out.println("1. 전자제품 정보 입력");
System.out.println("2. 도서 정보 입력");
System.out.println("3. 상품 정보 목록 출력");
System.out.println("4. 프로그램 종료");
System.out.print("선택>>");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch(choice) {
case 1 : case 2 :
handler.addGoodsInfo(choice);
break;
case 4:
System.out.println("프로그램을 종료합니다.");
return;
}
}
}
}
// 출력





'JAVA' 카테고리의 다른 글
<JAVA_231206수> Eclipse 프로그램 설치 (2) | 2023.12.06 |
---|---|
<JAVA_PreClass_231024화> (2) | 2023.10.24 |
<JAVA_PreClass_231020금> (2) | 2023.10.20 |
<JAVA_PreClass_231019목> (0) | 2023.10.19 |
<JAVA_PreClass_231018수> (2) | 2023.10.18 |