👩🏻‍💻 Programming/OOP

객체와 객체지향, 그리고 객체지향 4대 특성

한국의 메타몽 2021. 7. 27. 02:59

 

객체

 

객체란 말 그대로 대상(Object)를 뜻합니다. 

사람 한 명 한 명도 객체가 될 수 있고, 책 한 권 한 권도 객체가 될 수 있습니다.

 

 

클래스와 객체, 그리고 인스턴스

 

[요약]

 

  • 클래스 - 설계도. 공통된 특성들을 모아 정의를 내림
  • 객체 - 클래스로 구현한 대상
  • 인스턴스 - 객체가 메모리에 할당되어 실제 사용될때 인스턴스라 부름

 

사람들은 저마다 같은 속성을 가지고 있습니다.

대표적으로 얼굴, 목, 손, 발, 다리와 같은 공통적인 속성을 가지고 있습니다.

책도 마찬가지 입니다. 모든 책들은 책의 표지, 제목, 저자라는 공통된 속성을 가지고 있습니다.

 

여기서 사람이 공통적으로 갖는 얼굴, 목, 손, 발과 같이 공통된 속성들을 모아 정의를 내린 것이 클래스 입니다.

학교에서 흔히 '붕어빵 틀과 붕어빵'을 비유로 삼아 '클래스와 객체'를 설명했는데요,

붕어빵 틀이라는 '클래스'를 사용하면 '붕어빵'이라는 같은 '대상(객체)'를 만들 수 있습니다.

여기서 붕어빵 틀 안에 슈크림을 넣을건지, 팥을 넣은건지와 같이 특징을 다르게 선언하여 같은 객체(붕어빵)이지만 저마다 서로 다른 특성을 지닌 객체(ex : 슈크림 붕어빵, 팥 붕어빵)를 만들 수 있습니다.

 

[예시코드]

public class Human{ // 클래스
	...
}

public class Main{
	public static void main(String[] args){
    	Human anna, jack; // 객체
        
        anna = new Human(); // 인스턴스
        jack = new Human();
    }
}

 

객체 지향 프로그래밍 (OOP)

 

OOP(Object-Oriented Programming)는 객체의 관점에서 프로그래밍 하는 것을 의미합니다.

이와 반대되는 프로그래밍으로 '절차지향 프로그래밍'이 있습니다. 대표적으로 C언어가 절차지향 프로그래밍입니다.

절차지향 프로그래밍은 프로세스가 함수 단위로, 순서대로 실행되는 것을 말합니다.

 

반면 OOP는 무작정 순서대로가 아닌, 객체들의 유기적인 관계를 통해서 프로세스가 진행됩니다.

때문에 객체를 유기적으로 연결하여 프로그래밍이 가능합니다.

예를 들어 이미 만들었던 함수를 내부적으로 다른 특성을 활용하여 다회차 활용할 수 있기 때문에 코드 사용의 중복을 줄일 수 있습니다. 또한 입력 코드, 계산 코드, 출력 코드 등의 역할을 분담하여 코드의 가동성을 높일 수 있습니다. 이러한 이유로 코드의 유지보수에 긍정적인 효과를 보일 수 있습니다.

 

 

OOP의 특징

 

1. 캡슐화

캡슐화는 객체의 속성(Variable)을 보호하기 위해서 사용합니다.

 

예를들어 알약의 경우, 내부 내용물을 캡슐로 보관하여 사용자가 쉽게 약물을 먹을 수 있게 도와줍니다.

만약 캡슐로 쌓여있지 않았다면, 쓴 약물 알갱이들을 일일이 먹는 것이 번거로운 과정일 수 있습니다.

또다른 예시로는 컴퓨터가 있습니다. 컴퓨터 본체 안에 수 많은 부품이 있지만, 컴퓨터의 본체가 캡슐처럼 많은 부품들을 감싸고 있습니다.

전원을 켜기 위해서는 메인보드에 전기 신호를 직접 주는 것이 아닌 '전원 버튼'을 눌러서 컴퓨터의 상태를 on / off 할 수 있습니다.

 

클래스 입장에서 캡슐화를 살펴보겠습니다.

자바에서 접근 제어자(public, private)있다는 것은 알고 계실겁니다.

private로 정의된 속성은 외부에 노출 시키지 않고 자신의 클래스에서만 사용하기 위해 정의합니다.

즉, private로 정의된 속성은 알약의 실제 내용물이라고 생각합니다.

알약에게 있어서 알약의 실제 내용물은 핵심, 가장 중요한 부분이죠.

