본문 바로가기
JAVA

JAVA / 클래스와 객체

by LWM 2020. 4. 3.
반응형

독자분들은 자바를 한번이라도 접해보았다면 객체지향이라는 말을 들어봤을 것이다.
자바는 대표적인 객체지향언어 중 하나로서, 객체지향 프로그래밍(OOP)을 손쉽게 할 수 있다.
객체지향의 특징을 잠깐 언급하자면 다음과 같다.

  1. 코드의 높은 재사용성
  2. 코드의 관리가 용이
  3. 신뢰성이 높은 프로그래밍 가능
    이러한 객체지향의 특징을 제고시킨 대표적 요소는 클래스와 객체이며, 지금부터 이 두가지 요소가 무엇인지 함께 알아보자.

클래스와 객체 그리고 인스턴스


클래스 : 객체를 정의해 놓은 것 또는 객체의 설계도
객체 : 실제로 존재하는 것 또는 사물 혹은 개념
인스턴스 : 어떤 클래스로부터 만들어진 객체

클래스

클래스란 '객체를 정의해놓은 것' 또는 '객체의 설계도 또는 틀" 이라고 정의할 수 있다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

객체

객체란 '실제로 존재하는 것' 또는 '사물 혹은 개념' 이라고 정의할 수 있다. 우리가 일상생활에서 흔히 접하는 컴퓨터, 자동차 등의 사물들이 곧 객체다.
객체지향이론에서는 사물과 같은 유형적인 것 뿐만아니라 개념이나 논리와 같은 무형적인 것들에 대해서도 객체로 간주한다.
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 의미하며, 각각의 객체들은 가지고 있는 기능과 속성에 따라 쓰임이 다르다.

인스턴스

인스턴스란 특정 클래스로부터 만들어진 객체를 의미하며, 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.
객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있지만, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.

 

객체의 구성요소


객체는 크게 속성과 기능 두가지 구성요소로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 다수의 기능을 가진다.
즉, 객체는 속성과 기능의 집합이라고 할 수 있으며, 객체가 가지고 있는 속성과 기능을 객체의 멤버라 한다.

앞전에 객체는 클래스가 인스턴스화 되는 것이라고 설명하였다. 때문에 객체의 멤버인 속성과 기능은 클래스에 정의된 내용을 바탕으로 인스턴스화 되면서 해당 멤버들을 가진 객체가 탄생하는 것이다.
속성과 기능의 각 내용은 다음과 같다.

속성 : 멤버변수, 특성, 필드, 상태
기능 : 메서드, 함수, 행위

클래스 작성방법


위에서 설명한 이론들을 보다 쉽게 이해하기 위해 우리가 실생활에서 사용하는 사물 중 하나를 골라 클래스파일을 만들어보겠다.
필자는 자동차를 좋아하기 때문에 자동차 클래스를 만들것이며, 작성방법은 다음과 같다.

class Car {

}

응..? 이게 다란 말인가..? 그렇다 이게 끝이다. 자동차 설계도가 만들어졌다. 그런데 이러면 바퀴도 없고 창문도 없고 엔진도 없는, 거기다 기능도 없는 자동차다. 간단하게 나마 속성과 기능을 조금만 추가한 자동차 설계도를 만들어보자. 코드는 다음과 같다.

class Car {
  String color;           // 자동차색
  int wheel;              // 자동차 바퀴 수
  int window;             // 자동차 창문 수
  boolean power;          // 시동 상태
  String windowStatus;    // 창문 상태

  void engine() {         // 엔진 on/off 메서드
    power = !power;
  }

  void windowUp() {       // 창문 닫는 메서드
    windowStatus = "닫힘";
  }

  void windowDown() {     // 창문 여는 메서드
    windowStatus = "열림";
  }
}

이제 좀 그럴싸한 차 설계도가 그려졌다. 빠진게 너무 많지만 그래도 차 색도 입히고 바퀴도 달고 창문도 달고 그럴싸하게 자동차같다(?). 클래스는 이러한 형태로 작성해주면된다. 클래스는 현재 변수와 메서드로 이루어져 있으며 이것이 좀전에 설명한 객체의 속성과 기능들이 되는 것이다.

 

