본문 바로가기

빅데이터과정/JAVA

#52_140827_JAVA_상속

728x90

# 상속


 

상속

상속(Inheritance)이란 말 그대로 '부모의 유산을 물려받다란 뜻으로써 상속을 통해 기존에 있던 클래스(부모 클래스)를 이용하여 새로운 클래스를 만드는 것을 의미합니다.

상속을 통해 적은 양의 코드로 새로운 클래스를 만들어 낼 수 있습니다.

 

 

 

상속의 특징

다중 상속이 불가능 하고 2개 이상의 클래스를 상속할 수 없습니다.

부모 클래스가 가진 변수와 메소드를 모두 상속받습니다.

부모 클래스 에서 멤버 변수메소드가 private로 선언하면 접근이 불가능하며메소드는 상속 되지 않는다.

static 메소드와 변수도 상속이 된다.

동일한 이름의 변수가 부모 클래스와 자식 클래스에 둘 다 존재할 경우 부모 클래스의 변수는 가려진다.

 

 

 

클래스 기반의 프로그래밍 장점

스펙변경에 대한 요구사항이 들어왔을 때 변경해야 할 코딩이 줄어든다

상속을 이용해서 중복된 코드를 줄일 수 있다

 


 

 

상속 예제

class momcat {

      public void print() {

            System.out.println("야옹");

      }

}

 

class babycat extends momcat {

}

 

class Animal {

      public static void main(String[] args) {

            babycat c = new babycat();

            c.print();

      }

}

 

babycat momcat에서 상속받은 상태에서 babycat c라는 객체를 선언하여 print() 메소드를 수행한 결과 야옹이라는 결과를 출력하는 것을   있다

이것은 babycat momcat에게 상속을 받았기 때문이다

결과값

야옹

 

 






 

클래스와 객체

 

클래스를 설계할 때 고려할 2가지 사항

1.    변수 (객채에서 아는 것)

2.    메소드 (객체에서 하는 것)

 

 


 

클래스와 객체 생성 방법

클래스 생성

class Dog {

      int size;

      String breed;

      String name;

 

      void bark() {

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

      }

}

수행할 변수와 메소드를 고려하여 위처럼 Dog 라는 클래스를 생성한다

객체를 만들고 그 객체의 변수와 메소드를 사용

class DogTestDrive {

      public static void main(String[] args) {

            Dog d = new Dog();

            d.size = 40;

            d.bark();

      }

}

라는 객체를 생성하여 객체 변수와 객체 메소드를 수행할 수 있다

결과값

 !  !

 

 




 

사과장수와 나와의 사과 판매작업 시뮬레이션

사과장수 클래스

나 클래스

사과판매 테스트 클래스

데이터 사과

데이터 

사과를 사고 파는 메인 메소드

매소드 : 사과판매

메소드 사과구매

 

메소드 판매현황

메소드 지출현황

 

 

사과장수가 판매 과정을 상속 클래스로 표현

import java.util.Scanner;

 

class FruitSeller {

      int numOfApple = 20;

      int myMoney = 0;

      final int APPLE_PRICE = 1000;

      //fianl 변수는 한번 지정되면 변경 불가

     

      public int saleApple(int money) {

            int num = money / APPLE_PRICE;

            numOfApple -= num;

            myMoney += money;

            return num;

      }

 

      public void showSaleResult() {

            System.out.println("남은 사과: " + numOfApple);

            System.out.println("판매 수익: " + myMoney);

      }

}

 

class FruitBuyer {

      int myMoney = 5000;

      int numOfApple = 0;

 

      public void buyApple(FruitSeller sellerint money) {

      //seller 라는 매개변수 생성

            numOfApple += seller.saleApple(money);

            myMoney -= money;

      }

     

      public void AppleOut() {

            System.out.println("여기 있습니다사과" + numOfApple + "");

      }

     

      public void showBuyResult() {

            System.out.println("현재 잔액: " + myMoney);

            System.out.println("사과 개수: " + numOfApple);

      }

 

}

 

class FruitSalesMain1 {

      public static void main(String[] args) {

            System.out.print("사과 얼마치 드릴까요? ");

            Scanner keyboard = new Scanner(System.in);

            int AppleNum = keyboard.nextInt();

           

            FruitSeller seller = new FruitSeller();

            FruitBuyer buyer = new FruitBuyer();

            buyer.buyApple(sellerAppleNum);

 

            buyer.AppleOut();

           

            System.out.println("과일 판매자의 현재 상황");

            seller.showSaleResult();

 

            System.out.println("과일 구매자의 현재 상황");

            buyer.showBuyResult();      

      }

}

결과값

사과 얼마치 드릴까요3000

여기 있습니다사과3

과일 판매자의 현재 상황

남은 사과: 17

판매 수익: 3000

과일 구매자의 현재 상황

현재 잔액: 2000

사과 개수: 3

 

 

사과장수 판매 과정에서 판매자가 늘어날 경우

package bigdata;

 

class FruitSeller {

      int numOfApple;

      int myMoney;

      int APPLE_PRICE;

 

