과일 바구니에 안객체지향 담기

MongCheol·2023년 3월 14일
0

부트캠프

목록 보기
13/15
post-thumbnail

어쩌다보니 다시 글을 적는데 한달이나 걸려버렸다.. ㅠㅠ
각설하고 객체 지향이 적용되지 않은 버전과 객체 지향이 적용 된 버전을 작성해보며 차이를 느껴보자.
먼저 객체지향을 적용하지 않은 과일 바구니를 만들어 보자.

1. 객체지향 비적용

1. 과일 클래스

먼저 과일들을 만들어 보자.
과일의 종류는 사과, 망고, 포도였다.
각각의 과일들은 이름, 색깔, 가격을 갖고있다.
그리고 이름을 출력하는 함수를 구현해 주자.

public class Apple {
	String name;
    String color;
    int price;
    
    public void printAppleName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
}
public class Mango {
	String name;
    String color;
    int price;
    
    public void printMangoName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
}
public class Grape {
	String name;
    String color;
    int price;
    
    public void printGrapeName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
}

2. 바구니 클래스

과일들을 만들어 주었고 이제 바구니를 만들어 보자.
바구니에는 사과, 망고, 포도를 담아야 하고, 과일 이름들을 출력하는 함수와
과일들의 가격 총 합을 출력해주는 함수가 있어야 한다.

public class Basket {
	Apple apple;
    Mango mango;
    grape grape;
    
    public void printNames() {
    	apple.printAppleName();
        mango.printMangoName();
        grape.printGrapeName();
    }

	public void printTotalPrice() {
    	int totalPrice = apple.price + mango.price + grape.price;
        System.out.printf("총 가격 : %d\n", totalPrice);
    }
}

3. Main 클래스

이제 과일들과 바구니를 main 클래스에서 객체를 만들고, 과일들의 이름과 가격 총 합을 출력해보자.

public class Main {
	public static void main(String[] args) {
    	Apple apple = new Apple();
        apple.name = "사과";
        apple.color = "빨강";
        apple.price = 1000;
        
        Mango mango = new Mango();
        mango.name = "망고";
        mango.color = "노랑";
        mango.price = 2000;
        
        Grape grape = new Grape();
        grape.name = "포도";
        grape.color = "보라";
        grape.price = 1500;
        
        Basket basket = new Basket();
        basket.apple = apple;
        basket.mango = mango;
        basket.grape = grape;
        
        basket.printNames();
        basket.printTotalPrice();
    }
}

4. 실행 결과

내 이름은 사과야!
내 이름은 망고야!
내 이름은 포도야!
총 가격 : 4500

요구사항에 필요한 모든것을 잘 수행하는 코드가 완성이 되었다! 와!🎉
그런데 이 코드들은 몇가지 문제가 발생할 수도 있는 코드이다.

5. 문제점

  • 값 할당 까묵
    -> 망고 객체를 만들다가 이름에 값을 할당하는 것을 깜빡하고 Main 클래스를 실행하면
public class Main {
	public static void main(String[] args) {
    	Apple apple = new Apple();
        apple.name = "사과";
        apple.color = "빨강";
        apple.price = 1000;
        
        Mango mango = new Mango();
        //mango.name = "망고";	// 망고의 이름 값 할당을 까묵
        mango.color = "노랑";
        mango.price = 2000;
        
        Grape grape = new Grape();
        grape.name = "포도";
        grape.color = "보라";
        grape.price = 1500;
        
        Basket basket = new Basket();
        basket.apple = apple;
        basket.mango = mango;
        basket.grape = grape;
        
        basket.printNames();
        basket.printTotalPrice();
    }
}

실행 결과

내 이름은 사과야!
내 이름은 null이야!
내 이름은 포도야!
총 가격 : 4500

망고의 이름이 null이 되어버렸다!😫

  • 정보 변경 실수
    -> 망고 가격을 실수로 -10000 원으로 변경했다고 하고 실행시키면
