프로그래밍 언어 중 객체지향 프로그래밍에 대해서 정리하겠습니다.
현실세계의 객체란 존재하는 하나하나의 독립된 것들을 의미합니다. 즉, 존재하는 모든 것들을 객체라고 합니다.
프로그래밍에서 객체란 데이터와 기능을 하나로 묶은 덩어리를 의미합니다.
이런 덩어리들을 사용해서 프로그래밍하는 언어를 객체지향 언어라고 합니다.
예를 들면, 컴퓨터의 부품 하나하나가 객체이고, 그 부품(객체)들을 이용해서 컴퓨터(프로그램)를 만드는 것입니다.
컴퓨터가 고장이 나면 고장 난 부품만 바꿔서 사용할 수 있어 유지보수가 좋습니다.
객체지향 프로그래밍은 영어로 Object-Oriented Programming라고 하고, 줄여서 OOP라고 합니다.
이제 객체지향 프로그래밍의 특징에 대해서 알아보겠습니다.
객체지향 프로그래밍의 특징
객체지향 프로그래밍의 특징은 캡슐화, 은닉화, 추상화, 상속성, 다형성이 있습니다.
1. 캡슐화
캡슐화는 비슷한 역할을 하는 변수나 메소드들을 클래스로 묶어주고, 실제 구현 내용의 일부를 내부에 감추어 은닉합니다.
캡슐화를 사용하는 이유는 외부의 잘못된 사용으로 객체의 손상을 방지하기 위해 사용되며, 코드를 클래스 단위로 볼 수 있어 복잡한 코드를 좀 더 쉽게 이해할 수 있습니다.
캡슐화의 장점으로는
1. 데이터의 직접 접근을 제한하기 때문에 정보 은폐와 보안 등에 좋습니다.
2. 클래스의 결합도가 낮아져 재사용하기 쉽습니다.
3. 메소드의 구현 방법이 바뀌거나 객체 내의 데이터가 바뀌어도 다른 객체에는 영향을 주지 않아 유지보수에 좋습니다.
2. 은닉화
은닉화는 캡슐화의 한 개념으로 외부에서 객체 내의 접근을 제한합니다. 접근 지정자를 private으로 지정합니다.
객체 외부에서 데이터를 제어하는 방법은 객체 내부에 setter와 getter 메소드를 만들어 데이터를 제어합니다.
외부에서는 내부에서 어떤 동작을 하는지 알 수 없습니다.
3. 추상화
추상화는 공통의 속성이나 기능을 묶어 이름을 붙이는 것입니다.
예를 들면, 강아지나 고양이라는 각각의 객체를 동물이라는 공통적인 속성과 기능을 가진 추상적인 객체로 묶는 것을 추상화라고 합니다.
C#에서 abstract 키워드를 사용해서 추상 클래스나 추상 메서드를 사용합니다.
체계적인 소프트웨어를 만들려면 코딩하기 전에 추상화를 진행하는 것이 좋습니다.
4. 상속성
현실에서 상속은 부모의 재산을 자식이 물려받는 것을 의미합니다. 코딩에서의 상속도 비슷한 개념입니다.
코딩에서 상속은 부모 클래스의 특징을 자식 클래스가 물려받습니다.
자식 클래스는 부모 클래스의 속성과 메소드를 사용할 수 있습니다. 단, 접근 지정자가 private면 사용할 수 없습니다.
상속을 하면 부모 클래스의 멤버를 자식 클래스에서 다시 정의할 필요가 없고 재사용할 수 있기 때문에,
코드가 줄고 유지보수가 좋습니다.
5. 다형성
다형성은 객체가 여러 형태를 가질 수 있다는 것을 의미합니다.
무기라는 큰 틀은 공격하는 기능이 있고 칼, 창, 활, 총 등 다양한 무기가 있습니다.
무기는 공격이라는 한 형태의 기능이 있어야 합니다. 하지만 무기라는 틀 안에 있는 칼, 창, 활, 총 등 다양한 무기들은 서로 다른 공격 형태를 가지고 있고, 모두 다르게 만들어야 합니다. 이것을 다형성이라고 합니다.
코딩으로 설명해보면,
무기 클래스 안에 공격 메소드가 있습니다.
칼, 창, 활, 총 클래스는 모두 무기 클래스를 상속하고, 무기 클래스의 공격 메소드를 재정의해서 각각 서로 다른 기능을 가진 공격 메소드를 구현합니다.
공격 메소드는 무기 클래스만 보면 하나의 기능(형태)이지만, 자식 클래스들(칼, 창, 활, 총)을 보면 서로 다른 기능(형태)을 가지고 있습니다. 즉, 무기라는 객체는 여러 종류의 무기가 될 수 있고, 각각의 공격 방식이 다를 수 있습니다. 이것이 다형성의 개념입니다.
부모 클래스에서 물려받은 가상 함수(virtual)를 자식 클래스에서 재정의(override)해서 다른 기능으로 사용할 수 있습니다.
자식 클래스의 객체를 생성할 때, 부모 클래스 타입의 참조 변수로 인스턴스를 참조할 수 있습니다.
다형성과 virtual, override에 대한 자세한 내용은 다른 게시글로 정리하겠습니다.
제가 공부한 부분을 정리한 내용이기 때문에 틀린 부분 있을 수 있습니다!!
혹시 틀린 부분이 있으면 알려주세요!!
'C#' 카테고리의 다른 글
[C#] 다형성, virtual과 override (0) | 2022.09.06 |
---|---|
[C#] 상속을 해보자 (0) | 2022.08.27 |
[C#] 암묵적 구현과 명시적 구현 (0) | 2022.08.23 |
[C#] 추상 클래스와 인터페이스 (0) | 2022.08.19 |
[C#] CopyTo를 사용하자 (0) | 2022.07.27 |