      public int saleApple(int money) {

            int num = money / APPLE_PRICE;

            numOfApple -= num;

            myMoney += money;

            return num;

      }

 

      public void showSaleResult() {

            System.out.println("남은 사과: " + numOfApple);

            System.out.println("판매 수익: " + myMoney);

      }

 

      public void initMembers(int money, int appleNum, int price) {

            myMoney = money;

            numOfApple = appleNum;

            APPLE_PRICE = price;

      }

}

 

class FruitBuyer {

      int myMoney = 10000; // 여기서도 클래스의 변경이 발생!

      int numOfApple = 0;

 

      public void buyApple(FruitSeller seller, int money) {

            numOfApple += seller.saleApple(money);

            myMoney -= money;

      }

 

      public void showBuyResult() {

            System.out.println("현재 잔액: " + myMoney);

            System.out.println("사과 개수: " + numOfApple);

      }

}

 

 

class FruitSalesMain1 {

      public static void main(String[] args) {

            FruitSeller seller1 = new FruitSeller();

            seller1.initMembers(0, 30, 1500);

            //seller1 잔돈 0원과 사과 30 사과한개 가격이 1500원으로 초기화

           

            FruitSeller seller2 = new FruitSeller();

            seller2.initMembers(0, 20, 1000);

 

            FruitBuyer buyer = new FruitBuyer();

            buyer.buyApple(seller1, 4500);

            //seller1에게 사과 4500원어치를 구매

            buyer.buyApple(seller2, 2000);

           

            System.out.println("과일 판매자1 현재 상황");

            seller1.showSaleResult();

 

            System.out.println("과일 판매자2 현재 상황");

            seller2.showSaleResult();

 

            System.out.println("과일 구매자의 현재 상황");

            buyer.showBuyResult();

      }

}

 

l 위 코드의 문제점

- 객채를 생성하고 나서 초기화를 해줘야 하기 때문에 코드가 늘어난다

- 만약에 사과가격을 상수로 선언해서 결정을 하면 나중에 사과 가격이 변동이 안되지만 위의 코드는 사과 가격을 나중에 초기화 해줘야하기 때문에 초기화 할 때 실수를 범할 수 있다

 

결과값

과일 판매자1 현재 상황

남은 사과: 27

판매 수익: 4500

과일 판매자2 현재 상황

남은 사과: 18

판매 수익: 2000

과일 구매자의 현재 상황

현재 잔액: 3500

사과 개수: 5


 

위 문제점을 극복하기 위해서는 아래와 같이 생성자를 생성한다

- 아래처럼 생성자를 이용해 초기화가 가능하다

FruitSeller seller1 = new FruitSeller(0,30,1500);

FruitSeller seller1 = new FruitSeller(0,20,1000);

 

class FruitSeller {

      int numOfApple;

      int myMoney;

      final int APPLE_PRICE;

 

     public FruitSeller(int money, int appleNum, int price) {

           myMoney = money;

           numOfApple = appleNum;

           APPLE_PRICE = price;

     }

      // 생성자 이름은 클래스 이름과 같아야 한다

      public int saleApple(int money) {

            int num = money / APPLE_PRICE;

            numOfApple -= num;

            myMoney += money;

            return num;

      }

 

      public void showSaleResult() {

            System.out.println("남은 사과: " + numOfApple);

            System.out.println("판매 수익: " + myMoney);

      }

}

 

class FruitBuyer {

      int myMoney;

      int numOfApple;

 

      public FruitBuyer(int money) {

            myMoney = money;

            numOfApple = 0;

      }

 

      public void buyApple(FruitSeller seller, int money) {

            numOfApple += seller.saleApple(money);

            myMoney -= money;

      }

 

      public void showBuyResult() {

            System.out.println("현재 잔액: " + myMoney);

            System.out.println("사과 개수: " + numOfApple);

      }

}

 

class FruitSalesMain3 {

      public static void main(String[] args) {

           FruitSeller seller1 = new FruitSeller(0, 30, 1500);

           FruitSeller seller2 = new FruitSeller(0, 20, 1000);

 

            FruitBuyer buyer = new FruitBuyer(10000);

            buyer.buyApple(seller1, 4500);

            buyer.buyApple(seller2, 2000);

 

            System.out.println("과일 판매자1 현재 상황");

            seller1.showSaleResult();

 

            System.out.println("과일 판매자2 현재 상황");

            seller2.showSaleResult();

 

            System.out.println("과일 구매자의 현재 상황");

            buyer.showBuyResult();

      }

}

결과값

과일 판매자1 현재 상황

남은 사과: 27

판매 수익: 4500

과일 판매자2 현재 상황

남은 사과: 18

판매 수익: 2000

과일 구매자의 현재 상황

현재 잔액: 3500

사과 개수: 5

 

 


'빅데이터과정 > JAVA' 카테고리의 다른 글

#54_140828_접근제어 지시자  (0) 2014.08.28
#54_140828_JAVA_클래스 패스  (0) 2014.08.28
#52_140827_JAVA_메소드  (0) 2014.08.27
#52_140827_JAVA_LOOP  (1) 2014.08.27
#52_140827_JAVA_조건문  (0) 2014.08.27