본문으로 바로가기

객체 지향 프로그래밍 (OOP : Object-Oriented Programming)

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중에 하나이다. 패러다임이란 프로그래밍을 어떤 관점에서 해나갈 것인가에 대한 고민이다. 기존 절차 지향 프로그래밍 언어들이 프로그램의 프로세스 흐름을 표현(명령어의 목록이다라고 생각)하는데 중점을 두었다면, 객체 지향 프로그래밍 언어들은 데이터나 정보의 표현에 중점을 둔 언어들이다. 프로그램을 여러 개의 독립적인 단위, 즉 '객체'들의 모임으로 생각하는 것이다. 추가적으로 함수형 프로그래밍은 상태값을 지니지 않는 함수값들의 연속으로 생각할 수 있게 해준다.

자바는 대표적인 객체 지향 패러다임을 따르는 언어지만 jdk 1.8부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했다. 자바는 태생부터 함수형 패러다임을 지원하는 다른 언어와 달리 여전히 함수를 일급객체로 취급하지는 않는다. 자바에서 람다식은 함수형 인터페이스를 구현하는 익명 클래스의 인스턴스를 생성하며, 좀더 간단한 표현을 위해 컴파일러의 타입 추론이 동원된다)


 

# Abstraction (추상화)

객체들에게서 공통적인 속성과 행위를 추출하는 것을 추상화하고 한다.

예를 들어, 아우디, 벤츠, BMW가 있다고 하자. 아우디, 벤츠, BMW는 속도와 엔진 크기, 용량 등의 공통된 데이터가 있고, 달린다는 공통된 행위를 가지고 있다. 아우디, 벤츠, BMW가 공통적으로 가지고 있는 특징들들을 가지고 클래스를 정의하는 과정을 추상화라고 한다.

 

# Capsulation (캡슐화)

 객체의 상세한 내용은 객체 외부로부터 숨기고 제한된 데이터와 메소드 만을 노출시켜 객체와 상호작용을 할 수 있도록 하는 것을 캡슐화라고 한다.  변하기 쉽고 감추고 싶은 정보는(내부에서 사용하는 자료 구조 형태, 멤버 변수 등) 외부에서 접근하지 못하도록 제한(은닉)하고(information Hiding (정보 은닉)) 필요한 메소드들만 공개하여 기능을 수행할 수 있도록 한다.

예를 들어, 자바에서는 클래스를 선언하고 그 클래스를 구성하는 객체에 대하여 'public' 또는 'private' 등으로 접근 제한자를 정의해준다. 이렇게 되면 'public'으로 정의된 함수 또는 데이터는 외부에서 사용이 가능하며, 'private'으로 선언된 경우는 외부에서 제어할 수 없고 내부에서만 사용되게 할 수 있다. 이것은 클래스 외부에는 제한된 접근 권한을 제공하며 원하지 않는 외부의 접근에 대해 내부를 보호하는 역할을 한다. 이렇게 함으로써 객체의 데이터를 객체 외부로부터 보호하고, 내부의 변경 사항들이 프로그램의 다른 부분들에 영향을 미치지 않도록 할 수 있다.

 

# Inheritance (상속)

 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 불려받는 것을 말한다. 하나의 클래스가 가지고 있는 특징(데이터와 메소드)들을 그대로 다른 클래스에 물려주고자 할때 사용한다. 

상속을 하면 하위 클래스에서 속성이나 행위를 다시 정의하지 않고 상속받아 재사용함으로써 코드가 줄어든다. 또한 자신만의 데이터와 메소드를 추가할 수 있으며 기존의 메소드를 overriding(상속관계에 있는 클래스 간에 같은 이름의 메소드를 재정의)하여 사용할 수도 있어서 효율적이다. 

 

# Polymorphism (다형성)

다형성을 사전적인 의미로 풀어서 이야기하면 '다양한 형태로 나타날 수 있는 능력'이다. 객체 지향 프로그래밍 언어에서는 하나의 클래스 내부에 같은 이름의 행위를 파라미터의 타입과 개수를 다르게 하여 여러개 정의하거나, 상위 클래스의 메소드를 재정의하여 사용할 수 있는 것을 다형성이라고 한다. 

  • 오버로딩 (Overloading) : 같은 이름의 메소드를 가지면서 매개변수의 유형과 개수를 다르도록 하는 기술 (Python 사용 x)

    • Ad hoc Polymorphism - function & operator overloading

    • 함수 명은 같아야 한다.

    • 파라미터의 타입과 개수는 서로 달라야 한다.

    • 리턴 타입은 관계가 없다.

    • Python에서는 사용하지 못한다.

    • (장점) 메소드의 이름의 낭비를 방지한다.

    • (장점) 같은 메소드에 여러 종류의 매개 변수를 받을 수 있다.

  • 오버라이딩 (Overriding) : 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 기술 

    • Subtype Polymorphism - overriding

    • 함수명은 같아야 한다.

    • 파라미터의 타입과 개수는 동일해야 한다.

    • 리턴 타입은 같아야 한다.

    • (장점) 코드의 재사용성이 향상 된다.Ad hoc Polymorphism - function & operator overloading

- Coercion Polymorphism - 강제 다형성

  • Implicit type coercison

  • Explicit type coercion