본문 바로가기
야미스터디/Backend

소프트웨어공학 OOP 참고 공부

by 의정부핵꿀밤 2021. 4. 15.
728x90

소웨공 수업듣는데 학과장님이 4학년인데 왜 아무것도 모르냐고 하면서 내주려다가 만 과제를 블로그에 정리나 해보려고 한다. 이번에 정처기 필기 공부하면서 본 내용이긴 한데 정확히는 모르니까 정리해보면 좋을것 같기도 해서 해볼라궁!

백현 & 도영 "인형" 꼭 들으세요. 반박시 백현이랑 결혼함.

-----------------------------------------------------------------------------------------------------------------------------------

 

*C와 C++의 차이점

: C++은 C 문법에 객체지향 프로그래밍 개념과 일반화 프로그래밍을 위한 템플릿 기능이 추가된 언어이다. 

(템플릿 : 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료형으로 사용할 수 있도록 만들어 놓은 틀)

 

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

 

1. 객체

객체란 말 그대로 대상을 나타내는 단어이다. 

예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라 할 수 있습니다.

사람은 생김새와 성격이 똑같을 수는 없기 때문에 개개인을 객체라 할 수 있으며, 책도 내용이 같을지라도 한 권의 책에 흠집을 낸다고 해서 모든 책들이 전부 흠집이 나는 것이 아니기 때문에 한 권 한 권을 객체라 할 수 있습니다.

 

2. 클래스

클래스란 객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것을 의미한다. (=추상화)

사람들은 일반적으로 눈, 코, 입, 손 과 같은 공통된 속성을 갖는다. 또한 책도 책 이름, 작가, 출판사, 출판일 등 같은 속성을 갖고 있다. 즉, 사람이라는 클래스는 눈, 코, 입 등의 속성이 존재하고 객체들은 눈, 코, 입의 생김새가 다르기 때문에 다른 객체로 분류된다. 객체와 클래스는 많은 책들에서 붕어빵과 붕어빵을 찍는 기계라고 표현한다. 붕어빵을 찍어내는 기계는 붕어빵이라는 객체들을 생성하기 위한 틀을 제공합니다. 또한 붕어빵들은 슈크림 붕어빵, 팥 붕어빵 처럼 다른 붕어빵이 될 수 있는 것이다. 따라서 붕어빵 찍는 기계는 클래스라 표현할 수 있고, 붕어빵 틀에서 만들어진 붕어빵들은 각각이 객체가 된다.

 

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

객체의 관점에서 프로그래밍하는 것을 의미한다.

C언어를 절차 지향 프로그래밍 언어로, 프로세스가 함수 단위로 순서대로 진행되는 것에 반해, OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다. 즉, 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 의미한다.

 

*OOP의 특징

 

1. 추상화

추상화는 객체에서 공통된 속성과 행위를 추출하는 것을 의미한다. 이는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념이다.

예를 들면, 지도에는 위성지도와 등고선지도 등 여러가지가 있는데, 각 지도마다 목적이 다르다. 위성지도는 그 지형의 정확한 실제 모습을 담기 위한 목적의 지도이고, 등고선 지도는 지혀으이 높낮이를 표현하기 위한 목적의 지도이다. 따라서 등고선 지도를 그릴 때, 목적에 맞지 않는 부분을 제외하고 필요한 부분(지형의 높낮이)만 표현하게 된다. 

이제 이를 객체와 클래스의 관점에서 살펴보면, 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다. 즉, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.

 

2. 메시지와 메소드

클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 행위라고 할 수 있다. 메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 메시지는 객체간의 통신이 이루어지는 방법이며 이 메시지를 통해 메소드가 호출되어 사용된다.

3. 캡슐화 

캡슐화는 객체의 상세한 내용을 객체 외부에 숨기고 단순히 메세지만으로 객체와의 상호작용을 하게 하는 것을 말한다.

쉽게 생각하자면 캡슐화에서 캡슐은 알약이라고 생각하면 된다.

알약 안에 있는 내용물은 정말 쓴 맛이기 때문에 사람들이 약을 먹지 않으려고 한다. 그래서 내용물을 아무 맛도 안느껴지게 알약에 포장시켜서 사람들이 약을 쉽게 먹을 수 있도록 도와주는데 이를 캡슐화라고 생각하면 된다.

 

