# 상속
l 상속
- 상속(Inheritance)이란 말 그대로 '부모의 유산을 물려받다' 란 뜻으로써 상속을 통해 기존에 있던 클래스(부모 클래스)를 이용하여 새로운 클래스를 만드는 것을 의미합니다.
- 상속을 통해 적은 양의 코드로 새로운 클래스를 만들어 낼 수 있습니다.
l 상속의 특징
- 다중 상속이 불가능 하고 2개 이상의 클래스를 상속할 수 없습니다.
- 부모 클래스가 가진 변수와 메소드를 모두 상속받습니다.
- 부모 클래스 에서 멤버 변수, 메소드가 private로 선언하면 접근이 불가능하며, 메소드는 상속 되지 않는다.
- static 메소드와 변수도 상속이 된다.
- 동일한 이름의 변수가 부모 클래스와 자식 클래스에 둘 다 존재할 경우 부모 클래스의 변수는 가려진다.
l 클래스 기반의 프로그래밍 장점
- 스펙변경에 대한 요구사항이 들어왔을 때 변경해야 할 코딩이 줄어든다
- 상속을 이용해서 중복된 코드를 줄일 수 있다
상속 예제 | |
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에게 상속을 받았기 때문이다 | |
결과값 | 야옹 |
l 클래스와 객체
l 클래스를 설계할 때 고려할 2가지 사항
1. 변수 (객채에서 아는 것)
2. 메소드 (객체에서 하는 것)
n 클래스와 객체 생성 방법
클래스 생성 | |
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(); } } - d 라는 객체를 생성하여 객체 변수와 객체 메소드를 수행할 수 있다 | |
결과값 | 멍 ! 멍! |
l 사과장수와 나와의 사과 판매작업 시뮬레이션
사과장수 클래스 | 나 클래스 | 사과판매 테스트 클래스 |
데이터 : 사과 | 데이터 : 돈 | 사과를 사고 파는 메인 메소드 |
매소드 : 사과판매 | 메소드 : 사과구매 |
|
메소드 : 판매현황 | 메소드 : 지출현황 |
|
사과장수가 판매 과정을 상속 클래스로 표현 | |
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 seller, int 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(seller, AppleNum);
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 |