Back-End (Web)/JAVA

[JAVA] 클래스 설계와 객체 생성

JABHACK 2024. 11. 12. 10:24

클래스

클래스 = 설계도 이다. 더 간단히 설명하면 붕어빵 틀이라고 생각하면된다. 

 

클래스의 구성 요소

  1. 필드(Field): 클래스의 속성을 나타내며, 객체가 가져야 할 데이터나 상태를 저장합니다. 필드는 변수와 유사하지만 클래스 내에 정의되어 객체의 상태를 나타내는 데 사용됩니다.
  2. 메소드(Method): 클래스가 수행하는 행동이나 기능을 정의합니다. 객체가 수행할 수 있는 작업을 메소드로 정의하며, 필드를 조작하거나 특정 기능을 수행하는 역할을 합니다.
  3. 생성자(Constructor): 객체를 생성할 때 호출되는 특별한 메소드로, 클래스 이름과 동일한 이름을 가집니다. 생성자를 통해 객체의 초기 상태를 설정할 수 있습니다.
  4. 접근 제어자(Access Modifier): 클래스, 필드, 메소드에 접근할 수 있는 범위를 제한하는 키워드입니다. 주로 public, private, protected 등이 있으며, 접근 범위를 명시하여 데이터 보호와 캡슐화를 구현할 수 있습니다.

클래스 생성

 

메소드와 함수의 차이

  1. 메소드(Method):
    • 객체 지향 프로그래밍(OOP)에서 객체의 행위를 정의하는 코드 블록입니다.
    • 클래스 내부에 정의되며, 특정 객체의 상태(필드)에 접근하고 이를 조작하는 데 사용됩니다.
    • 메소드는 클래스에 종속적이기 때문에 객체를 통해 호출됩니다.
    • Java에서는 모든 함수가 클래스 안에 있어야 하므로, Java에서는 함수 대신 "메소드"라는 용어를 사용합니다.
  2. 함수(Function):
    • 함수는 독립적인 코드 블록으로, 특정 작업을 수행하기 위해 사용됩니다.
    • 객체 지향 언어가 아닌 프로그래밍 언어(예: C, JavaScript(ES6 이전))에서는 함수가 클래스에 소속되지 않고, 단독으로 존재할 수 있습니다.
    • 함수는 클래스나 객체에 종속되지 않고, 필요에 따라 어디서든 호출할 수 있는 독립적인 개념입니다.

즉, 모든 메소드는 함수이지만, 모든 함수가 메소드인 것은 아닙니다. 메소드는 객체에 속한 함수로 볼 수 있습니다.

public class Calculator {
    public int add(int a, int b) { // add는 Calculator 클래스의 메소드
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println(calculator.add(5, 3));  // 8
    }
}

 

 

자동차 클래스 생성

 

public class Car {
    String company; // 자동차 회사
    String model; // 자동차 모델
    String color; // 자동차 색상
    double price; // 자동차 가격
    double speed;  // 자동차 속도, km/h 단위
    char gear; // 기어 상태, P (주차), R (후진), N (중립), D (주행)
    boolean lights; // 자동차 조명 상태, 켜짐(true) 또는 꺼짐(false)

    // 기본 생성자: 매개변수 없이 Car 객체를 생성
    public Car() {}

    // gasPedal 메서드: 속도를 설정하는 메서드로 kmh 값을 speed 필드에 저장하고 반환
    double gasPedal(double kmh) {
        speed = kmh; // 자동차의 현재 속도를 kmh 값으로 설정
        return speed; // 설정된 속도 반환
    }

    // brakePedal 메서드: 속도를 0으로 설정하는 메서드로, speed 필드를 0으로 설정하고 반환
    double brakePedal() {
        speed = 0; // 속도를 0으로 설정하여 정지 상태로 만듦
        return speed; // 속도 0을 반환
    }

    // changeGear 메서드: 기어 상태를 변경하는 메서드로, type 값을 gear 필드에 저장하고 반환
    char changeGear(char type) {
        gear = type; // 기어를 매개변수 type의 값으로 설정
        return gear; // 설정된 기어 상태 반환
    }

    // onOffLights 메서드: 조명 상태를 반전시키는 메서드로, 현재 lights 값을 반전시키고 반환
    boolean onOffLights() {
        lights = !lights; // 현재 조명 상태를 반전(true -> false, false -> true)
        return lights; // 변경된 조명 상태 반환
    }

    // horn 메서드: 경적을 울리는 메서드로, 호출 시 "빵빵" 소리를 콘솔에 출력
    void horn() {
        System.out.println("빵빵"); // 경적 소리 출력
    }
}

public class Main {
    public static void main(String[] args) {
        // Car 객체 생성
        Car car = new Car();

        // gasPedal 호출하여 속도 설정 및 출력
        System.out.println("Current Speed: " + car.gasPedal(80)); // 속도 80 km/h 설정

        // brakePedal 호출하여 속도 정지 상태로 변경 및 출력
        System.out.println("Current Speed after braking: " + car.brakePedal()); // 속도 0 km/h 설정

        // changeGear 호출하여 기어 상태 변경 및 출력
        System.out.println("Current Gear: " + car.changeGear('D')); // 기어를 D로 변경

        // onOffLights 호출하여 조명 상태 반전 및 출력
        System.out.println("Lights On/Off: " + car.onOffLights()); // 조명 상태 변경

        // horn 호출하여 경적 소리 출력
        car.horn(); // "빵빵" 출력
    }
}

 

객체 생성

new Car(); // Car클래스 객체 생성
  • 객체 생성 연산자인 ‘new’를 사용하면 클래스로부터 객체를 생성할 수 있습니다.
  • new 연산자 뒤에는 해당 클래스의 생성자 호출 코드를 작성합니다.
  • 형태가 Car();즉, 기본 생성자의 형태와 같기 때문에 new 연산자에 의해 객체가 생성되면서 기본 생성자가 호출됩니다.

 

참조형 변수

Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
  • new 연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환되기 때문에 해당 클래스의 참조형 변수를 사용하여 받아줄 수 있다.

 

객체 배열

  • 객체는 참조형 변수와 동일하게 취급되기 때문에 배열 또는 컬렉션에도 저장하여 관리할 수 있다.
public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3];
        Car car1 = new Car();
        car1.changeGear('P');
        carArray[0] = car1;
        
        Car car2 = new Car();
        car2.changeGear('N');
        carArray[1] = car2;
        
        Car car3 = new Car();
        car3.changeGear('D');
        carArray[2] = car3;

        for (Car car : carArray) {
            System.out.println("car.gear = " + car.gear);
        }
    }
}

// 출력
//car.gear = P
//car.gear = N
//car.gear = D