알아두면 쓸데있는 IT 잡학사전

개발/JAVA +16

CLASS의 개요 #1

개발/JAVA2018. 7. 9. 23:56

객체란? 관념적으로 머리 속에 그린 이미지. 즉, 모형 또는 템플릿입니다.

특별히 객체에 대한 추상화 작업의 결과를 클래스(Class)라고 합니다.

예를 들어 클래스 명이 Car인 자동차 클래스는 다음과 같이 표현합니다.

public class Car {
  // TODO JAVA 코드를 입력하세요.
}
public class Car {
  // TODO C# 코드를 입력하세요.
}
class Car {
  // TODO C 코드를 입력하세요.
}


위와 같이 객체는 특성과 행위를 하나의 단위로서 포함하고 있습니다.

다시 말하면, 특성과 행위가 객체라고 하는 캡슐안에 포함되어 있는 것 입니다.

결국 객체란 캡슐화라고 하는 객체지향의 원리를 구체화한 것이 되는 것 입니다.

자동차 객체의 운전이란 행위는 운전자에게 노출된 인터페이스가 되며, 엔진 등의 특성은 자동차를 구현하는 세부적인 사항이 되는 것입니다.


C++

C++언어에서 특성은 데이터 멤버(data member)로 구현하며, 행위는 멤버함수(member function)로 정의합니다.

각 데이터 멤버는 자신이 저장할 특성 정보의 데이터 타입(data type)이 지정됩니다.

다른 언어와 달리 C++언어에서는 클래스의 선언부와 구현부가 분리되어 있습니다.

클래스의 선언부는 확장자가 .h 인 헤더파일(header file)에 정의되며, 구현부는 확장자가 .cpp인 파일에 저장합니다.


car.h 구현파일

// car.h 헤더파일
class Car {
    int body;
    int engine;
    int steering;
    int transmission;
    int whell;
public:
    void start();
    void stop();
    void accelerate();
    void slowDown();
    void turnLeft();
    void turnRight();
}

car.cpp 구현 파일

// car.cpp 구현파일
#include "car.h"
void Car::start() {
// 출발행위 구현코드를 입력합니다.
}
void Car::stop() {
// 정지행위 구현코드를 입력합니다.
}
void Car::accelerate() {
// 가속행위 구현코드를 입력합니다.
}
void Car::slowDown() {
// 감속행위 구현코드를 입력합니다.
}
void Car::turnLeft() {
// 좌회전행위 구현코드를 입력합니다.
}
void Car::turnRight() {
// 우회전행위 구현코드를 입력합니다.
}


JAVA

자바언어에서 특성은 필드(field) 안에 저장되며, 행위는 메서드(method)로 구현합니다.

C++언어와 달리 자버언어에서는 클래스 선언부와 구현부를 구별하지 않습니다.


car.java

// car.java
class Car {
    private int body;
    private int engine;
    private int steering;
    private int transmission;
    private int wheel;

    public void start() {
        // 출발행위 구현코드를 입력합니다.
    }
    public void stop() {
        // 정지행위 구현코드를 입력합니다.
    }
    public void accelerate() {
        // 가속행위 구현코드를 입력합니다.
    }
    public void slowDown() {
        // 감속행위 구현코드를 입력합니다.
    }
    public void turnLeft() {
        // 좌회전행위 구현코드를 입력합니다.
    }
    public void turnRight() {
        // 우회전행위 구현코드를 입력합니다.
    }
}


C#

C#언어는 자바 언어와 완전히 동일한 구문으로 클래스의 특성과 행위를 정의합니다.

다만, C# 언어에서는 특성을 두 가지 방법으로 구현할 수 있게 합니다. 그 중 하나는 자바 언어와 마찬가지로 필드(field)로 구현하며, 다른 하나는 속성(property)이라고 하는 것으로 구현하는 것 입니다.

// car.cs
class Car {
    private int body;
    private int engine;
    private int steering;
    private int transmission;
    private int wheel;

