OOP ( Object Oriented Programing ) - 객체 지향 프로그래밍이란?

hkoo9329·2020년 1월 16일
0

개발 상식 공부

목록 보기
1/2

객체 지향?

자바하면 떠오르는것 그것은 객체 지향 프로그래밍이다. 객체지향이란 프로그램을 수많은 객체라는 기본 단위로 나누고 이런 객체들간의 상호 작용으로 하나의 큰 프로그램을 완성해가는 방식을 말한다. java에서 객체는 메소드와 변수(데이터)의 묶음이라고 생각할 수 있고, 이는 java에서 class다.
즉, 특정한 기능 혹은 특정 물체를 class로 만들어 사용할떄 인스턴스화해서 사용하는것이다.
예로 설명하자면, 자동차라는 프로그램을 만들기 위해서 핸들, 바퀴, 엔진 등의 객체를 만들고, 각각의 객체에는 데이터와 동작(메소드)가 존재한다.
핸들 객체에는 현재 방향이라는 데이터가 있고 방향의 이동이라는 동작 메소드로 이동할 방향을 설정하고, 바퀴 객체와의 상호작용으로 바퀴의 방향을 움직인다. 그 결과로 프로그램인 차의 방향이 설정되고 움직인다.

OOP의 장단점

장점

  • 코드 재사용이 용이
    엔진이라는 class를 만들었다면 경운기라는 프로그램을 만들때 이 클래스를 그대로 가져와 인스턴스화해서 사용하면 된다. 그리고 다른 기능을 추가해야할 필요가 있다면 상속해서 추가 기능을 만들어서 사용하면 된다.

  • 유지유수가 쉬움
    절차 지향 프로그래밍에서는 코드를 수정해야할 때 문제 부분을 일일이 찾아야하지만, 객체 지향 프로그래밍에서는 수정해야 할 부분이 어느 클래스인지 클래스의 멤버 변수 혹은 메서드인지 알 수 있기 때문에 해당 부분만 수정하면 된다.

    이것은 클래스의 모듈화를 잘 시켰을때 이야기이고, 클래스간에 객체간에 응집도가 낮고 결합도가 높다면 유지보수는 매우 어려워진다. 즉, 객체간 서로 의존적으로 설계를 한다면 OOP의 장점은 없어진다.

  • 대형 프로젝트에 적합
    클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트에서 각 모듈별로 업무를 분담하기 쉽다.

단점

  • 처리속도가 상대적으로 느림
    이러한 이유에서 빠른 속도, 빠른 상호작용를 요구하는 게임같은 프로그램에서는 C언어를 더 선호한다.

  • 객체가 많으면 용량이 커질 수 있음

  • 설계시 많은 시간과 노력이 필요
    앞에서 말한것처럼 객체를 상호의존적으로 만들어 버리면 OOP를 하는 의미가 퇴색된다.

OOP의 특징

OOP라고 하면 빠지지 않고 등장하는 몇 가지 특징이 있다.

1. 자료의 추상화 (추상화 Abstract)

추상화는 목적과 관련이 없는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다.
즉, 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다. 이것에 대해서 좀 더 자세히 설명하려면 추상화클래스와 인터페이스에 대해서 설명해야하는데 이는 나중에 설명하기로 하고....
지금은 추상화가 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이다 정도로만 이해하면 되겠다.

2. 캡슐화 (Encapsulation)

캡슐화는 객체를 캡슐에 넣어서 보호한다고 생각할 수 있다. 다시 말하자면

  • 객체에 필요한 기능, 관련된 기능을 한 곳에 모으고 분류하기 떄문에 객체의 재활용을 원활하게 해준다.
  • 외부에 알려줄 필요하가 없거나, 외부에서 접근하면 객체의 동작에 영향을 미치는 중요 데이터나 메소드가 있을때 있다. 이를 private로 접근제어를 해주면 캡슐안에 중요 데이터의 접근이나 변경을 막을 수 있다. 이를 정보은닉이라고 한다.
  • Getter, Setter를 사용하는 이유도 이러하다.

    getter, setter로 아무나 접근 가능한데 왜 private를 해? 라고 생각할 수 있다. 나 또한 그렇게 생각했었다.
    getter로 int와 string은 값을 넘길시 스스로 객체를 복사하여 사용하기 때문에 복사본을 넘긴것임으로 상대방에서 무엇을 하더라도 원본은 이상이 없다. 하지만 객체를 넘길때는 참조 값을 넘긴다. 이러면 문제가 되는데 메서드를 통해서 접근함으로 메서드 안에서 요청에 대해 올바른지 않은지 확인하여 처리하거나 제한할 수 있게 조절할 수 있다는 점에서 사용을 하고 있다.