클래스 입장에서 캡슐화를 살펴보자. 자바에는 접근 제어자( public, protected... )가 있는데 private으로 정의된 속성은 외부에 노출 시키지 않고 자신의 클래스에서만 사용하기 위해 정의한다. 즉, private으로 정의된 속성은 알약의 실제 내용물이라고 생각하면 되는 것이다. 이 속성은 외부에 알려줄 필요가 없으며 이를 통해 정보은닉이 가능하다는 장점이 있다. 이것은 클래스 외부에는 제한된 접근 권한을 제공하며 원하지 않는 외부의 접근에 대해 내부를 보호하는 작용을 한다. 이렇게 함으로써 이들 부분이 프로그램의 다른 부분들에 영향을 미치지 않고 변경될 수 있다.

 

참고로 캡슐화와 정보은닉은 동일한 개념이 아니다. 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있는 것이기 때문에 헷갈리면 안된다! 

예를 들어, TV의 리모콘을 사용하는데 리모콘의 내부 회로(private으로 정의된 속성)를 알 필요가 없고 사용자 입장에서는 리모콘의 조작 기능, 즉 public으로 정의된 속성만 알면 된다. 

 

3-1. 접근 제어자 (in java)
- public : 외부의 모든 클래스에서 접근이 가능한 접근 제어자

- protected : 같은 패키지 내부에 있는 클래스, 하위 클래스(상속받은 경우)에서 접근이 가능한 접근 제어자. 즉, 자기 자신과 상속받은 하위 클래스 둥 다 접근이 가능하다.

- default : 접근 제어자를 명시하지 않은 경우로 같은 패키지 내부에 있는 클래스에서 접근이 가능한 접근 제어자. 자바에만 존재한다.

- private : 가틍ㄴ 클래스 내에서만 접근이 가능한 접근 제어자. 이를 통해 정보은닉이 가능하다고 볼 수 있다.

 

4. 상속

상속은 클래스의 속성과 행위를 하위 클래스에 물려주거나, 상위 클래스에서 물려받는 것을 지칭한다. 또한 하위 클래스는 상위 클래스가 가지고 있는 모든 자료와 메소드를 물려받아 자유롭게 사용할 수 있으며, 하위 클래스만의 자료의 메소드를 추가적으로 덧붙임으로써 새로운 형태의 클래스로 발전 가능하다.

 

실제 세계에서 부모로부터 여러 가지를 상속을 받는데, OOP에서도 가능합니다.

OOP에서 이를 부모 클래스, 자식 클래스라고 표현합니다.

 

실제 세계에서 처럼 OOP에서도 부모 클래스가 자식 클래스에게 상속이 가능하다. 예를 들어, 고양이 클래스, 강아지 클래스가 있다고 해보자. 그런데 고양이와 강아지는 생물학적 관점에서 포유류에 해당한다. 포유류는 여러 속성들이 정의되어 있는데 고양이와 강아지는 포유류의 이런 속성들을 갖고 있다. 하지만 아주 많은 속성이 다르기 때문에 좀 더 디테일하게 고양이, 강아지로 종을 나뉘게 되는 것이다. 즉, 포유류라는 클래스는 고양이와 강아지 클래스에 속성들을 물려주게 되는데 이를 상속이라고 하고, 포유류와 고양이, 포유류와 강아지 클래스는 상속관계에 있다고 한다.

 

상속의 장점

- 재사용으로 인해 코드의 중복을 없앨 수 있다. 코드의 중복이 많아지면 개발 단계뿐만 아니라, 유지 보수에서도 많은 비용이 들게 된다. 하지만 상속을 사용하게 되면 하위 클래스에서 속성이나 행위를 다시 정의하지 않고 상속 받아서 사용함으로써 코드가 줄어들게 된다.

- 좀 더 범용성 있게 사용이 가능하다. 예를 들면 객체 타입의 매개변수에는 String 타입이나 int 타입의 객체가 쓰여도 문제가 되지 않는다. 왜냐하면 String과 int 타입 모두 Object 타입의 객체를 상속받은 하위 클래스이기 때문이다.

 

