객체지향 핵심 개념
객체지향의 개념
객체지향(OOP, Object Oriented Programming)의 등장 배경
- 1960년대 말, ‘소프트웨어 위기론’이 등장
- 시스템을 구성하는 각각의 기능들이 독립적인 모듈로 개발된 하드웨어와 달리 모듈화가 되지 않은 소프트웨어에 대한 불편함이 제기됨 -> 소프트웨어의 모듈화 요구(객체지향 패러다임)
절차지향 프로그래밍과 객체지향 프로그래밍
절차지향 프로그래밍
- 실행되는 순서가 위에서부터 아래로 순차적으로 진행되는 형태를 가진 언어
- 프로그램 재사용 시 기존에 만들어진 코드를 복사하여 붙여넣기 하는 방식을 사용
- 모듈화를 시도한 함수 기반 절차지향 프로그램의 경우 데이터와 함수 간 유기적인 관계성을 갖지 않는다는 문제점이 있었음
객체지향 프로그래밍
- 함수에서 나아가 더 나은 모듈화를 제공하기 위해 변수와 메서드를 가진 객체가 등장
- 유지, 보수가 더 쉽고 객체 간 자유롭게 데이터를 이동할 수 있음
객체, 클래스, 인스턴스
객체(Object)
- 현실 세계에 존재하는 유, 무형의 모든 것, ex) 자동차
- 객체는 상태(속성)와 행위(기능)를 가짐
- 정적인 요소(속성) : 변수(variable), ex) 이름, 속도, 색갈, 제조사
- 동적인 요소(기능) : 메서드(method), ex) 시동켜기(), 가속하기(), 감속하기(), 시동끄기()
- 현실의 객체가 갖는 속성과 기능은 추상화(abstraction)되어 클래스에 정의됨
- 클래스를 구체화한 것
- 실제로 동작하는 것
- 메모리에 생성된 데이터
클래스(Class)
- 현실 세계의 객체를 컴퓨터 메모리에 생성할 수 있는 템플릿, 틀
- 클래스는 구체화되어 프로그램의 객체(instance, object)가 됨
- 객체를 정의해놓은 것
- 객체를 생성할 때 사용
- 데이터타입
Java
Class Car {
String name;
int speed;
String color;
String company;
void startEngine(){}
void accelerate(){}
void decelerate(){}
void stopEngine(){}
}
인스턴스(Instance)
- 클래스로부터 생성된 컴퓨터 메모리에 존재하는 객체
- ex) “Yellow Car”, 300, “Yellow”, “K사 자동차”
- 같은 클래스로부터 생성된 객체는 모두 같은 상태와 기능을 지님. 상태의 속성값은 다를 수 있음(ex. 색상은 다를 수 있음)
- 같은 클래스로부터 생성(
new
)된 객체는 모두 다르다.(모두 별개의 객체, 별개의 메모리 주소를 가짐. 참조값도 다름)
/* String 생성에 따른 참조값 비교 */
String s1 = "hello"; // String은 클래스 중 유일하게 new로 생성하지 않아도 되는 클래스
String s2 = new String("hello"); // heap에 존재하는 객체
(s1 == s2) -> false // 같은 객체를 가리키지 않음(참조값이 다름)
String s3 = "hello"; // 문자열 상수 pool에 존재하는 객체
(s1 == s3) -> true // pool에 해당 문자열이 있으면 pool에서 참조값 가져다 씀
문자열 객체가 저장하고있는 문자열 값을 비교하고 싶다면
s.equals(s2)
를 이용하면 됨.
객체지향 언어의 주요 개념
상속과 다형성
상속(Inheritance)
- 기존에 잘 정의된 클래스로부터 변수와 메서드를 재사용할 수 있음
- 추가되는 기능만을 새롭게 정의하여 새로운 클래스를 정의할 수 있음 ex) 공통 규정 + (A 직군 규정, B 직군 규정, C 직군 규정)
- 클래스들을 계층 구조화할 수 있음 ex) (자동차 - (승용차, 버스 - (관광버스, 시내버스)))
- 코드의 재사용성을 높임
다형성(Polymorphism)
- 동일한 인터페이스를 이용하여 서로 다른 구현 객체를 일관된 방법으로 사용할 수 있음
- 프로그램의 유지보수성을 향상시키는 객체지향의 핵심 개념
-
메서드 다형성
- 메서드 오버로딩(Overloading) : 한 클래스 안에 같은 이름의 메서드를 여러개 정의하면서, 그 인자의 개수, 유형을 다르게 해놓은 형태
- 메서드 오버라이딩(Overriding) : 상속관계에 있는 하위 클래스가 상위 클래스가 갖고 있는 메서드를 재정의 하는 것, 재정의된 메서드가 선언된 형태는 상위 클래스에서 선언된 것과 같음
-
객체 다형성
- 데이터의 묵시정, 명시적 형변환
- 자식 클래스 객체 생성시 부모 클래스와 자식 클래스, 모두의 타입으로 생성 가능
추상화, 캡슐화, 정보 은닉, 메시지
캡슐화(Encapsulation)
- 변수와 변수를 이용하여 로직을 처리하는 메서드를 하나의 클래스로 묶는 과정
- 변수와 변수를 처리하는 메서드를 하나로 묶어 변수와 메서드가 독립적으로 동작하지 않도록 함
- 객체가 제공하는 메서드를 통해 객체를 이용하고, 데이터가 실제로 어떻게 처리되는지는 알 필요 없음
추상화(Abstraction)
- 현실 세계에 존재하는 객체들의 공통적인 특성을 모아 일반화해 놓은 것
- 클래스 정의에 사용되는 개념
- ex) 비행기, 자동차, 열차, 배를 운송수단으로 추상화
정보 은닉(Encapsulation)
- 클래스에 포함된 변수나 메서드를 선택적으로 공개하거나 숨김
- Private(접근 불가능), Public(접근 가능)으로 구분하여 기술
메시지(Message)
- 객체 간 서로 통신하는 방법
- ex) 차의 기어를 3으로 변경해줘 :
myCar.changeGear(3)