JAVA

<JAVA_PreClass_231023월>

Technoqueen_X 2023. 10. 23. 14:39
728x90
반응형

<오버라이딩> - 엄청나게 중요!

 

오버라이딩은 부모 클래스로부터 상속받은 메소드의 내용을 자식 클래스에서 재정의하는 것.

 

아래와 같이 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;
			}
		}

	}

}

 

// 출력

 

728x90
반응형

'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