Backend/JAVA

JAVA 객체지향 프로그래밍 OOP, Class 상속 - 부모클래스, 자식클래스

쏠솔랄라 2023. 2. 27. 15:11

 


JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드
https://developernew.tistory.com/21

 

JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드

객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체 중심의 프로그래밍 방식 객체끼리의 상호 작용을 통하여 프로그램을 작성하는 방식 부품화 캡슐화 == 클래스 속성과 기능을 하나의 캡슐처

developernew.tistory.com

 


JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, static
https://developernew.tistory.com/22

 

JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, static

자바 클래스 기본개념 및 기본예제 https://developernew.tistory.com/21 JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드 객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체 중심의 프로그래

developernew.tistory.com

 


JAVA 코딩 객체지향프로그래밍 OOP, Class 중첩클래스 
https://developernew.tistory.com/24

 

JAVA 코딩 객체지향프로그래밍 OOP, Class 중첩클래스 - 일반중첩클래스, static중첩클래스, 지역중첩

JAVA 객체지향 프로그래밍 OOP, Class 기본개념 및 예제 https://developernew.tistory.com/21 JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드 객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체

developernew.tistory.com

 


JAVA 코딩 객체지향프로그래밍 OOP, 배열 클래스 Array Class
https://developernew.tistory.com/25

 

JAVA 코딩 객체지향프로그래밍 OOP, 배열 클래스 Array Class

JAVA 객체지향 프로그래밍 OOP, Class 기본개념 및 예제 https://developernew.tistory.com/21 JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드 객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체

developernew.tistory.com

 


JAVA 코딩 Class 클래스 다형성
https://developernew.tistory.com/26

 

JAVA 코딩 Class 클래스 다형성

다형성 : 다양한 형태나 성질 하나의 객체를 여러개의 클래스로 표현하는 것을 말한다 상속이 기본 클래스를 기능별로 분리하여 통합적인 처리를 하기 위해 사용된다 ; 다중상속 업캐스팅을 바

developernew.tistory.com

 

 


 

 

상속

 

: 클래스끼리 물려주거나 물려받는 것


물려준 클래스(부모클래스,super)의 속성과 기능을 물려받는 클래스(자식클래스,sub)에서 사용이 가능하도록 만들고

추가적인 표현을 통하여 새로운 클래스를 만드는 문법
클래스의 재사용(재활용)
프로그램의 유연성(추가 수정 삭제...)을 증대 시키기위해서 사용
 


상속시 주의 사항
1. 아무리 자식이더라도 부모의 private 멤버는 접근 불가
2. 자식클래스에서 부모클래스를 명시
3. extends를 통하여 클래스 상속을 받는다 ; 1개
   

 

형식

class 자식클래스 extends 부모클래스명 {
    클래스 정의
   }

 

ex.

 

// Parents class

public class Parents {

public void info() {

System.out.println("내가 자식이다");

}

}

 

// Children class

public class Children extends Parents {

public void disp() {

System.out.println("내가 부모다");

}

}

 

// Main class

public class Main {

public static void main(String[] args) {

Children j = new Children();

 

j.disp();

j.info();

}

}

 

 

출력화면

 

 


 

 

Exercise 1

 

 

// Info class

public class Info {

//멤버 변수

private String name;

private int age;

 

//멤버 메소드

 

//생성자

//디폴트 생성자

public Info() {

System.out.println("부모 디폴트 생성자 호출");

}

 

public Info(String name) {

this.name = name;

this.age = 1;

}

 

public Info(int age) {

this.age = age;

}

 

public Info(String name,int age) {

System.out.println("부모 생성자 호출");

this.name = name;

this.setAge(age);

}

 

//setter

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

if(age < 1) {

System.out.println("잘못된 나이 입력!");

this.age = 1;

return;

}

this.age = age;

}

 

//getter

public String getName() {

return name;

}

public int getAge() {

return this.age;

}

 

//user 메소드

public void setData(String name,int age) {

this.name = name;

this.setAge(age);

}

 

public void disp() {

System.out.println("이름 : " + name);

System.out.println("나이 : " + age);

}

public void disp(int i) {

System.out.println("[" + i + "]\t" + name + "\t" + age);

}

}

 

// NewInfo Class

 

