[JAVA]/┃ⓑ KEYWORDS

[JAVA] 객체(Object)

에브리코더 2023. 3. 17. 21:16

안녕하세요! 오늘은 자바에서 매우 중요한 개념인 객체(Object)에 대해 알아보겠습니다.

객체 지향 프로그래밍(Object-Oriented Programming)을 배우는 데 있어 핵심이 되는 객체를 실생활 예시를 통해 자세하고 쉽게 이해해봅시다.

 

  

1. 객체(Object)란 무엇인가?  

자바에서 객체는 현실 세계에 존재하는 개체(Entity)를 컴퓨터 세계에서 표현하기 위한 구조입니다. 

객체는 속성(Attribute)과 행동(Method)로 구성되어 있습니다. 

예를 들어, 자동차라는 객체가 있다고 생각해보겠습니다.

속성(Attribute) : 차종, 색상, 배기량, 속도 등
행동(Method) : 가속하기, 멈추기, 방향 전환 등

이처럼 객체는 어떤 대상의 특성과 그 대상이 수행하는 기능을 모두 포함합니다.

 

2. 클래스(Class)와 인스턴스(Instance)

객체를 생성하기 위해서는 먼저 클래스(Class)라는 '틀'이 필요합니다. 

클래스는 객체의 속성과 행동을 정의하며, 인스턴스는 클래스를 바탕으로 생성된 실체입니다. 

동일한 클래스를 바탕으로 여러 개의 인스턴스를 생성할 수 있습니다. 

예를 들어, 자동차라는 클래스를 가지고 여러 대의 서로 다른 자동차 인스턴스를 만들 수 있습니다.

 

예시: 자동차 클래스를 이용해 인스턴스 생성하기

public class Car {
    // 속성 (멤버 변수)
    String brand;
    String color;
    int speed;

    // 행동 (메소드)
    void accelerate() {
        speed += 10;
    }

    void brake() {
        speed -= 10;
    }

    void turn(String direction) {
        System.out.println("Turning " + direction);
    }
}

public static void main(String[] args) {
    // 인스턴스 생성
    Car myCar = new Car();
    Car yourCar = new Car();

    // 속성 설정
    myCar.brand = "Hyundai";
    myCar.color = "Blue";
    myCar.speed = 0;

    yourCar.brand = "Kia";
    yourCar.color = "Red";
    yourCar.speed = 0;

    // 행동 수행
    myCar.accelerate();
    myCar.turn("left");
    yourCar.brake();
}

위의 코드에서 Car 클래스를 정의하고, main 메소드에서 두 개의 서로 다른 인스턴스(myCar, yourCar)를 생성했습니다. 

각 인스턴스는 서로 다른 속성을 가지고 있지만, 동일한 클래스를 기반으로 만들어졌기 때문에 같은 행동(메소드)를 공유합니다. 

이렇게 클래스를 사용하면 비슷한 객체들을 쉽게 생성하고 관리할 수 있습니다.

 

3. 캡슐화(Encapsulation)
객체 지향 프로그래밍에서는 캡슐화라는 개념이 중요합니다. 

캡슐화는 객체의 속성과 행동을 하나의 단위로 묶어 외부에서 직접 접근할 수 없도록 하는 것입니다. 

이를 통해 코드의 안정성과 유지 보수성이 향상됩니다.

예시: 캡슐화를 적용한 자동차 클래스

public class Car {
    // 속성 (멤버 변수) - private으로 설정
    private String brand;
    private String color;
    private int speed;

    // 행동 (메소드) - public으로 설정
    public void accelerate() {
        speed += 10;
    }

    public void brake() {
        speed -= 10;
    }

    public void turn(String direction) {
        System.out.println("Turning " + direction);
    }

    // 속성에 접근하기 위한 Getter와 Setter 메소드
    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

위의 코드에서 속성은 private로 설정하여 외부에서 직접 접근할 수 없게 하였습니다. 대신, 각 속성에 대한 Getter와 Setter 메소드를 정의하여 간접적으로 접근할 수 있도록 했습니다. 이를 통해 객체의 내부 데이터를 보호하고 외부에서의 변경을 제어할 수 있습니다.

 

4. 상속(Inheritance)
상속은 한 클래스의 속성과 행동을 다른 클래스가 물려받는 것입니다. 

이를 통해 코드의 중복을 줄이고, 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.

예시: 상속을 이용한 전기 자동차 클래스 생성

public class ElectricCar extends Car {
    private int batteryCapacity;

    public int getBatteryCapacity() {
        return batteryCapacity;
    }

    public void setBatteryCapacity(int batteryCapacity) {
        this.batteryCapacity = batteryCapacity;
    }

    public void charge() {
        System.out.println("Charging the electric car...");
    }
}

위의 코드에서 ElectricCar 클래스는 Car 클래스를 상속받았습니다. 이로 인해 ElectricCar 클래스는 기존 Car 클래스의 속성(brand, color, speed)과 행동(accelerate, brake, turn)을 모두 물려받게 되며, 추가로 전기 자동차에만 해당되는 속성(batteryCapacity)과 충전(charge)을 정의할 수 있습니다.

public static void main(String[] args) {
    ElectricCar tesla = new ElectricCar();

    // Car 클래스의 메소드 사용
    tesla.setBrand("Tesla");
    tesla.setColor("White");
    tesla.setSpeed(0);
    tesla.accelerate();

    // ElectricCar 클래스에서 추가된 메소드 사용
    tesla.setBatteryCapacity(100);
    tesla.charge();
}

 

Main 메소드에서는 ElectricCar 클래스의 인스턴스(tesla)를 생성하고, 상속받은 Car 클래스의 메소드(setBrand, setColor, setSpeed, accelerate)와 ElectricCar 클래스에서 추가한 메소드(setBatteryCapacity, charge)를 사용할 수 있습니다.

 

5.다형성(Polymorphism)
다형성은 한 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 

다형성을 이용하면 동일한 인터페이스에 대해 서로 다른 구현을 할 수 있어 코드의 유연성이 증가합니다.



예시: 다형성을 이용한 자동차 클래스

public interface Drivable {
    void drive();
}

public class Car implements Drivable {
    // 기존 Car 클래스 코드

    @Override
    public void drive() {
        System.out.println("Driving a car...");
    }
}

public class ElectricCar extends Car {
    // 기존 ElectricCar 클래스 코드

    @Override
    public void drive() {
        System.out.println("Driving an electric car...");
    }
}

public static void main(String[] args) {
    Drivable myCar = new Car();
    Drivable yourCar = new ElectricCar();

    myCar.drive(); // 출력: Driving a car...
    yourCar.drive(); // 출력: Driving an electric car...

위의 코드에서 Car 클래스와 ElectricCar 클래스는 Drivable 인터페이스를 구현하였습니다. main 메소드에서 Drivable 타입의 변수에 각각 Car와 ElectricCar 인스턴스를 할당하고, drive 메소드를 호출하였습니다. 이렇게 하면 각 인스턴스에 따라 서로 다른 drive 메소드가 실행되는 다형성을 구현할 수 있습니다.

 



이상으로 자바 객체에 대한 설명을 마칩니다. 객체 지향 프로그래밍의 핵심 개념인 객체, 클래스, 캡슐화, 상속, 다형성을 실생활 예시를 통해 자세하고 쉽게 이해해보았습니다. 이를 기반으로 자바 프로그래밍 능력을 더욱 향상시킬 수 있을 것입니다.  감사합니다.