언어(Language)/Java

[Java] 자바 클래스와 객체, 인스턴스 개념 정리 및 활용

잇트루 2022. 9. 13. 04:00
반응형

클래스 (Class)

클래스란 객체를 정의한 설계도 또는 틀이라 정의할 수 있다. 즉, 클래스는 객체를 생성하는 데 사용된다. 반대로 객체는 클래스에 의해 정의되고 설계된 내용을 기반으로 생성된다. 또한, 클래스로부터 객체를 만드는 과정을 인스턴스화(Instanctiate)라 한다.

클래스와 객체의 관계는 제품의 설계도와 제품과의 관계와 유사하다. 제품 설계도 없이는 제품을 만들 수 없고, 제품 또한 제품 설계도 없이 만들 수 없기 때문이다.

 

객체 (Object)

사람과 동물, 물품, 어떤 논리나 사상, 개념, 철학 등과 같이 눈으로 볼 수 있는 것부터 볼 수 없는 것까지 객체의 범주에 포함될 수 있다. 즉, 객체는 우리가 보고 느끼며 인지할 수 있는 모든 것을 의미한다.

객체는 클래스에 의해 정의되고 설계된 내용을 기반으로 생성된다. 객체는 속성과 행위(기능)를 가진다. 즉, 클래스를 통해 만들어진 객체가 실제로 사용할 수 있는 주체가 된다. 객체의 속성은 필드(변수), 행위는 메서드에 해당한다. 속성과 행위는 이너 클래스와 함께 객체의 멤버이다.

클래스를 통해 생성된 객체를 클래스의 인스턴스(instance)라 부른다.

 

인스턴스 (Instance)

객체와 인스턴스는 크게 차이를 보이지는 않는다. 따라서 두 용어를 혼용하여 사용하기도 한다. 하지만, 엄밀히 말하면 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다.

 

클래스의 구성요소

클래스는 class 키워드를 통해 정의할 수 있으며, 클래스의 이름은 대문자로 시작하는 것이 관례이다.

public class ClassName { // 클래스
    int studentNumber = 10; // #1 필드

    public int MethodName{ // #2 메서드
    }
	
    ClassName { // #3 생성자
    }

    class ClassName2 { // #4 inner 클래스
    }
}

클래스 안에는 필드, 메서드, 생성자, 이너 클래스 네 가지 구성 요소를 작성할 수 있다.

1. 필드 : 클래스의 속성(변수)을 나타낸다. 객체의 데이터, 상태 정보 등을 저장하는 곳이다. 메서드와 생성자 전체에서 사용할 수 있다.

 

2. 메서드 : 클래스의 행위(메서드)를 나타낸다. 객체 간의 데이터 전달 수단으로 활용된다. 외부로부터 값을 받을 수 있으며, 메서드의 실행 이후 값을 반환할 수 있다.

 

3. 생성자 : 클래스의 객체를 생성하고 초기화하는 역할을 한다. new 연산자를 통해 호출되며 반환 타입이 없다.

 

4. 이너 클래스 : 클래스 내부에 존재하는 또 다른 클래스를 의미하고 중첩 클래스라고도 한다. 클래스나 인터페이스 내부에서 선언하고 외부 클래스의 멤버들에 접근할 수 있다.

 

객체의 속성과 행위 (필드와 메서드)

만약, 자동차 한 대를 하나의 객체라고 바라본다면 이 객체의 속성과 행위는 다음과 같이 정의할 수 있다.

속성 : 모델, 문의 개수, 바퀴의 개수, 색상, … 등

행위 : 시동 걸기, 앞으로 가기, 뒤로 가기, 정지 하기, … 등

 

이를 실제 코드로 옮겨 클래스의 필드와 메서드로 정의하여 객체의 속성과 행위를 작성한다.

Class Car {
    // 필드
    String model; // 모델명(속성)
    int wheels; // 자동차 바퀴 개수(속성)
    int doors; // 자동차 문의 개수(속성)
    String color; // 자동차 색상(속성)

    void powerOn() { // 메서드
        // 전원을 켜는 행위
    }
    void accelerate() { // 메서드
        // 앞으로 가는 행위
    }
    void backwoards() { // 메서드
        // 뒤로 가는 행위
    }
    void stop() { // 메서드
        // 정지 행위
    }
}

각 필드에는 알맞은 데이터 타입을 선언하여 자동차의 속성에 알맞도록 정의한다.

메서드를 통해 자동차가 실제 할 수 있는 행위를 코드로 작성한다.

 

객체의 생성

객체의 생성은 new 키워드를 통해 생성이 가능하다.

생성된 객체는 포인트 연산자(.)를 통해 해당 객체의 멤버에 접근이 가능하다.

이렇게 생성된 객체들은 인스턴스라 하며, 인스턴스는 여러 개 생성될 수 있다.

클래스이름 참조변수이름 = new 생성자(); // 객체의 생성, 생성된 객체는 인스턴스
class CarInstanceCreate {
    public static void main(String args) {

        Car tesla1 = new Car(); // Car 클래스를 기반으로 생성된 tesla1 인스턴스
        Car tesla2 = new Car(); // Car 클래스를 기반으로 생성된 tesla2 인스턴스

        Car benz1 = new Car(); // Car 클래스를 기반으로 생성된 benz1 인스턴스
        Car benz2 = new Car(); // Car 클래스를 기반으로 생성된 benz2 인스턴스

        Car genesis1 = new Car(); // Car 클래스를 기반으로 생성된 genesis1 인스턴스
        Car genesis2 = new Car(); // Car 클래스를 기반으로 생성된 genesis2 인스턴스

    }
}

객체를 생성한 변수에는 실제 저장된 데이터의 주소 값을 가지고 있다. 위에서 생성한 객체의 실제 데이터는 주소가 가리키는 힙 메모리의 공간에 저장되어 있다.

 

객체의 활용

생성된 객체를 사용하는 방법은 포인터 연산자 ’.’를 사용하여 객체에 접근하는 것이다.

tesla1.powerOn();

 

다음은 클래스에서 객체를 정의하고 생성하여 활용하는 예제이다.

// car.java
class Car {
    // 필드(속성) 선언
    public String model;
    public String color;
    public int price;

    // 생성자(객체의 선언 및 초기화 방법)
    public Car(String model, String color, int price) {
        this.model = model;
        this.color = color;
        this.price = price;
    }

    // 메서드(행위) 선언
    void powerOn() {
        System.out.println("시동을 켠다");
    }

    void accelerate() {
        System.out.println("앞으로 간다.");
    }

    void stop() {
        System.out.println("멈춘다.");
    }

}
// CarTest.java
public class CarTest {
    public static void main(String[] args) {
        Car genesis = new Car("g80", "black", 1000);

        System.out.println("모델명 : " + genesis.model);
        System.out.println("색상 : " + genesis.color);
        System.out.println("가격(단위: 만 원) : " + genesis.model;

        genesis.powerOn();
        genesis.accelerate();
        genesis.stop();
    }
}

 

반응형