public class NewInfo extends Info{

//멤버 변수

private double height;

 

//생성자

자식클래스에서 별다른 명시가 없으면 부모의 디폴트 생성자가 호출된다

부모의 멤버까지 초기화를 하려면 자식 생성자에서 부모의 멤버변수값까지 함께 받아주어야 한다.

명시를 통해서 부모의 생성자를 선택적으로 호출할수 있다...

 

super - 부모의 인스턴스공간을 참조하는 참조형 변수

그 외는 this와 같다...

*his - 자기 자신 super - 부모

 

public NewInfo() {

System.out.println("자식 디폴트 생성자!");

}

 

public NewInfo(String name,int age,double height) {

super(name,age);

System.out.println("자식 생성자!");

//this.name = name;

// this.setName(name);

// this.setAge(age);

this.height = height;

}

 

//getter

public double getHeight(){

return height;

}

 

//setter

public void setHeight(double height) {

this.height = height;

this.getHeight();

}

 

public void disp() {

super.disp();

// System.out.println("이름 : " + getName());

// System.out.println("나이 : " + getAge());

System.out.println("키 : " + height);

}

 

public void disp(int i) {

System.out.println("[" + i + "]\t" + getName() + "\t" + getAge() + "\t" + height);

}

}

// Main class

public class Main {

public static void main(String[] args) {

 

NewInfo in = new NewInfo("김땡땡", 20, 182.4);

 

in.disp();

in.disp(1);

 

}

}

 

출력화면

 

 


 

 

Exercise 2

 

MobileEx class
기존에 Mobile이라는 클래스를 사용하여 휴대전화 정보를 관리
세월이 지나 항목들이 추가되어
Mobile이라는 클래스는 건드리지 않고 상속을 이용하여 추가된 항목까지 저장하고 싶음
이름은 MobileEx로 생성

(추가된 항목)
제휴카드(card) 수시로 설정 / 확인 가능
약정기간(month) 휴대폰 약정기간(월)

Main class
(아래의 객체를 생성한 뒤 정보 출력)
name telecom price card month
[1] 아이폰7 KT 90만원 국민카드 24개월
[2] 갤럭시7 SK 30만원 신한카드 30개월
[3] G6 LG 35만원 삼성카드 36개월

 

// Mobile class - 이전 데이터 끌어오기

public class Mobile {

// [문제] oop.mobile02 패키지에 구현

// Main.java main()을 가지는 클래스

// Mobile 휴대전화 클래스

// 단순히 만드는 것에 그치지 말고, 안정성을 높이기 위해 다음과 같이 강제 구현

// [1] 이름은 한번 설정하면 절대로 변경할 수 없습니다 - final

// [2] 가격은 아무리 싸게 설정해도 40만원 미만은 불가능합니다

// 20만원으로 설정시 40만원으로 설정되도록

// [3] 통신사나 가격 등은 계속 변경 설정이 가능하도록

 

private final String name;

private String tel;

private int price;

 

public Mobile(String name) {

this.name = name;

this.price = 400000;

}

 

public Mobile(String name,String tel,int price) {

this.name = name;

this.tel = tel;

this.setPrice(price);

}

 

//setter

public void setTel(String tel) {

this.tel = tel;

}

 

public void setPrice(int price) {

if(price <= 400000) {

this.price = 400000;

return;

}

this.price = price;

}

 

//getter

public String getName() {

return name;

}

public String getTel() {

return tel;

}

public int getPrice() {

return price;

}

 

//user 메소드

public void disp() {

System.out.println("모델명 : " + this.name);

System.out.println("통신사 : " + this.tel);

System.out.println("가격 : " + this.price + "원");

}

 

public void disp(int i) {

System.out.println("[" + i + "]\t" + name + "\t" + tel + "\t" + price + "원");

}

 

public static void compare(Mobile m1,Mobile m2) {

if(m1.price < m2.price) {

System.out.println(m2.name);

}else if(m1.price > m2.price) {

System.out.println(m1.name);

}else {

System.out.println("같다");

}

}

 

public void compare(Mobile m) {

if(this.price < m.price) {

System.out.println(m.name);

}else if(this.price > m.price) {

System.out.println(this.name);

}else {

System.out.println("같다");

}

}

 

public static void arrDisp(Mobile[] arr) {

for(int i = 0; i < arr.length; i++) {

arr[i].disp(i + 1);

}

}

}

 

 

 // (Mobile class를 상속하는) MobileEx class

