Java - 객체지향 프로그래밍(2) 클래스 기초활용 예제들

민찬홍·2023년 10월 25일

Java

목록 보기
25/31
post-thumbnail

🧩 기초 활용 예제들

슬라임 클래스

  • 생성자를 필요로 하지 않음
  • 필드의 기본 값을 가짐
  • 인스턴스를 인자로 받는 메소드

📁 ex01
☕ Slime.java

public class Slime {
    double hp = 50;
    int attack = 8;
    double defense = 0.2;

    void attack (Slime enemy) { // 💡 다른 슬라임의 인스턴스를 인자로 받음
        enemy.hp -= attack * (1 - enemy.defense);
    }
}

☕ Main.java

		Slime slime1 = new Slime();
       	Slime slime2 = new Slime();

        slime1.attack(slime2);
  • 🌟 객체는 참조형 - 인자로 전달될 시 내용이 변경될 수 있음
  • 같은 클래스의 인스턴스지만, 필드의 값은 각기 별개임 주목
  • 각 매장마다의 사정이 다르다는 식으로 생각하면 편함

정수배열 정보 클래스

  • 배열을 생성자 인자로 받아, 그것의 정보를 필드들로 저장
  • 복잡한 과정을 거치는 생성자의 예시

📁 ex02
☕ IntArrayInfo.java

public class IntArrayInfo {
    int count;
    int max;
    int min;
    int sum; // 기본 0
    double average;

    IntArrayInfo(int[] nums) {
        count = nums.length;
        max = nums[0];
        min = nums[0];

        for (int num : nums) {
            max = max > num ? max : num;
            min = min < num ? min : num;
            sum += num;
        }
        // 소수부를 잃지 않도록 먼저 1.0을 곱하여 double로 만듦
        // 실수와 정수의 연산은 실수를 반환
        average = 1.0 * sum / nums.length;
    }
}

☕ Main.java

		int[] ary1 = {3, 5, 9, 2, 8, 1, 4};
        int[] ary2 = {382, 194, 27, 915, 138};

        IntArrayInfo aryInf1 = new IntArrayInfo(ary1);
        IntArrayInfo aryInf2 = new IntArrayInfo(ary2);

        int ary1Max = aryInf1.max;
        double ary2Avg = aryInf2.average;
        int ary1n2Sum = aryInf1.sum + aryInf2.sum;

여기서 의문이 들수있는게 왜 여기서는 this.count, this.max 처럼 안써주냐는 건데 this 가 꼭 필요했던 예시와는 달리 같은 이름의 인자가 있는게 아니므로 굳이 명시할 필요가 없기 때문이다.


얄코치킨과 치킨메뉴 클래스

  • 클래스의 필드로 다른 클래스의 인스턴스를 담은 배열을 가짐
    • 클래스가 인스턴스가 배열 등 다른 자료형에도, 그 반대로도 포함될 수 있음
  • 클래스는 둘 이상의 생성자를 가질 수 있음
  • 인스턴스를 반환하는 메소드

📁 ex03
☕ YalcoChicken.java

public class YalcoChicken {
    int no;
    String name;
    ChickenMenu[] menus;

    YalcoChicken (int no, String name, ChickenMenu[] menus) {
        this.no = no;
        this.name = name;
        this.menus = menus;
    }

    ChickenMenu orderMenu (String name) {
        for (ChickenMenu menu : menus) {
            if (menu.name.equals(name)) { // 🔴
                return menu;
            }
        }
        return null;
    }
}

☕ ChickenMenu.java

public class ChickenMenu {
    String name;
    int price;
    String cook = "fry";

    ChickenMenu (String name, int price) {
        this.name = name;
        this.price = price;
    }

    ChickenMenu (String name, int price, String cook) {
        this.name = name;
        this.price = price;
        this.cook = cook;
    }
}

위의 코드를 보면 생성자가 두개 있는 것을 알 수 있는데, 두번째 생성자는 인자가 하나 더 있다. 딱 떠오르는게 메소드에서 배운 오버로딩이다. 즉 이 치킨 메뉴가 인스턴스가 만들어진 방식을 두가지로 정의할 수 있다는 것이다. 첫번째 생성자로 생성하면 String cook = "fry"가 기본값으로 들어가서 이렇게 생성된 것은 전부 튀기는 메뉴가 될 것이다.

☕ Main.java

		ChickenMenu[] menus = {
             	new ChickenMenu("후라이드", 10000),
                new ChickenMenu("양념치킨", 12000),
                new ChickenMenu("화덕구이", 15000, "bake")
        };
        YalcoChicken store1 = new YalcoChicken(3, "판교", menus);

        ChickenMenu order1 = store1.orderMenu("양념치킨");
        ChickenMenu order2 = store1.orderMenu("오븐구이");

🌟 클래스의 인스턴스도 참조 자료형

		int int1 = 1;
        int int2 = int1;
        int1 = 2;

        String str1 = "헬로";
        String str2 = str1;
        str2 = "월드";

        ChickenMenu menu1 = new ChickenMenu("후라이드", 1000);
        ChickenMenu menu2 = menu1;
        menu1.price = 1200;
  • menu2의 가격 확인
	public static void raisePrice (int avg, ChickenMenu menu, int amount) {
        avg += amount;  // 원시자료형을 바꾸는거라 원본에 변화x
        menu.price += amount;
    }
		int avgChickenPrice = 12000;
        ChickenMenu chickenMenu1 = new ChickenMenu("양념치킨", 12000);

        raisePrice(avgChickenPrice, chickenMenu1, 1000);
  • 배열과 같이 인스턴스도 필드로 들어간 데이터들을 포함하는 주머니
  • 메소드에 인자로 들어갈 시, 인스턴스의 주소값이 복사되어 드렁감
    • 복사된 주소지만 같은 주머니를 가리키므로..
profile
백엔드 개발자를 꿈꿉니다

0개의 댓글