Base/용어 개념

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

koh1018 2021. 3. 1. 23:24
반응형

출처 : https://media.vlpt.us/post-images/cyranocoding/6c8e33a0-b22a-11e9-a4ce-730fc6b3757a/oop.png

 

메소드(method)는 코드들을 담은 상자이다.(함수를 의미) -> 여기까지는 절차적 프로그래밍에서 가능한 것들

근데 범위가 커지고 해야할 작업이 복잡해지면 코드도 길어지고 프로그래밍하기가 벅차진다.

 

여기서 객체지향 프로그래밍의 요소들이 추가된다.

클래스는 변수들과 메소드를 담은 상자이다.

이렇게 데이터와 기능이 클래스로 캡슐화된 컴퓨터 자원의 묶음을 객체라고 한다.

인스턴스는 클래스로 찍어낸 변수로 하나의 클래스안의 변수 값들을 계속 바꿔주다보면 불필요한 코드가 많아지고 오류가 생길 확률이 높다. 이에 따라 다른 초기값을 가진 클래스를 인스턴스 변수에 찍어내는 방식을 쓴다.(클래스를 복제해 또다른 구조를 만드는 방식)(생성자를 이용해 초기값을 원하는 값으로 지정해줄 수 있다. -> 자바의 경우 class안의 public으로 지정된 생성자를 통해 초기 값을 넣어줄 수 있다.)

 

비유를 들자면 밀가루 반죽과 팥이 클래스란 붕어빵 틀에 찍혀서 객체라는 붕어빵이 나오는 것이다. 전에는 아무런 데이터도 없는 컴퓨터 자원들을 삽으로 떠다가 하나하나 명령어를 줘 가면서 코드를 짜야했다.

하지만 객체지향 프로그래밍을 배운 후에는 클래스라는 모양 틀을 만들고 이 틀에 맞춰 모양과 용도가 뚜렷한 객체를 만들 수 있게 된 것이다.

 

객체지향 프로그래밍에는 특징이 있는데 바로 은닉성이다. 내부 구조는 private로 감춰놓고 외부에서 조작할 수 있는 명령어만 public으로 공개해 놓는 것이다.

이를 통해 바깥의 간섭으로 발생하는 오류를 방지할 수 있고, 남이 만든 클래스의 객체들도 일일이 뜯어볼 필요 없이 제공되는 기능들을 그대로 사용할 수 있는 것이다.

 

다음으로 많은 객체지향 언어들에 대해서 사용되는 interface에 대해 알아보겠다.

인터페이스안에는 메소드를 정의만 해놓고 뭘 실행하는지는 여기서 정의하지 않는다.

자바의 경우 implements를 통해 미리 정의해둔 인터페이스가 적용된 클래스는 필수적으로 해당 인터페이스에 들어간 메소드를 정의해야한다.(각 메소드 정의 위에 @Override 적고)

 

객체지향 프로그래밍은 여기서 그치는 것이 아니라 클래스들을 가지고 또 다른 클래스들을 조합해 낼 수 있다.

 

객체지향 프로그래밍의 중요한 개념이 또 있는데 그것은 상속이다.

만약 상속을 받게되면 상속 받은 자식 클래스는 부모 클래스의 변수들과 메소드들을 그대로 물려받는다.

자식 클래스에서는 이에 더해 새로운 변수, 메소드를 추가할 수 있고 기존 메소드를 override해 수정할 수 있다.(이는 물론 자식 클래스에서만 적용됨.)

이렇게 부모 클래스에서 정의된 메소드의 작업이 자식 클래스에서 다른걸로 override, 대체될 수 있는 걸 객체지향의 다형성이라고 한다.

 

이렇게 비교적 추상적인 부모 클래스에서 더 구체화된 자식 클래스를 만들어낼 수 있다.

만약 어떤 클래스들이 공통적인 변수를 갖고있다면, 그 변수를 활용한 부모 클래스를 만들 수 있다. 다만, 이 클래스는 추상적을 뜻하는 abstract을 붙여 abstract class 로 정의한다.

이 추상클래스로는 객체를 만들 수 없다.(특정한 객체를 이것으로 부르기엔 너무 추상적이라는 것이다.) 결국 자식 클래스들의 공통분모 역할만을 위한 클래스인 것이다.

 

이렇게 상속을 이용하면 코드도 줄고 보다 체계적이고 안정된 코드를 짤 수 있다.

 

그렇다면 인터페이스와는 어떻게 다르고 어떻게 다르게 써야할까?

상속은 트리구조의 상하관계가 뚜렷하기 때문에 한 자식이 두 부모로부터 상속받는게 언어마다 불가능하거나, 부작용이 있다. 반면 인터페이스는 이로부터 자유롭다.

예를 들면 박쥐와 날다람쥐는 포유류란 부모에게서, 날치는 어류라는 부모에서 상속받지만 난다는 기능을 인터페이스로 장착해 날짐승이란 카테고리에 들어갈 수 있는 것이다.

상속은 물려받는 것, 인터페이스는 장착하는 것

 

 

 

참고 자료 : 얄팍한 코딩사전(youtu.be/vrhIxBWSJ04)

               생활코딩 JAVA1 강의(youtu.be/-dPXqgWQBGE)

반응형