public class MobileEx extends Mobile{

// 기존에 Mobile이라는 클래스를 사용하여 휴대전화 정보를

// 관리하였습니다.

// 세월이 지나서 항목들이 추가가 되었습니다.

// Mobile이라는 클래스는 건드리지 않고 상속을 이용하여 추가된

// 항목까지 저장하게 만들고 싶습니다.

// 이름은 MobileEx로 생성

// (추가된 항목) 제휴카드(card) 수시로 설정 / 확인 가능

// 약정기간(month) 휴대폰 약정기간(월)

private String card;

private int month;

 

public MobileEx(String name,String tel,int price,String card,int month) {

super(name,tel,price);

this.card = card;

this.month = month;

}

 

public void setCard(String card) {

this.card = card;

}

 

public String getCard() {

return card;

}

 

public int getMonth() {

return month;

}

 

public void disp() {

super.disp();

System.out.println("제휴카드 : " + card);

System.out.println("약정기간 : " + month + "개월");

}

 

public void disp(int i) {

System.out.println("[" + i + "]\t" + getName() + "\t" + getTel() + "\t" + getPrice() + "원\t" + card + "\t" + month + "개월");

}

}

 

// Main class

import java.util.ArrayList;

public class Main {

public static void main(String[] args) {

 

// (아래의 객체를 생성한 뒤 정보 출력)

// name telecom price card month

// [1] 아이폰7 KT 90만원 국민카드 24개월

// [2] 갤럭시7 SK 30만원 신한카드 30개월

// [3] G6 LG 35만원 삼성카드 36개월

 

MobileEx m1 = new MobileEx("아이폰", "KT", 900000, "국민카드", 24);

MobileEx m2 = new MobileEx("갤럭시7", "SKT", 300000, "신한카드", 30);

MobileEx m3 = new MobileEx("G6", "LGT", 350000, "삼성카드", 36);

 

m1.disp(1);

m2.disp(2);

m3.disp(3);

 

MobileEx[] arr = new MobileEx[] {m1,m2,m3};

 

Mobile.arrDisp(arr);

}

}

 

 

출력화면

 

 


 

 

Exercise 3

 

상속문제

Student class
부모클래스 직접 구현

StudentEx class
자식클래스 구현
저희 학원은 자바, C언어만 강의를 하고 있었습니다
장사가 너무 잘되서 파이썬 과목을 추가하기로 결정하였고
관리 프로그램 클래스도 개량하여 사용하기로 하였습니다
(StudentEx 클래스) //

(추가된 항목)
파이썬(python) 파이썬 과목 점수
(합계, 평균 등이 제대로 나오도록 아래의 객체를 생성 후 정보 출력)
name java c python
[1] 엑스맨 80 85 90
[2] 배트맨 90 85 80
[3] 슈퍼맨 100 20 25

 

// Student class

public class Student {

/*

Student class 구현 항목

name java c 합계 평균

[1] 엑스맨 80 85

[2] 배트맨 90 85

[3] 슈퍼맨 100 20

=================================================

총계

*/

 

private String name;

private int java, c;

protected int tot;

protected double avg;

 

public Student (String name, int java, int c) {

this.name=name;

this.setJava(java);

this.setC(c);

}

 

// setter

 

public void setName (String name) {

this.name=name;

}

 

public void setJava (int java) {

this.java=java;

setTot();

setAvg();

}

 

public void setC (int c) {

this.c=c;

setTot();

setAvg();

}

 

public void setTot () {

this.tot = java + c;

}

 

public void setAvg () {

this.avg = tot / 2.0;

}

 

// getter

 

public String getName () {

return name;

}

 

public int getJava () {

return java;

}

 

public int getC () {

return c;

}

 

public int getTot () {

return tot;

}

 

public double getAvg () {

return avg;

}

 

// user method

 

public void disp() {

System.out.println(name + "님의 성적정보");

System.out.println("java : " + java + "점");

System.out.println("c : " + c + "점");

System.out.println("------------------------");

System.out.println("총점 : " + tot + "점");

System.out.println("평균 : " + avg + "점");

}

}

 

// Student class를 상속한 StudentEX class

