도대체 객체지향 프로그래밍이란 뭘까? 2부

Jiho Yoo·2021년 11월 6일
0

JAVA

목록 보기
2/2

1부에서 이어서 시작하겠습니다.

원래 바로 올리려고 했지만 가을의 풍경과 날씨가 나를 막아섰다...

1부에선 절차지향 프로그래밍과 객체지향 프로그래밍의 차이를 다뤘다면 2부에선 객체지향프로그램을 좀 더 다뤄 볼까 합니다.

객체지향프로그래밍(Object-Oriented Programming)의 장점들이 있기까지 여러가지
특징중 핵심 개념들이 있다.

추상화(Abstraction)

  • 현실 세계에서 특정한 대상을 관찰하여 핵심적이고 특징적인 공통점들을 뽑아내는 과정을 말합니다.

추상화란 말 그대로 상세한 정보는 무시하고 필요성에 의해 있어야할 정보들만 간추려서 구성하는 것입니다.

한가지 예로 그림을 하나 보여드리겠습니다.

이 그림이 뜻하는게 무엇인지 어느정도 감이 오실 겁니다.

이 작품은 피카소가 황소를 그리는데 점점 추상화 되가며 공통적이고 핵심적인 요소만 빼고 다 지운 그림이라고 보면 됩니다.

추상화에서 핵심적인 특징이라는 것은 대상에 대한 현재 내가 구현하고자 하는 프로그램에서의 관심사라고 할 수 있습니다.
그 외의 특징들은 어떤 관점에서는 중요한 특징들일지 몰라도 현재 프로그램을 구현하는데 불필요하기 때문입니다.

이렇게 불필요한걸 줄이고 남은 특징적인
속성들(property = member variable)과
행위들(behavior = method)로
나뉘게 되는데 이것을 관련 있는 것끼리 묶은 것을
바로 캡슐화라고 합니다.

그리고 관련있는 것들을 하나로 묶는 개념적(추상적)인 주체가 바로 클래스(class)입니다.

객체는 클래스를 실체화를 한 것이라고 보면 되고 눈에 직접적으로 보이는 것이라고 봐도 무방할 것입니다.

한가지 예시로 1부에서 보셨던 붕어빵(class)가 있고
슈크림(속성)이 들어간 슈크림붕어빵(객체)이고 팥(속성)이 들어가있는 팥붕어빵(객체)라고 보면 조금더 이해가 쉽죠?
(나만 쉬운건가?)

캡슐화(Encapsulation)

  • 객체가 독립적으로 역할을 할 수 있도록 속성과 행위를 하나로 묶어 관리하는 것
  • 이 때 중요한 내용은 외부에서 접근이 필요한 부분을 제외하고는 내부로 숨기는 것입니다. (정보의 은닉화)

캡슐을 생각 해보면 쉽다.
우리가 알약을 먹을 때 중요한 것은 약의 성분이 인체에 미치는 영향이지 약의 맛이나 식감이 아니기 때문에 캡슐 속으로 숨기는 것과 마찬가지

일반적인 객체지향 언어에서는 이 캡슐화 때문에 접근제한자(access modifier)라는 문법을 지원합니다.

public : 클래스 외부에서 제한 없이 접근 가능 (nobody)

private : 클래스 외부에서 접근 불가 (클래스 내부에서만 접근 가능)

protected : 상속한 하위 클래스에서만 접근 가능

상속(Inheritance)

  • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것(기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다)

임의의 클래스 B가 다른 클래스 A를 상속 받게 되면 A 클래스의 속성과 행위들을 모두 물려받게 됩니다.
이때 A를 부모 클래스(Parent class), 클래스 B를 자식 클래스(Child class)라고 부릅니다.

여기서 조류라는 Class가 있고 앵무새는 조류 class의 Child class가 되고 조류는 Animal class의 Child class인 동시에 앵무새 class의 Parent class가 됩니다.

이런걸 상속 관계라고 합니다.

부모 클래스로부터 특징들을 물려받게 되면 이미 구현된 세부 내용을 다시 구현할 필요가 없기 때문에 코드의 재사용성(resusability)이 향상됩니다.

다형성(Polymorphism)

  • 여러 형태를 받아들일 수 있는 성질, 상황에 따라 의미를 다르게 부여할 수 있는 특성 등으로 정의를 하기도 한다.

한가지 예시로 돈 만원이 있습니다.
만원짜리 1장, 천원짜리 10장, 100원짜리 100개, 10원짜리 1000개
다 같은 만원으로 구성되어있는 형태는 다르지만 모두 동일한 만원이라는 의미(하나의 속성)를 가지고 있습니다.

이처럼 객체지향에서 다형성이란 하나의 속성이나 행위가 상황에 따라 다른 의미로 해석될 수 있는 특징을 말합니다.

다형성이야말로 객체지향의 꽃이라고 할 수 있고, 그만큼 중요하고 핵심이 되는 개념 중에 하나입니다.

다형성을 구현하는 방법에는 3가지가 있습니다.
오버로딩, 오버라이딩, 함수형 인터페이스

그중에 대표적인 방법이 바로 위에서 설명드린 상속(Inheritance)을 이용한 방법인 오버라이딩(Overriding)이 있습니다.

상위 클래스의 메소드를 하위 클래스에서 재정의(override)하여 상위 클래스의 참조변수가 어떠한 하위 클래스의 인스턴스를 참조하느냐에 따라 동작이 달라지는 개념입니다.

위에 그림으로 보면 도형이라는 클래스가 있고 도형클래스를 상속받는 삼각형 사각형 원형이라는 형태를 가지고 있는 클래스들이 있습니다.여기에는 동일한 메세지 그리다라는 함수가 동일하게 (상속)들어가 있다.
하위에 있는 그린다(행위) 라는 목적은 같지만 실제로 그리는 방법에 따라서 그려지는 모양이 달라질 수 있는 것이죠.

profile
긍정적으로 세상을 바라보는 초보개발자

0개의 댓글