객체지향 핵심 개념

객체지향의 개념

객체지향(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)