Object Oriented Programming
객체 지향적인 프로그래밍 패러다임을 의미.
객체(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)
형태는 같은데 다른 기능을 하는 것을 의미한다. 상속을 통해 기능을 확장하거나, 변경하는 것을 가능하게 해준다. 쉽게 말하면 같은 동작이지만 객체마다 다른 결과를 도출할 때, 이를 다형성이라고 한다.
흔히 Overriding
과 Overloading
두가지 방법을 논한다.
오버라이딩(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);
}
}