이 속성을 외부에 알려줄 필요가 없습니다. 즉, 정보은닉의 장점이 생깁니다.

 

 

2. 상속

부모가 자식에게 유산을 상속한다는 말은 많이 들어보셨을겁니다.

여기서 '상속'의 개념은 OOP에서도 활용됩니다. 즉, 부모 클래스가 자식 클래스에게 어떠한 속성을 물려주는 것이 됩니다.

중요한 개념은 객체지향에서 상속은 단순히 속성의 상속이 아닌, 하위로 내려갈 수록 구체화 되는 것입니다.

예를들어 아래와 같이 몬스터라는 부모 클래스가 있다고 합시다.

몬스터 클래스는 name, defence, speed와 같은 변수와 move(), attack()과 같은 함수들을 가지고있습니다.

여기에 지상몬스터와 공중몬스터라는 자식이 있습니다. 이 둘은 부모인 몬스터 클래스로부터 모든 속성을 물려받습니다.

그리고 자식은 부모로부터 물려받은 속성을 자신의 특성에 맞게 바꿉니다. 

지상몬스터는 날 수 없으니 isFly 변수를 false로 선언하고, 공중몬스터는 날 수 있으니 isFly 변수를 true로 선언합니다.

 

 

3. 다형성

 

다형성은 하나의 개체가 여러 개의 형태로 변화하는 것을 말합니다.

OOP에서도 다형성의 존재하며, 여기서틑 형태는 같지만 다른 기능을 가지고 있는 경우를 가르킵니다.

OOP에서는 '오버라이딩'을 통해서 다형성을 실현시킵니다.

예를들어 방금 위에서 봤던 지상 몬스터를 예시로 보겠습니다.

 

 

 

슬라임과 달팽이는 같은 속성을 상속받았지만, 본인만의 특징을 살려 defence와 speed를 재정의했습니다.

 

또한 슬라임은 얼어붙은 상태일 경우(freezed), speed를 2로 정의해서 속도를 낮췄습니다.

달팽이는 불이 붙은 경우(fired) speed를 3으로 정의해서 속도를 낮췄습니다.

 

자식클래스는 부모클래스로부터 받은 속성은 '오버라이딩'을 통해 자신만의 속성으로 재정의 할 수 있습니다.

이렇게 같은 속성을 가지고 있지만, 서로다른 특성 및 기능을 갖게된 자식클래스들에게서 다형성을 볼 수 있습니다.

 

 

4. 추상화

 

OOP에서 추상화는 모델링을 뜻합니다.

즉, 필요없는 부분은 제거하고 필요한 부분만 표현하는 모델링을 뜻합니다.

구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 필요한대로 재조합을 하는 것을 추상화라고 합니다.

다형성과 상속 모두 추상화를 뜻하며, 쉽게 예시를 보여주면 다음과 같습니다.

 

클래스 몬스터 사람
속성 이름
공격
방어력
속도
마력
이름
공격
방어력
속도
마력
소속 길드
직업
행위 공격
이동
공격
이동
잠자기
요리하기
노래하기

 


 

OOP와 OOP의 특성을 요약하면 다음과 같습니다.

 

  • OOP
    - 객체들이 서로 유기적으로 동작하는 프로그래밍 이론
    - 코드의 재사용성과 중복제거가 가장 큰 목적
  • 캡슐화
    - 외부에 노출할 필요가 없는 정보들은 은닉(정보은닉)
  • 추상화 
    - 목적과 관련 없는 부분은 제외하고 필요한 부분만 모델링 하는 기법
    - 객체의 공통된 속성들과 특정 특성을 분리해서 필요한대로 재조합
  • 상속
    - 상속관계에있는 부모클래스가 자식클래스에게 속성을 물려줌
    - 자식클래스는 부모의 속성을 재사용함
  • 다형성
    - 같은 형태이지만 다른 특징, 기능을 가짐
    - 오버라이딩을 통해 다형성이 이루어짐 

 


 

참고자료 및 출처 : https://victorydntmd.tistory.com/117

 

객체 지향 프로그래밍( OOP ) 개념

1. 객체 지향 프로그래밍 ( Object Oriented Programing ) 1) 객체 객체란 말 그대로 대상을 나타내는 단어입니다. 예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라

victorydntmd.tistory.com

 

'👩🏻‍💻 Programming > OOP' 카테고리의 다른 글

SOLID(객체 지향 설계)  (0) 2021.07.28
[Spring] MVC 패턴  (0) 2021.06.08