[OOP] 객체란?

객체란?

어떤 프로그래밍 언어를 먼저 공부하더라도 항상 배우는 주제가 있습니다. 바로 자료형입니다. 처음에는 기초적인 자료형과 변수 몇개로 프로그램을 작성했었습니다. 그러나 점점 프로그래밍이 발전하면서 하나의 변수에 여러가지를 담기는 어려운 일이였고 이에 따라서 하나의 구조에 여러 가지 정보를 담은 자료형이 필요하게 되었습니다. 따라서, 서로 연관된 정보를 묶어서 하나의 구조에 담은 객체가 만들어지게 됩니다.

 

여러분이 음악 학원을 운영하고 있고 다음과 같은 회원 정보를 저장하고 싶다고 해봅시다.

이름 악기 나이 레벨
Daniel piano 25 1
Daniel guitar 27 2
Alvin piano 25 2

 

여러분은 자바를 배운지 얼마 안된 상태이고 위의 정보를 다음과 같이 배열에 정리하려고 합니다.

    String[] names = {"Daniel", "Daniel", "Alvin"};
    String[] instruments = {"piano", "guitar", "piano"};
    int[] ages = {25, 27, 25};
    int[] levels = {1, 2, 2};

만약에 이름 순으로 회원을 정렬하고 싶다면 이름 배열을 정렬하면 회원들이 이름 순으로 정렬된 정보를 얻을 수 있습니다. 하지만 여기서 고려해봐야할 것이 몇 가지 존재합니다. 

  1. 회원의 각 속성 (이름, 악기, 나이, 레벨)에는 겹치는 속성들이 존재합니다. 이름 순으로 정렬한다면 이 자료들은 뒤섞이게 됩니다.
  2. 이름 순으로만 정렬한다면 다른 배열은 그대로 있을 것이기 때문에 마찬가지로 회원 정보가 뒤섞이게 됩니다.

따라서 우리는 그 전에는 사용하지 않았던 새로운 구조를 통해서 각 속성들을 하나로 묶어주어야 회원 정보들이 뒤섞이지 않고 안전하게 저장할 수 있다는 사실을 알게 됩니다. 

 

우리는 이를 위해 회원에 해당하는 클래스를 만들어서 각 회원의 해당하는 정보를 한 곳에 모아서 저장할 수 있습니다. 이때 사용하는 아래와 같은 구조를 클래스라고 합니다. 우리는 이 클래스를 통해 회원 객체를 만들어서 회원 배열에 저장함으로써 더 이상 어떻게 회원들을 정렬할지 고민하지 않아도 됩니다. 이 때, 클래스를 통해 객체를 만드는 과정을 클래스의 인스턴스화라고 하고 이 과정을 통해 만들어지는 인스턴스 또한 객체입니다.

public class Member {
        String name;
        String instrument;
        int age;
        int level;
}

이제 여러분은 새로운 자료형을 통해서 여러분의 목적을 달성했습니다. 하지만 일정 기간이 지나서 회원 레벨을 올려줄 시간이 되거나 해가 바뀌어서 나이를 바꿔야 한다고 가정하면 어떻게 수정하면 좋을까요? 레벨과 나이는 단지 올라가기만 할뿐 줄어들지 않습니다. 그러면 그동안 배운 것을 기반으로 클래스 외부에 함수를 만들어서 레벨과 나이가 올라갈 수 있도록 할까요?  

 

객체는 나이, 이름과 같은 상태 정보뿐만 아니라 기능 정보인 메서드를 가지고 있습니다. 객체는 메서드를 통해서 이 객체가 어떤 기능을 가지고 있는지 보여줍니다. 따라서 클래스 내부에 메서드를 정의하면 매번 외부에 새로운 코드를 작성할 필요 없이 단순히 메서드 (기능)을 호출함으로써 이를 해결할 수 있습니다.

public class Member {
        String name;
        String instrument;
        int age;
        int level;
        
    void levelUp() {
    	this.level++;
    }
    
    void growOld() {
    	this.age++;
    }
}

이처럼 객체는 상태 정보인 속성과 기능을 가지고 정의되며 매번 새로운 회원이 들어오더라도 새로운 코드를 작성할 필요가 없게 됩니다. 객체지향언어인 자바에서는 미리 만들어둔 클래스를 API를 통해 제공함으로써 개발자에게 자주 사용되는 클래스를 새로 만들 수고를 덜어줍니다. 자바는 객체를 통해서 개발과정에서의 불필요한 코드의 재사용을 줄여주고, 유지 보수를 쉽게하며, 제어자와 메서드를 통해서 필요한 정보만 접근하고 수정할 수 있도록 합니다. 이는 비단 자바뿐만 아니라 모든 객체지향언어 (파이썬, C++)에서 통용되는 개념입니다.