Object Oriented Programming

1 minute read

객체 지향적인 프로그래밍 패러다임을 의미.

객체(Object)

객체를 뭐라고 정의 할 수 있을까? 클래스?

클래스로 정의로 부터 메모리에 공간을 할당한 인스턴스(instance)를 객체(object)라고 보는 것이 내가 보기엔 가장 좋아 보인다. 사전적인 의미로는 ‘개별적으로 구분할 수 있는 실체’로 사람, 계좌, 자동차 등과 같이 물리적으로 존재하거나 추상적으로 생각할 수 있는 것들로 속성을 갖으며 다른 것과 식별 가능한 것이다.

캡슐화(Encapsulation)

외부에서는 객체내부의 구조를 알지 못하며, 객체가 제공하는 속성(property, attribute, field 다 비슷한 단어인 것 같다)이나 Method만 이용할 수 있다.

즉, 객체의 특정 속성의 값을 확인하기 위해서는 무조건 get 메소드를 객체가 제공하는 상태여야하고, 그 메소드를 통해서만 확인 가능하단 의미이다. 이렇게 하면 외부에서 아무렇게나 객체 내부의 정보를 해치지 않도록 ‘정보은닉’ 효과도 줄 수 있다.

사용자 입장에서 객체 내부에서 정의되는 로직이나 특정 상태등을 전부 알 필요 없이, 오직 제공하는 정보만을 알아도 사용가능하게 해준다.

상속성(Inheritance)

상위(Parent) 개념을 하위(Child) 개념이 물려 받는 것으로, 재사용이라고 표현하기도 한다. 이 특성 덕분에 코드의 중복도 많이 줄어든다. 자바나 C#은 다중 상속이 불가능하고, cpp나 Python은 다중 상속 가능하다.

class Object1(Parent1, Parent2):
    def __init__(self):
        pass

추상화(Abstraction)

목적에 맞는 요소들만 추출하여 추상화한 개념으로 클래스 혹은 객체를 만드는 것을 의미 한다. 벤츠, 아우디, BMW들을 ‘자동차’라는 클래스 정의를 내리는 것이 추상화의 과정이라고 볼 수 있다.

다형성(Polymorphism)

형태는 같은데 다른 기능을 하는 것을 의미한다. 상속을 통해 기능을 확장하거나, 변경하는 것을 가능하게 해준다. 쉽게 말하면 같은 동작이지만 객체마다 다른 결과를 도출할 때, 이를 다형성이라고 한다.

흔히 OverridingOverloading 두가지 방법을 논한다.

오버라이딩(Overriding)

부모 클래스의 메소드를 물려받아 하위 클래스가 새롭게 쓰는 것을 의미.

오버로딩(Overloading)

하나의 클래스 안에서 같은 이름의 메소드를 사용하지만, 메소드마다 다른 용도로 사용되며 그 결과물도 다르게 구현 할 수 있는 것을 말한다. 딱 떠오르는 개념이 아닌데, 아래 예시를 보면 쉽게 이해 가능하다.

//Overloading
public class OverloadingTest{
  
  public void test(){
    System.out.println("사용자 없음");
  }
  
  public void test(String name){
    System.out.println("사용자 이름 = " +name);
  }
  
  public void test(String name, int money){
    System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
  }
}

참고