Coded by Juny

클래스와 객체 본문

Study/Java

클래스와 객체

Juny_Choi 2023. 11. 29. 15:55

우리가 현실 세계에서 보고 만지는 모든 실재하는 대상을 프로그래밍 언어에서는 객체(Object)라고 한다. 계속 배워 나갈 객체지향 프로그래밍(OOP) 개념은 이 객체로부터 시작된다. 

 

이러한 객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 한 데 모아 추상화시키고, 상태와 행위를 가진 객체를 만들고 해당 객체들 간의 상호작용을 통해 특정 기능을 구성하는 프로그래밍 방법론을 의미한다. 즉, OOP는 사물의 속성과 기능을 분석하고 이를 프로그래밍의 변수와 함수로 정의하여 실제세계를 컴퓨터 프로그래밍에 반영하고자 하는 목표를 두고 있다.

 

이를 레고와 비유하자면 특정 사물이 가지는 속성과 기능을 하나의 레고 조각으로 만들고 이를 하나씩 결합하는 것과 비슷하다. 이처럼 레고와 같은 프로그래밍을 하면 얻는 장점은 기능을 손쉽게 재활용할 수 있다. 또한 코드 간의 관계를 설정함으로 쉽게 코드를 변경할 수 있어서 개발과 유지보수에 용이한 프로그래밍 방식이다. 

 

이러한 객체지향 프로그래밍 언어인 Java에서 클래스와 객체가 무엇인지, 그 들간의 관계에 대해 알아보도록 하겠다.

 

 

클래스

클래스란 앞서 설명한 객체를 정의한 설계도 또는 틀이라고 정의한다. 클래스는 객체를 생성하는 데 사용되며 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다. 

즉, 클래스는 객체 그 자체가 아니라 객체를 생성하는 데 사용되는 하나의 틀이며, 클래스와 객체는 제품의 설계도와 제품과의 관계로 비유할 수 있다.

 

클래스를 통해 생성된 객체는 해당 클래스의 인스턴스라고 칭한다. 그리고 이러한 과정은 인스턴스화라고 한다. 사실 객체와 인스턴스는 동일한 말이며 객체는 모든 인스턴스를 포괄하는 넓은 의미라면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지 강조한다는 데에서 차별점이 있다고 볼 수 있다.

 

그렇다면 이제 이러한 클래스가 실제로 어떻게 정의되는지 코드를 통해 살펴보자. 클래스는 기본적으로 class 키워드를 사용하여 정의하며 보통 대문자로 시작하게 된다. 

class TestClass {
	// code
}

 

 

 

보통 클래스에는 4가지의 구성요소가 있는데 다음 예시 코드를 보며 살펴보자

public class TestClass{
	int x = 7; // (1)
    void printX(){} // (2)
    TestClass{} //(3)
    class testClass2 {} //(4)
}

 

(1) 필드 : 클래스의 속성을 나타내는 변수로 자동차가 해당 클래스라면 바퀴, 색깔, 모델명 등이 포함된다.

(2) 메서드 : 클래스의 기능을 나타내는 함수로 자동차가 해당 클래스라면 가속하기, 정지하기 등의 행위나 기능이 포함된다.

(3) 생성자 : 클래스의 객체를 생성하는 역할을 한다.

(4) 이너 클래스 : 클래스 안에 존재하는 클래스를 의미한다.

 

 

 

객체

클래스를 통해 만들어진 객체는 크게 속성과 기능이라는 두 가지 구성요소로 이루어져있다. 속성과 기능은 각각 필드와 메서드로 정의되는데 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이루어져 있고 이러한 속성과 기능은 이너클래스와 함께 객체의 멤버라고 칭한다.

 

이러한 객체는 new 키워드를 사용하여 실제 객체를 생성할 수 있고 생성한 객체는 포인트 연산자인 (.)를 통해 해당 객체의 멤버에 접근이 가능하다.

public class CarClass {
	public static void Main(String[] args) {
    
    Car tesla = new Car(); // Car 클래스를 기반으로 tesla 인스턴스 생성
    Car hyundai = new Car(); // Car 클래스를 기반으로 hyundai 인스턴스 생성
    Car kia = new Car(); //Car 클래스를 기반으로 kia 인스턴스 생성
    }
}

 

 

 

객체의 생성

클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장

// 간편하게 다음처럼 선언 가능
클래스명 참조_변수명 = new 생성자();

먼저 특정 클래스 타입의 참조변수를 선언하고 new 키워드와 생성자를 통해 인스턴스를 생성하여 참조변수에 할당한다. 여기서 참조변수는 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가르키며 new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 가진다.

 

 

 

객체의 활용

이렇게 생성된 객체를 활용하기 위해서는 포인트 연산자인 (.)을 활용하는데 이 연산자는 해당 위치에 있는 객체 안을 보라는 뜻이다. 현재 작성하는 클래스에서 다른 클래스 기반의 객체를 사용해보자.

 

public class CarTest {
    public static void main(String[] args) {
        Car car = new Car("Model 3", "빨강"); // 객체 생성. 

        System.out.println("내 차의 모델은 " + car.model + "이고 " + "색은 " + car.color + "입니다."); // 필드 호출
        car.power(); // 메서드 호출
        car.accelerate();
        car.stop();
    }
}

class Car {
    public String model; // 필드 선언
    public String color;

    public Car(String model, String color) { // 인스턴스 초기화를 위한 생성자 함수
        this.model = model;
        this.color = color;
    }

    void power() { // 메서드 선언
        System.out.println("시동을 걸었습니다.");
    }

    void accelerate() {
        System.out.println("더 빠르게!");
    }

    void stop(){
        System.out.println("멈춰!!");
    }
}

다음과 같이 이너 클래슬로 Car class가 있다고 가정해보자. CarTest 클래스에서 해당 클래스 기반의 객체를 사용하고자 한다. 그렇다면 해당 CarTest 클래스에서 Car 클래스에서 필요한 객체인 모델명, 색깔을 지정해서 Car 클래스 기반의 객체를 생성해주었다. 그렇다면 다음 줄의 print문에서 car.model은 car 객체의 model을 불러오므로 String 타입인 "model 3"가 출력될 것이고 그 후 car.color는 String 타입의 "빨강이 출력될 것이다.

 

또한 그 아래의 car 객체의 메서드 또한 필드와 같이 포인트 연산자를 사용하고 ( )를 붙여주면 된다. 해당 메서드들은 Car 클래스에서 정의된 간단한 출력문을 가진 메서드 이므로 해당 문구들이 될 것이다.

출력 결과

 

 

'Study > Java' 카테고리의 다른 글

제어문  (1) 2023.11.22
콘솔 입출력  (0) 2023.11.17
연산자  (0) 2023.11.16
문자열 타입  (1) 2023.11.12
Java의 변수와 타입  (0) 2023.11.10