public class Main {
	public static void main(String[] args) {
    	Apple apple = new Apple();
        apple.name = "사과";
        apple.color = "빨강";
        apple.price = 1000;
        
        Mango mango = new Mango();
        mango.name = "망고";
        mango.color = "노랑";
        mango.price = 2000;
        
        Grape grape = new Grape();
        grape.name = "포도";
        grape.color = "보라";
        grape.price = 1500;
        
        Basket basket = new Basket();
        basket.apple = apple;
        basket.mango = mango;
        basket.grape = grape;
        
        mango.price = -10000;	// 실수로 망고 가격을 -10000으로 변경해버림
        
        basket.printNames();
        basket.printTotalPrice();
    }
}

실행 결과

내 이름은 사과야!
내 이름은 null이야!
내 이름은 포도야!
총 가격 : -7500

총 가격이 마이너스가 되어버렸다! 과일을 사면 돈을 드려요 😨

6. 해결 방법

  • 값 할당 까묵 -> 생성자 사용
    -> 사과, 망고, 포도 클래스에서 생성자를 만들어 주면 생성자에서 지정한 인자들을 넣어주지 않으면 객체 생성을 못하게 막아준다.
    생성자를 만들어 주어 망고의 이름이 null로 출력되는 것과 같은 문제를 막자.
public class Apple {
	String name;
    String color;
    int price;
    
    public Apple(String name, String color, int price) {
    	this.name = name;
 		this.color = color;
 		this.price = price;
    }
    
    public void printName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
}
public class Mango {
	...
}
public class Grape {
	...
}

  • 정보 변경 실수 -> set 함수 사용, private 접근 제한자 사용
    -> set 함수를 만들어주어 입력된 값을 확인하여 이상한 값이 들어가지 못하게 막아주고,
    데이터들을 private 접근 제한자로 선언하여 외부에서 데이터를 변경할 때 set 함수를 이용하도록 하면 잘못 된 값이 저장 되는 것을 막을 수 있다.
public class Apple {
	private String name;
    private String color;
    private int price;
    
    public Apple(String name, String color, int price) {
    	this.name = name;
 		this.color = color;
 		this.price = price;
        if(price < 0) {
        	this.price = 0;
        }
    }
    
    public void printAppleName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public void setPrice(int price) {
    	if(price < 0) {
        	System.out.println("가격은 음수가 될 수 없습니다.");
            return;
        }
        
        this.price = price;
    }
}
public class Mango {
	...
}
public class Grape {
	...
}

  • 각 과일들의 변수들의 접근 제한자를 default에서 private으로 변경하여서 바구니 클래스에서 만들어 둔 함수들이 제대로 작동을 하지 못한다.
    Basket 클래스에서 과일들의 변수를 가져다 쓸 수 있도록 과일들에 get 함수를 만들어주자.
public class Apple {
	private String name;
    private String color;
    private int price;
    
    public Apple(String name, String color, int price) {
    	this.name = name;
 		this.color = color;
 		this.price = price;
        if(price < 0) {
        	this.price = 0;
        }
    }
    
    public void printAppleName() {
    	System.out.printf("내 이름은 %s야!\n", name);
    }
    
    public String getName() {
    	return name;
    }
    
    public String getColor() {
    	return color;
    }
    
    public int getPrice() {
    	return price;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public void setPrice(int price) {
    	if(price < 0) {
        	System.out.println("가격은 음수가 될 수 없습니다.");
            return;
        }
        
        this.price = price;
    }
}
public class Mango {
	...
}
public class Grape {
	...
}

  • 이제 Basket 클래스의 함수들에 바뀐 과일들의 함수를 적용하여 바꿔주자.
    하는 김에 생성자도 만들어 주자!
public class Basket {
	Apple apple;
    Mango mango;
    grape grape;
    
