2024-01-18 TIL
최대값과 캡슐화
MaxCounter 클래스 생성 : 최대값을 지정하고 최대값 까지만 증가하는 기능을 제공
int count : 내부에서 사용하는 숫자
int max : 최대값, 생성자를 통해서 입력
increment() : 숫자를 1 증가
getCount() : 지금까지 증가한 값, 최대값을 반환
요구사항
1. 접근제어자를 사용해서 데이터를 캡슐화
2. 해당 클래스는 다른패키지에서도 사용 가능
package access.ex;
import javax.swing.plaf.IconUIResource;
public class MaxCounter {
private int count = 0;
private int max;
public MaxCounter(int max){
this.max = max;
}
public void increment() {
count++;
}
public int getCount(){
return max;
}
}
MaxCounter 클래스의 내부 코드
최대값을 받는 MaxCounter 생성자, 1씩 증가하는 메서드 increment 그리고 count가 계속 증가할 경우
max보다 커도 max가 출력되는 getCount메서드를 먼저 만들어보았다.
Main클래스에서 new키워드로 MaxCounter를 인스턴스화 후 increment로 1씩 증가시켜보자
직관적으로 보이게 increment에 count출력 추가
package access.ex;
public class CounterMain {
public static void main(String[] args) {
MaxCounter counter = new MaxCounter(5);
counter.increment();
counter.increment();
counter.increment();
counter.increment();
counter.increment();
counter.increment();
counter.getCount();
}
}
여기까지는 1~6 순으로 잘 출력된다. 마지막 6은 안나오게 하려면 어떻게 해야할까?
1씩 증가하는 increment에 if문을 사용해보자. count++;앞에
if(카운트가 맥스보다 같거나 클 경우){(최대값을 초과할 수 없습니다.) return}
맥스보다 카운트가 클 경우 출력멘트와 return을 받아 메서드를 빠져나오자 그래서 다음 로직 count++;가
수행이 안되게끔 만들기
public void increment() {
if (count >= max) {
System.out.println("현재 최대값 : "+ max +", 최대값을 초과할 수 없습니다.");
return;
}
count++;
System.out.println(count);
}
확인을 위한 sout은 지우고 메인에서 getMax를 통해 최대값을 받아내자.
public void increment() {
if (count >= max) {
System.out.println("최대값을 초과할 수 없습니다.");
return;
}
count++;
}
public int getCount(){
return max;
}
public class CounterMain {
public static void main(String[] args) {
MaxCounter counter = new MaxCounter(3);
counter.increment();
counter.increment();
counter.increment();
counter.increment();
int max = counter.getCount();
System.out.println("최대값은 " +max);
}
}