3. 상속

상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고, 일부분 변경해야할 경우 상속 받은 자식클래스에서 해당 기능만 다시 재정의하거나 추가하여 사용하는 것이다.

자바에서 다중상속은 불가하다. 클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 자바에서는 공식적으로 불가. 하지만 편법으로 인터페이스를 통한 다중 상속은 가능. 추후 java 버전에서는 가능할지도?

이러한 상속은 코드의 재사용을 편리하게 해주고 개발 속도를 빠르게 해준다.

4. 다형성

하나의 같은 메소드(메소드 이름이 같은)가 상황에 따라 다른 기능을 하는 것을 말한다.
자바에서 이를 표현하는 것이 크게 2가지가 있다.

1. 오버라이딩(Overriding)

  • 부모 클래스의 상속 받은 메서드를 자식 클래스에서 재정의 하는것을 말한다.
  • 예를 들어 부모 클래스로부터 밴츠 자동차 객체 상속 받은 자식 클래스는 현대 자동차 객체라면 현대차에 맞게 자동차 로고 메소드를 자신에 맞게 재정의하는 것.

2. 오버로딩 (Overloading)

  • 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개 변수에 따라 다르게 호출할 수 있는것을 말한다.
  • 같은 이름의 메소드라도 매개변수에 따라서 다른 기능을 할 수 있도록 만들 수 있다.

5. 동적 바인딩

OOP에서 동적 바인딩에 대한 언급이 많지는 않은것 같다. 그래도 언급되는 특징이니 다뤄보도록 하자.

바인딩이란?

프로그래밍 용어로서, 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것. 프로그램 내에서 변수, 배열, 라벨, 정차 등의 명칭, 즉 식별자(identifier)가 그 대상인 메모리 주소, 데이터형 또는 실제 값으로 배정되는 것이 이에 해당.
원시 프로그램의 컴파일링 또는 링크 시에 확정되는 바인딩을 정적 바인딩(static binding)이라 하고, 프로그램의 실행되는 과정에서 바인딩되는 것을 동적 바인딩 (dynamin binding)이라고 한다. 프로그램 작성에서는 바인딩을 가급적 뒤로 미루도록 권고하고 있다.

위에 간단한 클래스 3개가 있다. Test는 두 개의 클래스를 인스턴스화해서 테스트하는 클래스이고,
Car는 부모 클래스, Sonata는 Car를 상속받는 클래스이다. Car 클래스의 getName() 메소드를 오버라이딩 하였다.
Test를 보면 c와 s라는 이름의 Car 형의 객체 두 개가 생성되어 있다.하지만 c는 Car의 인스턴스를 s는 Sonata의 인스턴스를 나타내고 있다.
그리고 둘다 getName() 메소드를 호출한다. getName() 메소드가 오버라이딩 되어있기 때문에 세 번째 줄과 네 번째 줄의 getName()이 어떤 클래스의 getName을 나타내는지는 컴파일시에 결정되지 않는다.
getName() 메소드가 어떤 클래스의 메서드를 나타내는지는 런타임시간, 즉 Test 클래스 파일이 실해하는 시점에서 결정이 된다는 말이다.
이것이 동적바인딩이라는 개념이다.
자바에서 동적바인딩을 하는 것은 맞는 말이지만 모든 메소드에 대해 동적 바인딩을 하는 것은 아니다.

모든 인스턴스 메소드는 런타임시에 결정되지만 스태틱(static) 메소드는 컴파일 시에 결정이 된다. 인스턴스 변수 또한 컴파일시에 결정된다.

참조 사이트

profile
코딩 잘하고 싶다

0개의 댓글