객체(인스턴스) 생성방법


차를 만들기 위한 설계도를 작성하였으니 이제 객체로 만들어보자.
객체 생성방법은 다음과 같은 형태로 코드를 작성주면된다.

// 클래스명 변수명 = new 클래스명();
Car a = new Car();

Car클래스 타입의 참조변수 a를 선언하고 new 연산자를 사용하여 Car를 인스턴스화 한것이다. 이렇게 하면 생성된 Car인스턴스가 가지고 있는 레퍼런스를 변수 a에 담긴다.
여기서의 중요포인트는 참조변수의 타입과 객체(인스턴스)가 일치해야 한다는 것이다. 그럼 얘네는 언제어디서든지 매번 일치해야하는가? 그건 아니다. 상속이란 개념을 배우면 자연스레 알게되는데 클래스간의 부모 자식 관계가 형성이 된다면 객체 생성 시 참조변수의 타입과 객체(인스턴스)가 일치하지않아도 되는 경우가 있다. 해당 포스팅은 클래스와 객체 관련 포스팅이니 우선 일치해야한다라고 알고 넘어가자.

 

객체 사용방법


클래스 작성방법과 객체 생성방법을 알아봤다. 이번엔 클래스를 바탕으로 생성한 객체를 활용하는 방법에 대해 알아보자.
우선 클래스를 작성하고 이에 대한 객체를 생성한 전체 코드는 다음과 같다.

// Main.java
class Car {
    String color;           // 자동차색
    int wheel;              // 자동차 바퀴 수
    int window;             // 자동차 창문 수
    boolean power;          // 시동 상태
    String windowStatus;    // 창문 상태

    void engine() {         // 엔진 on/off 메서드
        power = !power;
    }

    void windowUp() {       // 창문 닫는 메서드
        windowStatus = "닫힘";
    }

    void windowDown() {     // 창문 여는 메서드
        windowStatus = "열림";
    }
}

public class Main {
    public static void main(String[] args) {
        Car a = new Car();
    }
}

이제 여기서 우리는 자동차 객체를 간단히 다뤄 볼것이다. 필자는 자동차의 색을 노랗게하고 시동을 걸어보겠다. 코드는 다음과 같다.

// Main.java
class Car {
    String color;           // 자동차색
    int wheel;              // 자동차 바퀴 수
    int window;             // 자동차 창문 수
    boolean power;          // 시동 상태
    String windowStatus;    // 창문 상태

    void engine() {         // 엔진 on/off 메서드
        power = !power;
    }

    void windowUp() {       // 창문 닫는 메서드
        windowStatus = "닫힘";
    }

    void windowDown() {     // 창문 여는 메서드
        windowStatus = "열림";
    }
}

public class Main {
    public static void main(String[] args) {
        Car a = new Car();
        a.color = "yellow";
        a.engine();
    }
}

그렇게 어렵지 않다. 자동차색을 노란색으로 입히고 시동을 걸기 위해 참조변수 a에 접근하여 해당 객체가 가지고 있는 멤버변수와 메서드에 접근해 속성값을 할당 및 변경하였다.

객체를 사용하기 위한 포인트는 해당 객체를 담고있는 참조변수를 활용하는 것이며, 해당 참조변수의 타입은 객체의 타입과 일치해야한다. 해당 결과를 출력해보면 자동차의 색은 노란색으로, 엔진은 true로 정상 변경된 것을 확인할 수 있다.

객체는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 객체의 타입과 일치해야 한다.


읽어주셔서 감사합니다. 😊

 

Reference
자바의 정석 - 남궁성

반응형

'JAVA' 카테고리의 다른 글

JAVA / 오버로딩이란  (0) 2020.04.03
JAVA / 메서드(method)  (0) 2020.04.03
JAVA / 배열  (0) 2020.03.31
JAVA / 캐스팅(형변환)이란?  (0) 2020.03.30
JAVA / 상수와 리터럴  (0) 2020.03.27