[Java] 객체 지향 프로그래밍
객체 지향
객체 지향이란 현실 세계의 객체 모델을 바탕으로 프로그램을 구조화하고 개발하는 프로그래밍 기법을 말한다. 전통적인 프로그래밍 언어는 크게 객체 지향 프로그래밍 언어(Object Oriented Programing Language; OOP)와 절차 지향 프로그래밍 언어(Procedure Oriented Programming Language; POP)로 구분된다.
이는 과거 프로그래밍 언어의 구조적 특징에 따른 분류이며, 최근에 널리 쓰이고 있는 프로그래밍 언어들은 기본적으로 객체 지향에 기반을 두고 있다. 자바의 경우 JDK8에서부터 이러한 최신 경향을 반영하기 시작했다.
절차 지향은 순서대로 진행되며 순서가 틀려서는 안되고 어느 한 부분이 오류가 나면 그다음부터 전체적으로 마비가 되는 순차적인 처리가 중요한 방식이다.
객체 지향은 순서 상관없이 독립적으로 사용이 가능하며, 이러한 객체들을 상호작용하여 설계할 수 있고, 하나의 객체가 오류가 나도 다른 객체에 영향을 주지 않는 방식이다. 프로그램(실제 세계)를 객체(사물)라는 기본 단위로 나누고 이 객체들간의 상호작용을 기본 개념으로 한다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 재사용성이 용이하고 대규모 프로젝트에서 많이 사용되는 방법론이다. 프로그램 개발과 유지보수가 용이하다는 점이 가장 큰 장접으로 꼽힌다.
객체 지향 프로그래밍의 구성요소
객체 지향 프로그래밍의 요소는 크게 객체, 메소드, 클래스로 이루어져 있다.
- 객체(Object)
- 사전적인 의미로는 오감을 통해 알 수 있는 물건, 물체
- 실제 우리 눈에 보이는 대상이며 구체적인 값을 가지고 있음
- 일반적으로 객체가 가지고 있는 속성과 객체가 할 수 있는 동작으로 설명 가능
# 속성
- 색상: 빨간색
- 제조사: 현대
- 모델명: 소나타
- 출력: 180 마력
- 타이어: 17인치
...
# 동작
- 시동: 엔진을 동작 시킴
- 전진: 차를 앞으로 움직이게 함
- 후진: 차를 뒤로 움직이게 함
- 브레이크: 속도를 감소 시킴
...
- 메소드(Method)
- 객체의 동작을 정의한 것
- 실제 프로그램 안에서 속성은 필드(멤버변수)의 형태로, 동작은 메소드의 형태로 표현
- 클래스(Class)
- 객체를 정의하기 위한 틀
- 표현하고자 하는 객체들의 속성과 동작의 집합
- 클래스의 구성요소로 필드, 메소드, 생성자가 있음
- 필드 : 클래스에 포함된 변수
- 메소드 : 특정 작업을 수행하기 위한 문장들의 집합
- 생성자 : 인스턴스 초기화 메소드
// Class : 객체의 속성과 동작의 집합
class Car {
// 필드(멤버변수) : 속성
String color;
String model;
int power;
// method 1 : 동작
public void go() {
// ...
}
// method 2 : 동작
public void break() {
// ...
}
}
인스턴스
인스턴스는 클래스를 통해 만들어진 구체적인 객체라고 볼 수 있다. 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.
=> A 클래스에서 만들어진 객체를 A 클래스의 인스턴스라고 한다. 결과적으로 객체 = 인스턴스로서 같은 의미로 사용된다.
개발자의 입장에서 인스턴스화란 객체를 선언하고 초기화하여 메모리상에 올라온 상태를 말한다.
인스턴스화 하기 위해 클래스의 생성자 메소드를 통해 객체를 초기화한다.
class Car {
String color;
String model;
int power;
// 클래스의 생성자 메소드
Car (model, color, power) {
this.model = model;
this.color = color;
this.power = power;
}
public void go() {
// ...
}
public void break() {
// ...
}
}
// 객체 초기화(인스턴스화)
Car avante = new Car();
Car k3 = new Car('k3', 'white', '180');
avante.go();
k3.break();
객체 지향의 특징
객체지향의 특징은 추상화, 캡슐화, 상속, 다형성이 있다.
1. 추상화(Abstraction)
객체지향에서 추상화란 객체에서 공통된 속성과 행위를 추출하는 것을 의미한다.
예를들어, 게임 프로그램을 개발하며 캐릭터가 소지하는 다양한 무기들이 있다. 칼, 삽, 곡갱이, 총, 활 등 여러가지 무기들이 존재하는데
이들의 기능적인 내용은 다르지만 공통적인 속성과 행위를 개념으로 무기라는 클래스를 정의할 수 있다.
이렇듯 추상화는 다른 객체들과 구분되는 핵심적인 부분에 집중하여, 복잡도를 관리할 수 있게 해준다.
2. 캡슐화(Encapsulation)
캡슐화는 연관있는 변수와 메소드를 묶어주는 작업을 말한다.
접근 제어 지시자[public, private, protected]를 통해 외부로부터의 접근을 제한하여 객체내에서만 접근이 가능하도록 해준며,
이를 정보은닉이라 한다.
외부의 클래스 혹은 모듈에 의존적인 프로그램의 경우 변경이나 오류에 취약해지는데, 정보은닉을 통해 이러한 결합도를 낮추며 응집도를 높여준다.
3. 상속(Inheritance)
클래스 개념이 도입되면서 상속을 통해 부모클래스의 속성과 기능을 이어받아(상속받아) 사용하는 것을 말한다.
프로그램을 개발하다보면 중복되는 속성과 기능을 개발해야하는 일이 발생되는데 상속을 사용한다면 중복되는 기능을 반복하여 작업하지 않고 작업을 할 수 있게 해준다.
- 자식클래스는 상속을 통해 부모클래스의 속성과 기능을 물려받는다.
- 또한, 다형성을 통해 변경이 필요한 부분을 변경하여 사용할 수 있다.
4. 다형성(Polymorphism)
다형성이란 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 동일한 변수, 함수명 등이 다양한 방법으로 기능하는 것을 말하며
오버라이딩(Overriding), 오버로딩(Overloading)이란 형태로 제공된다.
자세한 내용은 추 후에 다뤄보도록 하겠다.
참고
https://dinfree.com/lecture/language/112_java_4.html