💬 객체지향이론의 기본 개념
실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.`
객체지향이론의 기본 개념은 실제 사물의 속성
과 기능
을 데이터(변수)
와 함수
로 정의하여 실제 세계를 컴퓨터 속에 반영하는 것이다.
그렇다면 기존의 프로그래밍 언어와 완전히 다른 새로운 개념일까? 아니다. 기존 프로그래밍 언어에 코드 간에 서로 관계를 맺어 주는 몇 가지 새로운 규칙이 추가된 것이다.
이러한 객제지향언어의 큰 장점은 코드의 재사용성이 높고 유지보수가 용이하다
는 것이다. 이렇게하여 프로그램의 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선하였다.
💬 앞으로 상속, 다형성 등의 객체지향개념을 공부할 때 세 가지 관점에서 바라보자.
재사용성, 유지보수, 중복된 코드의 제거
클래스란 객체를 정의해 놓은 것이고, 객체를 생성하는데 사용된다.
클래스와 객체의 관계는 TV 설계도와 TV, 붕어빵틀과 붕어빵의 관계라고 할 수 있다. 즉, 클래스는 단지 객체를 생성하는데 이용할 뿐, 객체 그 자체는 아니다.
🤔 왜 클래스를 정의하여 클래스를 통해 객체를 생성할까?
매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지 고민하지 않아도 된다 !
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화
라고하고, 그 클래스로부터 만들어진 객체를 클래스의 인스턴스
라고 한다.
'책상은 인스턴스'보다 '책상은 객체'다.
'책상은 책상의 클래스의 객체'보다는 '책상은 책상 클래스의 인스턴스다' 라고 하는 것이 자연스럽다.
객체는 속성과 기능의 집합이다. 클래스로부터 객체를 생성하면(클래스의 인스턴스화), 클래스에 정의된 속성과 기능을 가진 객체가 생성되는 것이다.
속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function): 메서드(method), 함수(function), 행위(behavior)
위 처럼 TV 클래스를 선언한 것은 설계도 작성에 불과하다. 따라서 Tv 인스턴스를 생성해야한다.
💡 인스턴스 생성 과정
1. 클래스의 객체를 참고하기 위한 참조 변수 선언
2. 클래스의 객체를 생성하여 객체의 주소를 참조 변수에 저장
인스턴스 생성 예제
Tv t; // 1. 클래스의 객체를 참고하기 위한 참조 변수 t 선언
t = new Tv(); // 2. Tv 인스턴스 생성하고, 생성된 인스턴스 주소를 참조 변수 t에 저장
Tv t = new Tv(); // 이렇게 한 줄로 작성할 수 있다.
⭐ 인스턴스는 오직 참조변수를 통해서만 다룰 수 있다.
많은 수의 객체를 다루기 위해 객체 배열
을 사용할 수 있다. 이때 객체 배열 안에는 객체가 저장되는 것이 아니라, 객체의 주소가 저장된다.
따라서, 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열이다.
Tv tv1, tv2, tv3;
Tv[] tvArr = new Tv[3]; // 길이가 3인 객체 배열 tvArr
자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게했다.
예를 들어, C언어에서는 문자열을 문자의 배열
로 다루지만, 자바에서는 String
이라는 클래스로 문자열을 다룬다. 이를 통해 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶어서 다룰 수 있다. 이렇게하면 변수와 함수가 서로 유기적으로 연결되어 작업이 간단하고 명료해진다.
하나의 시간을 구성하는 시, 분, 초가 서로 분리되어 있어 프로그램 수행과정에서 시, 분, 초가 뒤섞여 올바르지 않은 데이터가 될 가능성이 있다.
int hour1, hour2, hour3;
int minute1, minute2, minute3;
float second1, second2, second3;
int[] hour = new int[3];
int[] munute = new int[3];
float[] second = new float[3];
위의 코드를 시, 분, 초 세 변수를 멤버변수로 갖는 Time클래스를 정의한다. 시, 분, 초가 하나의 단위로 묶여 정확한 데이터를 유지할 수 있다.
class Time {
int hour;
int minute;
int second;
}
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();
Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
또한, 여기에 아래의 제약조건이 붙었다고 가정해보자.
1. 시, 분, 초는 모두 0보다 크거나 같다.
2. 시의 범위는 0 ~ 23, 분과 초의 범위는 0 ~ 59이다.
이럴 경우 데이터와 함수가 결합된 클래스를 이용하면 추가적인 조건들을 반영하기 쉽다.
class Time {
int hour;
int minute;
int second;
public void setHour(int h) {
if (h < 0 || h > 23) return;
hour = h;
}
public void setMinute(int m) {
if (m < 0 || m > 59) return;
minute = m;
}
public void setSecond(float s) {
if (s < 0.0f || s > 59.99f) return;
second = s;
}
}