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

2022. 11. 29. 03:58CS

 

아래 내용은 그냥 제 의식의 흐름대로 써봅니다. 틀린 부분은 댓글 좀 부탁드려요.


상습적으로 나오는 면접 질문입니다. 늘 면접가보면 C언어를 많이 쓰던 제가 자바 소양이 부족함이 뽀록나는 대목이기도 하죠. 가장 기본적인 질문이지만 지원자의 깊이를 가늠해볼 수 있는 문제입니다. 또 면접을 보러가야하기에 한번 정리해봅니다.

 

The Forgotten History of OOP

일반적으로 객체 지향 프로그래밍이라고하면 프로그랭을 할 데이터를 상태와 행위를 가진 객체를 만들고, 객체들 간 상호작용을 통해 로직을 구성하는 프로그래밍 방법이라고 합니다. 흔히들 객체 지향 프로그래밍의 특징을 5가지로 언급합니다. 클래스, 추상화, 캡슐화, 상속, 다형성입니다. 그러나 위 제목의 아티클을 읽어보면 객체지향의 본질이 무엇인지 다시 생각해보게 됩니다.

 

번역해서 쭉 보면 가운데 OOP의 본질에 대한 내용이 있습니다.

 

그리고 앨런 케이가 OOP를 한문장으로 정의 했습니다.

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”
- Alan Kay

상태를 캡슐화하고 로컬 상태 변경에서 다른 개체를 격리하여 변경 가능한 공유 상태를 방지합니다. 다른 개체의 상태에 영향을 미치는 유일한 방법은 메시지를 보내 해당 개체에 상태를 변경하도록 요청하는 것입니다. 메시지에 의해 상태가 변경되는 시점에서 (컴파일 시점이 아닌) 값을 결정한다는 것입니다.

 

위 내용을 요약한 즉슨, 프로그래밍 과정에서 연관된 상태와 행위를 하나의 클래스로 묶어둡니다. "공통"의 속성이나 기능을 묶어 명명하는 행위를 추상화라고 하며 클래스는 그렇게 정의 된 설계도이다. 그리고 설계도를 메모리에 할당한 것이 객체다. ( 클래스, 추상화 )

그 클래스의 상태는 다른 객체의 접근으로 부터 격리하여 변경 가능한 공유 상태를 방지합니다. ( 캡슐화 )

상태를 변경하려면 메시지를 사용해서 변경이 가능하고, 이는 컴파일 시점이 아닌 런타임에서 변경이 된다는 것입니다.

 

여기서 중요한 것은 메시징이다. 즉 상호작용, 이것을 어떻게 하는지가 중요하다.

 

 

그럼 클래스, 추상화, 캡슐화는 알겠는데 상속과 다형성은 무엇인가? 이는 앨런 케이의 제자들이 C++이나 Java를 만들면서 추가한 개념들입니다.


상속이란?

 

이렇게 잘 분리된 클래스를 재사용하여 중복된 코드를 줄이고 코드를 간결하게 쓰기위해 상속을 만들었다고 합니다. 유지보수가 쉽고, 확장성이 용이해진다는 장점이 있습니다.

 

그래서 상속이란 부모 클래스의 상태와 행위를 물려받아 사용할 수 있게하고, 기능의 일부분 변경해야 할 경우 상속받은 자식에서만 재정의(Overriding)하여 사용할 수 있도록 하는 것입니다.

 

대게 부모 클래스의 멤버(상태와 행위)를 그대로 상속 받아 쓸 수 있게 된다는 것입니다. 상속에는 제약이 있습니다.

1. 부모 클래스의 private 접근 제한자를 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.

2. 부모와 자식 클래스가 서로 다른 패키지에 있다면 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려 받을 수 없습니다.

3. 상속에는 클래스 상속과 인터페이스 상속이 있습니다.

     - 클래스 상속은 extends, 그리고 하나의 부모 클래스만 상속이 가능합니다. 부모 클래스를 확장하는 개념입니다.

     - 인터페이스 상속은 implements, 그리고 여러개의 부모 클래스가 상속이 가능합니다. 부모 클래스를 오버라이딩(재정의) 해야 합니다.

 

 

 


다형성이란?

 

하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 부모 클래스 타입의 참조변수로 자식 클래스 타입의 인스턴스를 참조 가능하도록 구현을 한다고 합니다. '자바의 신' 책에서는 참조 자료형의 형변환이라는 이름으로 기술되어 있고, 업캐스팅, 다운 캐스팅이라는 키워드로도 불립니다. 형 변환을 하더라도, 실제 호출되는 것은 원래 객체에 있는 메소드가 호출됩니다. 이해를 위해 예시를 찾아봤는데 링크의 블로그가 적절한 예시를 들어주고 있습니다.

 

 


마치며

C언어 개발 경력이 더 길다보니까 솔직히 아직까지 완벽하게 체득이 된 상황은 아니지만, 이렇게나마 정리를 하면서 차차 마스터를 해보고자 합니다.

'CS' 카테고리의 다른 글

[설계] 수직적 분할과 수평적 분할  (0) 2022.12.13