    public Basket(Apple apple, Mango mango, Grape grape) {
    	this.apple = apple;
        this.mango = mango;
        this.grape = grape;
    }
    
    public void printNames() {
    	apple.printName();
        mango.printName();
        grape.printName();
    }

	public void printTotalPrice() {
    	int totalPrice = apple.getPrice() + mango.getPrice() + grape.getPrice();
        System.out.printf("총 가격 : %d\n", totalPrice);
    }
}

  • 이제 마지막으로 Main 클래스를 바꿔주자!
public class Main {
	public static void main(String[] args) {
    	Apple apple = new Apple("사과", "빨강", 1000);
        Mango mango = new Mango("망고", "노랑", 2000);
        Grape grape = new Grape("포도", "보라", 1500);
        
        Basket basket = new Basket(apple, mango, grape);

		mango.setPrice(-10000);	// 이런 실수는 이제 통하지 않는다!

        basket.printNames();
        basket.printTotalPrice();
    }
}

실행 결과

가격은 음수가 될 수 없습니다.
내 이름은 사과야!
내 이름은 망고야!
내 이름은 포도야!
총 가격 : 4500

우왕 이제 적절하게 사람의 실수도 막아주는 과일 바구니 코드가 완성 되었다.
이제 바구니에 키위라는 과일을 추가해보고
과일들의 색깔을 출력하는 함수도 추가해보자 ^^ 웃음웃음

7. 추가 사항

1. 과일 바구니에 키위 라는 과일을 추가해보자

이제부터 해야하는 일은
1. 키위 클래스를 만들고
2. 변수들을 선언하고
3. 생성자를 만들고
4. get 함수들을 만들고
5. set 함수들을 만들고
6. printName 함수를 만들고
7. Basket 클래스에 Kiwi 변수를 추가 선언하고
8. Basket 생성자에 Kiwi 추가하고
9. printNames 함수에 Kiwi의 printName 함수 추가하고
10. printTotalPrice 함수에 Kiwi의 가격 추가하고
11. Main 클래스에서 Kiwi 객체 만들어주고
12. Basket 객체 생성자에 Kiwi 추가해주고
13. 실행해보면 키위가 바구니에 추가되었다!

이제 바나나랑 수박이랑 멜론, 복숭아, 블루베리, 앵두, 자두, 감, 배, 석류, 무화과, 귤, 유자, 한라봉, 천혜향, 딸기, 참외, 파인애플을 바구니에 추가해보자!

2. 하는 김에 과일들의 색깔을 출력하는 함수도 만들어보자

위에서 사과, 망고, 포도, 키위, 바나나, 수박, 멜론, 복숭아, 블루베리, 앵두, 자두, 감, 배, 석류, 무화과, 귤, 유자, 한라봉, 천혜향, 딸기, 참외, 파인애플 클래스들을 엄청난 노력을 들여서 다 만들었다.(실제로 만들면 리스펙)
이제 과일들의 색깔을 출력해주는 함수를 만들어보자.
모든 과일들의 클래스에서 printColor() 라는 함수를 만들어주거나
Basket 클래스에서 각 과일들의 색깔을 getColor() 함수를 이용해 받아와서 출력해주어야 한다.

8. 너무 빡셈

회사에서 위와 같은 추가사항에 대한 개발을 지시받았을때 이런식으로 개발을 한다면
라꾸라꾸를 쿠팡에서 로켓배송으로 받아보고 있어야할지도 모른다.
이런 문제를 해결하고 편하고 빠르게 개발을 할 수 있도록 똑똑한 사람들이 객체지향이라는 것을 만들어서
라꾸라꾸를 주문하던 불쌍한 중생들에게 가르침을 주었다고 한다.

  • 추상화
  • 상속
  • 캡슐화
  • 다형성

에 대한 내용을 다음 글에서 과일 바구니에 적용시켜 보도록 하자.

profile
자그마한 개미

0개의 댓글