🤔 객체지향설계
객체지향 설계는 실제 세계의 적용에 동떨어져있는 단점들을 극복하기 위해 생겨난 언어입니다.
1학년때도 객체지향설계를 기반으로 한 JAVA를 배웠는데 매우 유사한 문법을 가지고 있는 C++을 공부하며 배운 내용을 정리해보려고 합니다.
이번 포스팅에서는 C++에서의 class, object, storage duration, abstraction, encapsulation, inheritance, polymorphism을 배워보도록 하겠습니다.
해당 포스팅은 장진수 교수님의 객체지향설계 과목을 수강하며 작성한 내용임을 알립니다.
🔎 클래스(Class)
클래스는 설계도(blueprint)와 같은 역할을 합니다.
클래스는 다른 객체에 속한 모든 공통 속성들을 정의합니다.
또한 클래스는 하위 클래스로 나누어 질 수 있습니다.
아래의 그림과 같이 Car이라는 클래스는 자동차의 특징(fuel, maxspeed, refuel, drive)들을 가지고 있습니다.
🔎 객체(Object)
클래스의 인스턴스는 해당 클래스를 구분할 수 있게 합니다.
예를 들어 아래의 그림에서 "mini"는 "car"클래스의 instance 입니다.
객체는 데이터와 기능들으 포함하고 있는데 이는 "인스턴스 변수", "인스턴스 메소드"라고 합니다.
자바 프로그램에서의 객체는 아래와 같은 방식으로 선언되고 사용되었습니다.
C++에서의 객체를 생성하는 문법은 아래와 같습니다.
메인 함수에서 먼저 객체를 생성한 뒤 해당 객체가 가지고 있는 Public Member를 "."을 이용하여 호출합니다.
C언어에서 객체를 생성하는 것과 비교하여 보면 아래와 같습니다
🔎 기억존속기간(Storage Duration)
Storage Duraiton은 함수 내부에서 변수를 위한 메모리가 설정되고 해제되는 시점을 말합니다.
지역변수의 저장공간은 해당 지역의 함수가 호출될때 "자동"으로 할당allocate되고 함수가 반환하면 해제deallocate된다.
✍️ Automatic storage duration
지역변수의 저장공간은 함수가 호출될 때 자동으로 할당되고 함수가 반환되면 해제됩니다.
아래의 코드에서 sum은 get_sum_of_digits(int number)함수의 block이 실행되었을 때 할당되고 block이 종료될 때 해제됩니다.
해당 저장 공간은 자동으로 할당되고 할당이 해제됩니다.
✍️ Dynamic storage duration
아래의 코드에서 실행되는 코드는 동적할당이라고 합니다.
변수의 할당과 할당 헤제가 사용자에 의해 정해집니다
✍️ Static storage duration
변수의 저장공간이 프로그램이 사작했을 때 할당되고 프로그램이 끝날 때 할당해제되는 것을 static storage duration이라고 합니다.
프로그램을 시작했을 때 프로그램이 끝나기 전까지 해당 변수는 같은 주소에 계속 할당되어있습니다.
아래의 코드에서 main 함수를 실행했을 때 함수가 재호출되며 stc를 1로 값을 재할당하는데 stc > 5를 만족할 일이 없기 때문에 무한루프가 생성됩니다.
🔎 추상화(Abstraction)
추상화는 외부 세계에 중요한 정보를 제공하기 위해 생겨난 개념입니다.
사물을 사실적으로 표현하는 개념이 아니라 불필요한 부분을 제거하고 공통된 특징만 추출하여 간결하고 이해하기 쉽게 만드는 작업을 의미합니다.
예를 들어 우리는 휴대전화를 사용하지만 전화가 어떻게 작동하는 지는 잘 모릅니다.
이와 동일하게 내부 작업은 어떻게 작동하는 지 모르지만 printf()함수를 사용할 수 있습니다.
추상화를 사용했을 때 어떤 것을 보여줄 때 재사용에 있어 복잡성을 줄여줍니다.
또한 코드를 다시 작성해야하는 duplication을 피할수 있게 합니다.
보안에 있어 구현 세부 정보를 보호하는 역할도 합니다.
아래의 코드에서 메인 함수를 실행할 때 변수 a, b에 대한 정보를 알 필요가 없기 때문에 아래와 같이 사용할 수 있습니다.
🔎 캡슐화(Encapusulation)
객체의 속성과 기능을 하나로 묶고 세부 구현 내용은 클래스 안으로 숨기는 것을 의미합니다.
즉 외부에서 객체 내부 속성에 직접 접근하거나 조작할 수 없도록 합니다. 외부에서 접근하는 방법은 오로지 공개로 정의한 인터페이스를 통해서만 가능하도록 합니다.
따라서 변경이 발생할 때 다른 곳에 영향을 받지 않도록 하여 오류 발생을 최소화할 수 있습니다.
이를 그림으로 나타내면 아래와 같이 나타낼 수 있습니다.
private 의 내용을 외부 클래스에서의 접근을 제한합니다.
예제를 더 살펴보자면 아래와 같이 나타낼 수 있습니다.
private member로 설정된 UpperLimit, sum, showResult를 해당 클래스 내부의 메소드인 showResult()에서 변경해주는 것을 알 수 있습니다.
메인 함수에서는 private member로 선언된 변수들을 직접 접근하지 않고 객체의 showResult()의 사용을 통해 불러오는 것을 알 수 있습니다.
🔎 상속(Inheritance)
데이터와 함수를 다른 클래스로부터 가지고 오는 것을 말합니다.
이를 통해 시간과 메모리를 절약할 수 있으며 더 적은 저장공간이 필요합니다.
아래의 예제에서 TwoD_shape라는 기본이 되는 클래스를 선언하고 Triangle에서 해당 클래스를 상속하여 사용하는 것을 알 수 있습니다.
🔎 다형성(Polymorphism)
하나의 인터페이스가 다른 일반 클래스에 접근 할 수 있도록 허용하는것을 다형성이라고 합니다.
아래와 같이 Animal 클래스가 있을 때 Cat과 Dog클래스에서 sound()메소드를 상속하여 다른 방식으로 사용하고 싶을 때 사용합니다.
다형성에는 컴파일 타임 다형성과 런타임 다형성이 존재합니다.
컴파일 타임 다형성에은 메소드 오버로딩, 메소드 오버라이딩이 존재합니다.
✍️ 메소드 오버로딩(Method Overloading)
아래와 같은 코드를 실행헀을 때 math클래스에서 result라라는 메소드가 두가지의 형태를 가지고 있는 것을 알 수 있습니다.
해당 메소드를 main함수에서 실행했을 때 인자의 개수에 따라 다른 값이 출력되는 것을 알 수 있습니다.
즉, 하나의 클래스에서 같은 이름을 가진 메소드를 선언하는 것을 메소드 오버로딩이라고 합니다.
✍️ 메소드 오버라이딩(Method Overriding)
아래의 코드를 살펴보면 base클래스에서 output이라는 메소드를 선언한 뒤, derived 클래스에서 base클래스를 상속하여 output 메소드를 다시한 번 선언한 것을 알 수 있습니다.
메인 함수의 실행에서도 마찬가지로 서로 다른 출력이 나오는 것을 알 수 있습니다.
즉, 다른 클래스에서 같은 메소드를 사용할 수 있도록 하는 것을 메소드 오버라이딩이라고 합니다.
🔎 요약
클래스 : 설계도와 같은 역할
저장기간 : 변수를 위한 메모리가 설정되고 해제되는 시점
자동저장기간 : 지역변수의 저장공간은 함수가 호출될 때 자동으로 할당되고 함수가 반환되면 해제
동적저장기간 : 변수의 할당과 할당 헤제가 사용자에 의해 정해짐
정적지역기간 : 정적변수는 영구적인 메모리 공간을 가져 프로그램 실행 내내 해당 값을 유지
추상화 : 사물을 사실적으로 표현하는 개념이 아니라 불필요한 부분을 제거하고 공통된 특징만 추출하여 간결하고 이해하기 쉽게 만드는 작업(장점 : 재사용에 있어 복잡성을 줄여줌, 세부 정보를 보호함)
캡슐화 : 객체의 속성과 기능을 하나로 묶고 세부 구현 내용은 클래스 안으로 숨기는 것을 의미함. 즉, 외부에서 객체 내부 속성에 직접 접근하거나 조작할 수 없도록 함. 외부에서 접근하는 방법은 오로지 공개로 정의한 인터페이스를 통해서만 가능하도록 함.(장점 : 변경이 발생할 때 다른 곳에 영향을 받지 않도록 하여 오류 발생을 최소화할 수 있음, 공개된 인터페이스를 단순화 할 수 있음, 재활용성이 높음)
상속 : 데이터와 함수를 다른 클래스로부터 가지고 오는 것(장점 : 시간과 메모리를 절약할 수 있으며 더 적은 저장공간이 필요함)
다형성 : 하나의 인터페이스가 다른 일반 클래스에 접근할 수 있도록 허용하는 것(장점 : 기존 코드를 재사용하여 작업을 세분화 할 수 있음)
메소드 오버로딩 : 하나의 클래스에서 같은 이름을 가진 메소드를 선언할 수 있게 하는 것
메소드 오버라이딩 : 다른 클래스에서 같은 이름을 가진 메소드를 사용할 수 있도록 하는 것
다음 포스팅에서는 이번 포스팅에서 배웠던 내용을 바탕으로 실습을 진행해보도록 하겠습니다.
🔎 Reference
https://jjeongil.tistory.com/273
'언어 > C++' 카테고리의 다른 글
[C++] C++언어에서 지원하는 C언어의 문법 (0) | 2022.10.26 |
---|---|
[C++] Namespace (0) | 2022.10.26 |
[C++] 생성자/소멸자 (0) | 2022.10.26 |
[C++] 클래스, 함수 오버로딩 (0) | 2022.10.26 |
[C++] 객체지향설계의 이해(실습) (0) | 2022.10.25 |