public class StudentEX extends Student {

/*

(StudentEx 클래스)

(추가된 항목) 파이썬(python) 파이썬 과목 점수

*/

private int python;

 

public StudentEX (String name, int java, int c, int python) {

super(name, java, c);

setPython(python);

}

 

// setter

 

public void setPython (int python) {

this.python=python;

this.setTot();

this.setAvg();

}

 

public void setTot () {

this.tot = getJava() + getC() + python;

}

 

public void setAvg () {

avg = tot / 3.0;

}

 

// getter

 

public String getName () {

return getName();

}

 

public int java () {

return getJava();

}

 

public int c () {

return getC ();

}

 

public int getPython () {

return python;

}

 

// user method

 

public void disp () {

System.out.println(super.getName() + "님의 성적정보");

System.out.println("java : " + getJava() + "점");

System.out.println("c : " + getC() + "점");

System.out.println("python : " + python + "점");

System.out.println("------------------------");

System.out.println("총점 : " + tot + "점");

System.out.println("평균 : " + avg + "점");

}

}

 

// Main class

public class Main {

/*

(합계, 평균 등이 제대로 나오도록 아래의 객체를 생성 후 정보 출력)

name java c python 총점 평균

[1] 엑스맨 80 85 90

[2] 배트맨 90 85 80

[3] 슈퍼맨 100 20 25

==============================================

합계

*/

 

public static void main (String[] args) {

 

StudentEX s1 = new StudentEX("엑스맨", 80, 85, 90);

StudentEX s2 = new StudentEX("베트맨", 90, 85, 80);

StudentEX s3 = new StudentEX("슈퍼맨", 100, 20, 25);

 

s1.disp();

System.out.println("============================");

s2.disp();

System.out.println("============================");

s3.disp();

}

}

 

 

출력화면

 

 


 

 

Exercise 4

 

일반 클래스문제
public class Main { //구성 클래스 //

VendingMachine - 자판기 관리 클래스 //
Menu - 메뉴 관리 클래스 //
Controller - 프로그램 관리하는 클래스 //
Main - 프로그램 실행 클래스

각 클래스별로 Main에서 작동하도록 구현

메뉴 관리 - 이름,가격 1.메뉴 추가 2. 메뉴 삭제 3.가격 수정
자판기 - 메뉴리스트, 투입금액 , 총 판매금액 1.메뉴 선택 2.반환 3. 총 판매
 
 
// Main class 일반 클래스문제
public class Main {
 
 
    public static void main(String[] args) {
        //코드 한줄
        new Controller();
    }
}


 
// Controller class
 
import java.util.Scanner;

public class Controller {

    private final Scanner sc = new Scanner(System.in);
    private VendingMachine vm = new VendingMachine();
   
    public Controller() {
        vm.addMenu(new Menu("커피", 200));
        vm.addMenu(new Menu("율무차", 250));
        vm.addMenu(new Menu("코코아", 250));
        menu();
    }
   
    private void menu() {
        while(true) {
            System.out.print("1. 메뉴 관리 2. 자판기 관리 3.종료\n입력 : ");
            int select = sc.nextInt();
           
            switch(select) {
            case 1:
                menuManage();
                break;
            case 2:
                VMManage();
                break;
            case 3:
                System.out.println("프로그램이 종료 됩니다.");
                sc.close();
                System.exit(0);
            default:
                System.out.println("잘못된 선택!");
            }
        }
    }
    private void menuManage() {
        while(true) {
            System.out.print("1.메뉴입력 2.메뉴삭제 3.메뉴수정 4.메뉴출력 5.이전메뉴\n입력 : ");
            int select = sc.nextInt();
           
            switch(select) {
            case 1:
                menuInput();
                break;
            case 2:
                menuRemove();
                break;
            case 3:
                menuUpdate();
                break;
            case 4:
                vm.listDisp();
                break;
            case 5:
                return;
            default:
                System.out.println("잘못된 선택!");
            }
        }
    }
   
    private void menuUpdate() {
        vm.listDisp();
        int su = numInput("수정할");
        int price = priceInput("수정할 가격");
        vm.updateMenu(su,price);
        System.out.println("수정 완료!");
    }