5. 다형성(Polymorphism)

다형성은 형태가 같은데 다른 기능을 하는 것을 의미합니다. 즉, OOP에서는 하나의 클래스 내부에 같은 이름의 행위를 여럿 정의하거나, 상위 클래스의 오퍼레이션을 하위 클래스에서 다시 정의하여 사용할 수 있다.

 

예를 들면, 고양이 클래스에는 "울음"이라는 속성이 정의되어 있다고 해보자. 사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속 받는다고 하면, 사자 클래스에도 "울음"이라는 속성이 자동으로 추가된다. (이를 상속이라고 한다.) 하지만 같은 "울음" 속성임에도 불구하고 고양이와 사자의 울음소리는 다르다. 이것이 다형성인 것이다.

 

부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 할 수 있습니다.

이것을 오버라이딩이라고 합니다.

즉, 사자 클래스는 부모클래스인 고양이 클래스의 "울음" 속성을 상속 받았지만, 사자는 고양이와 울음소리가 다르므로 "울음" 속성을 오버라이딩 해서 사자 울음소리에 맞게 재정의 할 수 있습니다.

OOP에서는 이러한 다형성을 허용하는 것이죠.

 

다형성의 장점

- 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다. 

예를 들어, 고양이와 사자의 울음소리를 호출하기 위해서 각 개체에서 roar() 메서드를 호출하면 됩니다. roarCat() , roarLion() 으로 각각을 정의할 필요가 없게 되는 것이다. API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하게 사용된다.

 

5-1. 메소드 오버로딩

- 클래스 내부에 동일한 이름의 행위를 여럿 정의하는 것이다. 이 때 함수명은 같아야 하며 파라미터의 타입과 개수는 서로 달라야 하고 리턴 타입은 관계 없다. 

- 장점 : 메소드 이름의 낭비 방지, 같은 메소드에 여러 종류의 매개변수를 받을 수 있다. 

메소드 오버로딩

5-2. 메소드 오버라이딩

- 상속으로 물려받은 자료나 메소드를 그대로 사용하지 않고 자신이 새로 만들어 사용하는 것이다. 이 때 함수명은 같아야 한다. 파라미터의 타입과 개수는 동일해야 한다. 리턴 타입은 같아야 한다. 

- 장점 : 코드의 재사용성이 향상된다.

메소드 오바라이딩

 

C++에서의 오버라이딩 - virtual 함수 사용

lesslate.github.io/cpp/%EA%B0%80%EC%83%81%ED%95%A8%EC%88%98%EC%99%80-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9-Virtual-Function-Overriding/

 

C++ 가상 함수와 오버라이딩 Virtual Function & Overriding

Intro

lesslate.github.io

 

 

 

[총정리]

1. OOP

- 객체들이 서로 유기적으로 동작하는 프로그래밍 이론

- 코드의 재사용성과 중복 제거가 가장 큰 목적

 

2. 추상화

- 목적과 관련이 엇ㅂ는 부분을 제외해서 필요한 부분을 포착하는 기법

- 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법

 

3. 캡슐화 

- 외부에 노출할 필요가 없는 정보들을 은닉 (정보은닉)

 

4. 상속

- 상속 관계에 있는 두 클래스에 대해, 부모 클래스가 자손 클래스에게 속성을 물려주는 것

- 코드의 재사용이 목적

 

5. 다형성

- 같은 형태이지만 다른 기능을 하는 것

- 오버라이딩은 이와 관련된 기능이다.

 

 

 

----------------------------------------------------------------------------------------------------------------------------------

3/12 소웨공 수업 중 틈새 내용 정리

 

- 캐시 : 성능을 높이기 위해서 사용하는 기술로서, 이는 소프트웨어와 하드웨어에서 모두 사용된다. 따라서 현재 상용되는 제품들은 캐시 수에 따라서 가격이 달라지기도 한다. 캐시가 효과적이려면 프로그램은 지역성을 가져야 한다. 이는 메모리 참조가 특정 부분에서 집중되는 것을 의미한다. (참조한걸 또 참조한다던지 배열처럼 참조하고 그 옆에거를 참조하는 등과 같은 거)

728x90

댓글