본문 바로가기
Study/JAVA

[Java] 6-1, 2 객체지향언어, 클래스와 객체

by jeongwle 2022. 9. 1.
728x90
반응형

 

객체지향언어

객체지향이론의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.' 라는 것이다. 실제 사물의 속성과 기능을 분석한 다음에 데이터(변수)와 함수로 정의하여 실제 세계를 컴퓨터 속에 옮겨 놓은 듯한 가상세계를 구현하고 이 가상세계에서 모의실험을 하여 시간과 비용을 절약할 수 있다. 객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 발전되었다.

객체지향언어는 기존의 프로그래밍언어와 다른 새로운 것이 아니다. 기존의 언어에 몇 가지 새로운 규칙을 추가한 발전된 형태이다. 객체지향언어의 가장 큰 장점은 코드의 재사용성이 높고 유지보수가 용이하다는 것이다. 객체지향개념을 학습할 때 재사용성과 유지보수 그리고 중복된 코드의 제거, 이 세 가지 관점에서 보면 보다 쉽게 이해할 수 있다.

객체지향언어의 주요 특징
1. 코드의 재사용성이 높다.
   새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
   코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
   제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
   코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.​

 

클래스와 객체

1. 클래스와 객체의 정의와 용도

클래스는 객체를 정의해 놓은 것 또는 객체의 설계도라고 정의할 수 있다. 클래스는 객체를 생성하는데 사용된다.

프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다. 클래스는 단지 객체를 생성하는데 사용될 뿐 객체 그 자체는 아니다. 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다. 설계도를 잘 만들어 놓으면 만들 때마다 설계로를 참고하여 만들면 된다. 마찬가지로 클래스 또한 잘 만들어놓으면 고민없이 객체를 생성하기만 하면 된다.

 

2. 객체와 인스턴스

클래스를 이용해 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 한다. 그리고 그렇게 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다. 인스턴스는 객체와 같은 의미이지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미라면 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적인 의미이다.

 

3. 객체의 구성요소

객체는 속성과 기능 두가지로 이루어져 있다. 일반적으로 객체는 다수의 속성과 기능을 갖는다. 그리고 그 객체가 가지고 있는 속성과 기능을 객체의 멤버(구성원, member)라 한다. 하지만 우리는 앞으로 속성보다는 멤머변수라는 단어를 사용할 것이고 기능 보다는 메서드라는 단어를 사용할 것이다. TV를 예시로 하여 클래스를 만들어 보자
class Tv {
  String color; // 색
  boolean power; // 전원 상태
  int channel; // 채널
  
  void power()		{ power = !power; }
  void channelUp()	{ channel++; }
  void channelDown()	{channel--; }
}​

실제 TV랑 완전 일치하는 것은 아니지만 이해를 돕기위해 예시로 간단하게 만든 것이다.

 

4. 인스턴스의 생성과 사용

클래스를 이용해 인스턴스를 생성하는 방법은 여러가지가 있다. 일반적으로 사용하는 방법을 알아보자
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;
t - new Tv();​

다음 예제를 보자.
class Tv {
    String color;
    boolean power;
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

public class TvTest {
    public static void main(String[] args) {
        Tv t;
        t = new Tv();
        t.channel = 7;
        t.channelDown();
        System.out.println("t.channel = " + t.channel);
    }
}​

이렇게 클래스를 이용해 인스턴스를 생성하고 그 안의 멤버변수와 메서드는 '참조변수.멤버변수', '참조변수.메서드' 이렇게 사용할 수 있다. 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다. 참조변수에는 하나의 값(주소)만이 저장될 수 있다.

둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는)것은 가능하다. 하지만 하나의 참조변수가 여러 개의 인스턴스를 가리키는 것은 불가능하다.

 

5. 객체 배열

객체 역시 배열로 다룰 수 있다. 이를 객체 배열이라 한다. 객체 배열 안에 객체가 저장되는 것은 아니고 객체의 주소가 저장된다. 참조변수들을 하나로 묶은 참조변수 배열인 셈이다.
Tv[] tvArr = new Tv[3];

tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

// 배열의 초기화 블럭 사용 시

Tv[] tvArr = { new Tv(), new Tv(), new Tv() };​

다루어야할 객체가 많다면 for문을 사용하면 된다.
모든 배열이 그렇듯 객체 배열도 같은 타입의 객체만 저장할 수 있다. 여러종류의 객체를 하나의 배열에 저장할 수 있는 방법은 나중에 나온다.(다형성에서)

 

6. 클래스의 또 다른 정의

프로그래밍적인 관점에서 클래스의 정의와 의미를 살펴보자.
1. 변수	하나의 데이터를 저장할 수 있는 공간
2. 배열	같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체	서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스	데이터와 함수의 결합(구조체 + 함수)​

1. 클래스 - 데이터와 함수의 결합
프로그래밍언어에서 하나의 데이터를 저장하기 위해 변수를, 그리고 같은 종류의 데이터를 보다 효율적으로 다루기 위해서 배열이 등장했고 후에는 구조체(structure)가 등장하여 자료형의 종류에 상관없이 서로 관계가 깊은 변수들을 하나로 묶어서 다룰 수 있도록 했다.

그동안 데이터는 데이터끼리 함수는 함수끼리 따로 다루어져왔다. 그러나 사실 함수는 주로 데이터를 가지고 작업을 하기 때문에 많은 경우에 있어서 데이터와 함수는 관계가 깊다. 그래서 자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 한 것이다.

2. 클래스 - 사용자정의 타입(user-defined type)
프로그래밍언어에서 제공하는 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입이라 한다. 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다. 이를 이용해 프로그래머가 새로운 타입을 추가할 수 있다.
728x90
반응형

댓글