4번째 increment에서는 최대 값을 초과할수 없다는 출력이 나왔다.
return을 만나 count++;이 실행되지 않고 메서드를 빠져나온 것을 알 수 있다.
counter.getCount를 int 변수로 받아 출력내보면 최대값 3이 있다.
쇼핑카트
shoppingCartMain코드가 작동하도록 Item, ShoppingCart 클래스 완성하기
요구사항
1.접근제어자를 사용해서 데이터를 캡슐화
2.다른 패키지에서도 사용할 수 있어야함
3.장바구니에는 상품을 최대 10개만 담을 수 있도록, 10개 초과시 "가득 찼습니다" 출력
메인의 시작은 아래와 같다.
public class ShoppingCartMain {
public static void main(String[] args) {
Item item1 = new Item("마늘","2000","2");
Item item2 = new Item("상추","3000","4");
cart.addItem(item1);
cart.addItem(item2);
cart.displayItems();
}
}
Item을 인스턴스를 보니 String과 int2개를 받고있는 생성자가 필요해 보이고
각 아이템을 담을 addItem메서드와 담긴 리스트들을 보여줄 displayItems메서드가 필요해보인다
public class Item {
private String name;
private int price;
private int count;
public Item(String name, int price, int count) {
this.name = name;
this.price = price;
this.count = count;
}
}
Item item1 = new Item("마늘",2000,2);
Item item2 = new Item("상추",3000,4);
※인트타입은 값에 ""사용 x
다음으로 메인에 ShoppingCart를 cart로 인스턴스화한 후 ShoppingCart클래스에 addItem과 displaItem메서드를 만들자
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item item1 = new Item("마늘",2000,2);
Item item2 = new Item("상추",3000,4);
cart.addItem(item1);
cart.addItem(item2);
cart.displayItems();
}
addItem메서드를 보면 item객체를 받고 있어서 메서드 변수에는 Item타입의 item을 넣어주었고
추가로 아이템들을 담을 카트, 즉 배열과 갯수를 보여줄 필드도 추가로 만들어 주었다.
public class ShoppingCart {
private List<Item> items = new ArrayList<>();
private int itemCount;
public void addItem(Item item) {
}
public void displayItems() {
}
}
private int count = 1;
public void addItem(Item item) {
items.add(item);
System.out.println("아이템을 담았습니다. 현재 아이템 수:" + count++);
}
아이템 리스트 배열에 add로 하나씩 담고, count를 통해 추가되고있음을 확인하자.
public void displayItems() {
for (int i = 0; i < items.size(); i++) {
System.out.println(items.get(i));
}
}
get으로 객체를 순회히 잘 꺼내진다. 단지 참조값이 나올뿐...

Item클래스에 getName, getPrice, getCount 메서드를 만들고 받아오는 변수를 다시 리턴해주게 하자.
public String getName() {
return name;
}
public int getprice() {
return price;
}
public int getcount() {
return count;
}
그리고 다시 ShoppingCart클래스에서 for문을 통해 각 메서드를 호출, 이름과 가격 수를받아 순회시켜 출력한다.
public void displayItems() {
for (int i = 0; i < items.size(); i++) {
Item cart = items.get(i);
System.out.println(cart.getName()+" "+cart.getprice()+"원 "+cart.getcount()+"개");
}
}
위는 일반 for문으로 작성하였고, 아래는 향상된for문을 이용해 작성해보았다.
public void displayItems() {
for (Item cart : items) {
System.out.println(cart.getName()+" "+cart.getprice()+"원 "+cart.getcount()+"개");
}
}
이제 맨 위의 메인코드를 실행시키면 아래와 같이 출력이 된다.

public void addItem(Item item) {
if (items.size() >= 10) {
System.out.println("장바구니가 가득 찼습니다.");
return;
}
items.add(item);
System.out.println("아이템을 담았습니다. 현재 아이템 수:" + itemCount);
itemCount++;
}
최대값 문제와 같이 if문에서 요구사항 조건을 넣고 return을 만나면 더이상 추가가 안되게끔 로직을 바꿨다.
그리고 count변수가 따로 필요없을거같아 itemCount로 대체하였다.
cart.addItem(item1);
cart.addItem(item1);
cart.addItem(item1);
cart.addItem(item1);
cart.addItem(item1);
cart.addItem(item2);
cart.addItem(item2);
cart.addItem(item2);
cart.addItem(item2);
cart.addItem(item2);
cart.addItem(item2);
cart.addItem(item2);
cart.displayItems();

12번의 add를 하면 10개가 찍힌 후로는 더이상 추가되지 않는다.
마지막으로 계산할 총 금액만 추가해서 마무리!
Item클래스 마지막에 가격과 수를 곱해 얻는 값을 getTotalPrice메서드에 저장,
public int getTotalPrice() {
return price * count;
}
ShoppingCart 클래스에 static으로 total변수를 만든 후 displayItem 출력 부분 로직을 아래와 같이 변경해준다.
public void displayItems() {
for (Item cart : items) {
System.out.println(cart.getName()+" "+cart.getprice()+"원 "+cart.getcount()+"개");
total += cart.getTotalPrice();
}
System.out.println("계산할 금액은 : " + total + "입니다.");
}
메인 실행시

끝!!!!!!!!!!!!