    private void menuInput() {
        System.out.print("이름 입력 : ");
        String name = sc.next();
       
        int price = priceInput("가격");
       
        boolean check = vm.addMenu(new Menu(name, price));
       
        if(check) {
            System.out.println("추가 성공!");
        }else {
            System.out.println("입력 실패!");
        }
    }
   
    private int priceInput(String msg) {
        int price = 0;
        do {
            System.out.print(msg + "입력 : ");
            price = sc.nextInt();
            if(price <= 0) {
                System.out.println("가격이 잘못 되었습니다.");
            }
        }while(price <= 0);
        return price;
    }

    private void menuRemove() {
        vm.listDisp();
        int su = numInput("삭제할");
        boolean check = vm.removeMenu(su);
        if(check) {
            System.out.println("삭제 성공!");
        }else {
            System.out.println("삭제할 데이터가 없습니다.");
            System.out.println("삭제 실패!");
        }
    }
   
   
    private int numInput(String msg) {
        while(true) {
            System.out.print(msg + "메뉴 번호 입력 : ");
            int su = sc.nextInt();
            if(su < 1 || su > vm.getSu()) {
                System.out.println("잘못된 번호 입력!");
            }else {
                return su;
            }
        }
    }
   
    private void VMManage() {
        vm.setAmount(priceInput("투입 금액"));
       
        while(true) {
            System.out.print("1. 메뉴 선택     \r\n" +
                    "2. 반환        \r\n" +
                    "3. 총 판매금액   \r\n" +
                    "4. 이전메뉴       \r\n" +
                    "입력 : ");
            int select = sc.nextInt();
           
            switch(select) {
            case 1:
                selectMenu();
                break;
            case 2:
                returnMoney();
                break;
            case 3:
                totalMoney();
                break;
            case 4:
                return;
            default:
                System.out.println("잘못된 선택!");
            }
        }
    }

    private void selectMenu() {
        vm.listDisp();
        int su = numInput("");
        boolean check = vm.outputMenu(su);
        if(check) {
            System.out.println(vm.menuName(su) + "가 나왔습니다.");
        }else {
            System.out.println("잔액이 부족합니다.");
        }
    }

    private void totalMoney() {
        System.out.println("총 판매금액 : " + vm.getTotal() + "원");      
    }
   
    private void returnMoney() {
        System.out.println(vm.getAmount() + "원이 반환 됩니다!");
        vm.setAmount(0);
    }   
}
 
 
// VendingMachine class
 
public class VendingMachine { //자판기 관리 클래스
   
    private Menu[] list = new Menu[10];
    private int su;//메뉴 수
    private int total; // 총 판매 금액
    private int amount; // 투입금액
   
   
    //메뉴추가
    public boolean addMenu(Menu m) {
        if(su == list.length) {
            return false;
        }
        list[su] = m;
        su++;
        return true;
    }
   
    //메뉴 보기
    public void listDisp() {
        if(su == 0) {
            System.out.println("메뉴가 없습니다.");
        }else {
            for(int i = 0; i < su; i++) {
                list[i].disp(i + 1);
            }
        }
    }

    public int getSu() {
        return su;
    }

    public boolean removeMenu(int idx) {
        if(su == 0){
            return false;
        }
        for(int i = idx - 1; i < su; i++) {
            list[i] = list[i + 1];
        }
        list[--su] = null;
        return true;
    }

    public void updateMenu(int idx, int price) {
        list[idx - 1].setPrice(price);
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }
   
    public int getAmount() {
        return amount;
    }
   
    public int getTotal() {
        return total;
    }

    public boolean outputMenu(int su) {
        if(list[su - 1].getPrice() > amount) {
            return false;
        }
       
        this.amount -= list[su - 1].getPrice();
        this.total += list[su - 1].getPrice();
        return true;
       
    }
   
    public String menuName(int su) {
        return list[su - 1].getName();
    }
   
}
 
// Menu class
 
public class Menu { //메뉴 관리 클래스
   
    private String name;
    private int price;
   
    public Menu(String name,int price) {
        this.name = name;
        this.price = price;
    }
   
    public void setPrice(int price) {
        this.price = price;
    }
   
    public String getName() {
        return name;
    }
   
    public int getPrice() {
        return price;
    }
   
    public void disp(int i) {
        System.out.println("[" + i + "]\t" + name + "\t" + price + "원");
    }

}