    public void start() {
        // 출발행위 구현코드를 입력합니다.
    }
    public void stop() {
        // 정지행위 구현코드를 입력합니다.
    }
    public void accelerate() {
        // 가속행위 구현코드를 입력합니다.
    }
    public void slowDown() {
        // 감속행위 구현코드를 입력합니다.
    }
    public void turnLeft() {
        // 좌회전행위 구현코드를 입력합니다.
    }
    public void turnRight() {
        // 우회전행위 구현코드를 입력합니다.
    }
}


모든 객체는 클래스를 기반으로 생성됩니다. 그래서 객체를 클래스의 인스턴스(instance)라고 합니다. 

즉, 클래스에 정의된 사항을 모두 충족하는 하나의 경우가 객체라는 것입니다. 따라서 클래스는 객체를 생성하는 수단이 되는 것입니다.

그리고 클래스의 인스턴스란 말은 객체란 말과 동의어가 됩니다.


클래스 인스턴스 생성

// C++ Car myCar; // or Car* pMyCar = new Car;

C++은 이렇게 생성된 인스턴스는 필요가 없어지게 되면 delete keyword를 사용하여 소멸시켜주어야 합니다. 그렇지 않으면 메모리 누수현상(memory leakage)이란 문제가 발생하게 됩니다. 즉, new 키워드로 생성된  객체는 delete 키워드를 사용하여 소멸시킬 때까지 계속 유지 됩니다.

// JAVA
Car myCar = new Car();

자바언어 에서 클래스의 인스턴스를 생성할 때는 C++ 언어와 마찬가지고 new 키워드를 사용하지만, 이 new 키워드는 pointer를 반환하지 않습니다. 대신 reference 정보를 반환합니다.

자바언어는 delete 키워드가 없습니다. 대신 가비지 컬렉터(garbage collector)가 맡아서 처리 합니다. 이렇게 불필요한 인스턴스를 모으는 작업을 가비지 컬렉션(garbage collection)이라 하며, 이 작업은 자바 가상머신(Java Virtual Machine, JVM)이 맡아서 처리하게 됩니다.

Car myCar = new Car();

C# 언어는 C++언어와 마찬가지고 포인터를 지원하기는 하지만 잘 사용하지는 않습니다. 대신 자바 언어와 동일하게 new 키워드로 생성된 클래스 인스턴스의 참조정보를 반환합니다. 구문도 자바와 동일합니다.

C#도 자바와 같이 가비지 컬렉터(garbage collector)가 불필요한 인스턴스를 처리 하며, 이 작업은 CLR(Common Language Runtime)이 맡아서 처리 합니다.


클래스 생성자

클래스 인스턴스 생성 시 원하는 값으로 멤버를 초기화 할 수 있도록 각 언어에서는 생성자(constructor)라고 하는 것을 정의할 수 있게 합니다.

다시 말해 생성자란 클래스의 인스턴스가 생성될 때 자동적으로 호출되어 특성을 초기화하는 기능을 수행하는 특수한 member function 또는 method 입니다.


C++, JAVA, C#언어 생성자는 클래스 이름과 동일한 이름을 갖는 메서드로 구현합니다.

public class Car {
    private int body;
    private int engine;
    private int steering;
    private int transmission;
    private int whell;
    public Car() {
        body = 1;
        engine= 1;
        steering = 1;
        transmission= 1;
        whell = 1;
    }
}


클래스 소멸자

생성자가 클래스의 인스턴스가 생성될 때 초기화하는 역할을 담당한다면 인스턴스가 소멸될 때 뒷정리를 하는 역할을 하는 것이 필요할 수 도 있습니다. 

이러한 역할을 하는 특별한 멤버 함수 또는 메서드를 소멸자(destructor) 라고 합니다.

'개발 > JAVA' 카테고리의 다른 글

[Design Pattern]Singleton  (1) 2018.07.16
[Design Pattern]Template Method  (0) 2018.07.13
[Design Pattern]Factory  (0) 2018.07.13
[Design Pattern]Adapter  (0) 2018.07.12
[Design Pattern]Iterator  (0) 2018.07.12