<추상클래스, 추상메소드>
- 추상클래스 abstract <<ab>> 기울어진 이탤릭채
- 추상메소드
추상 클래스는 미완성 설계도라고 할 수 있다.
추상 클래스는 추상 메소드를 포함하고 있으며, 추상 메소드는 구현부가 없는 메소드.
따라서 추상 클래스는 인스턴스를 생성할 수 없으며, 상속을 통해 자식 클래스에 의해 완성되어야 함.
추상 클래스는
- 공통의 기능을 정의하고, 이를 상속받는 자식 클래스에서 구현하도록 한다.
- 다형성을 구현한다.
- 코드의 재사용성을 높인다.
추상 클래스를 선언 하려면 abstract 키워드를 클래스 선언부에 추가.
abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
Animal 클래스는 eat()과 sleep()이라는 두 개의 추상 메소드를 포함하고 있음.
따라서 Animal 클래스는 인스턴스를 생성할 수 없다.
추상 클래스를 상속하려면 extends 키워드를 사용하여 자식 클래스에서 상속받을 추상 클래스를 지정한다.
그리고 자식 클래스에서 추상 메소드를 구현해야 함.
예를 들어, Animal 클래스를 상속하는 Dog 클래스를 만들어 보면,
class Dog extends Animal {
// Override
public void eat() {
System.out.println("Dog is eating.");
}
// Override
public void sleep() {
System.out.println("Dog is sleeping.");
}
}
Dog 클래스는 Animal 클래스의 eat()과 sleep() 메소드를 구현하고 있음.
따라서 Dog 클래스는 인스턴스를 생성할 수 있다.
- 추상 클래스는 인스턴스를 생성할 수 없다.
- 추상 클래스는 추상 메소드를 포함할 수 있다.
- 추상 클래스는 상속을 통해 자식 클래스에 의해 완성되어야 한다.
- 추상 클래스는 다형성을 구현하는 데 사용될 수 있다.
- 추상 클래스는 코드의 재사용성을 높인다.
추상 클래스는 객체 지향 프로그래밍에서 중요한 개념으로,
추상 클래스를 잘 활용하면 코드의 구조를 명확하게 하고, 코드의 재사용성을 높일 수 있다.
--------------------------------------------------------------------------
<인터페이스>
- 추상메소드
- 상수형변수 (값을 저장, 모든문자 대문자, final이 앞에 붙어 있으면 변경 불가)
- 다형성의 꽃
- 껍데기만 만들어놓을테니 너네가 가져다 알아서 입맛에 맞게 써! (구현)
- 100% 배포용
- 인터페이스도 부모클래스라고 생각할 수 있다. (하지만 멤버변수는 없다는 거.)
인터페이스는 객체 지향 프로그래밍에서 추상화의 한 형태.
인터페이스는 객체가 제공해야 하는 기능을 정의한 것으로, 객체가 어떻게 구현되는지는 중요하지 않다.
인터페이스는 다음과 같은 목적으로 사용된다.
- 객체의 기능을 정의.
- 객체의 구현을 분리.
- 다형성을 구현.
- 코드의 재사용성을 높임.
Java에서 인터페이스는 interface 키워드를 사용하여 선언함.
인터페이스는 추상 메소드와 상수를 포함할 수 있다.
인터페이스를 구현하려면 implements 키워드를 사용하여 클래스 선언부에 인터페이스를 지정.
그리고 클래스에서 인터페이스에서 정의한 메소드를 모두 구현해야 함.
interface Drawable {
void draw();
}
Drawable 인터페이스는 draw()라는 추상 메소드를 포함하고 있음.
Drawable 인터페이스를 구현하는 클래스는 draw() 메소드를 구현해야 함.
예를 들어, Drawable 인터페이스를 구현하는 Circle 클래스를 만들어 보면,
class Circle implements Drawable {
// Override
public void draw() {
System.out.println("Circle is drawing.");
}
}
Circle 클래스는 Drawable 인터페이스를 구현하고 있다.
따라서 Circle 클래스는 draw() 메서드를 구현해야 함.
- 인터페이스는 인스턴스를 생성할 수 없다.
- 인터페이스는 추상 메소드와 상수를 포함할 수 있다.
- 인터페이스는 객체의 기능을 정의하는 데 사용된다.
- 인터페이스는 객체의 구현을 분리하는 데 사용된다.
- 인터페이스는 다형성을 구현하는 데 사용된다.
- 인터페이스는 코드의 재사용성을 높이는 데 사용된다.
인터페이스 또한 객체 지향 프로그래밍에서 중요한 개념으로,
인터페이스를 잘 활용하면 코드의 구조를 명확하게 하고, 코드의 재사용성을 높일 수 있다.
--------------------------------------------------------------------------
Goods.java (부모 클래스)
package oop.goods;
// 부모(상속을 해줄 부모)
abstract public class Goods { // 추상클래스 정의 : abstract (자식들에게 물려줄 공통정보 제공)
// 멤버변수
// 멤버변수에 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()
abstract public void output(); // 추상(abstract)을 붙이면 바디가 없으므로 {} 지워주기.
}
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));
}
}
// 상품정보를 출력하는 상품배열객체 출력 메소드
public void allGoodsOutput() {
for(int i=0; i<goods.length; i++) {
goods[i].output();
}
}
}
GoodsMain.java (메인)
package oop.goods;
import java.util.Scanner;
public class GoodsMain {
public static void main(String[] args) {
GoodsHandler handler = new GoodsHandler(2);
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 3 :
handler.allGoodsOutput();
break;
case 4:
System.out.println("프로그램을 종료합니다.");
return;
}
}
}
}
// 출력







'JAVA' 카테고리의 다른 글
<JAVA_231207목> datatype, 연산자, for문, while/do-while/case/if 조건문 (4) | 2023.12.07 |
---|---|
<JAVA_231206수> Eclipse 프로그램 설치 (2) | 2023.12.06 |
<JAVA_PreClass_231023월> (2) | 2023.10.23 |
<JAVA_PreClass_231020금> (2) | 2023.10.20 |
<JAVA_PreClass_231019목> (0) | 2023.10.19 |