C#

[C#] 객체지향 프로그래밍

키베이루 2022. 12. 31. 01:36

객체지향 프로그래밍(OOP : Object - Oriendted Programming)

모든 것을 객체로 보고 객체들끼리 역할, 책임, 협력 등 객체들의 관계를 중심으로 프로그래밍하는 기법

 

객체지향 프로그래밍의 목적

- 프로그램을 분석하기 쉬워진다.

- 프로그램 유지보수가 쉬워진다.

- 프로그램의 특정 기능을 재사용할 수 있다.

 

객체지향의 특성

캡슐화(Encapsulattion)

객체의 속성과 행위를 하나로 묶고 구현 내용 일부를 외부에 감추어 은닉할 수 있다.

상속(Inheritance)

상위 클래스의 속성과 행위를 상속 받을 수 있다. 하위 클래스는 필요한 특성을 추가하여 사용

 추상화(Abstraction)

상세한 정보는 무시하고 필요성에 의해 있어야할 정보들만 간추려서 구성하는 것으로 공통점 추출

다형성(Polymorphism)

같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질( = 메서드 오버로딩이 가능하다.)

 

클래스

객체지향 프로그래밍에서 객체를 생성하기 위한 일종의 설계도(붕어빵의 틀 = 클래스, 붕어빵 = 객체)

public class Project
{
	/* 클래스 내용 */
    public int hp; 			// 속성 = 변수
    public void attack() 	// 메서드 = 함수
    {	
    
    }
}

 

클래스 이름

클래스 이름은 의미있는 이름을 사용하면 좋다. 명사를 사용하며 축약형, 접두사, 언더스코어 같은 특수문자를 쓰지 않는다.

- 클래스 이름은 누구나 알기 쉽게 (간단하고 명확)

 

인스턴스

인스턴스 : 특정 클래스로 부터 찍어낸 객체를 해당하는 클래스의 인스턴스라고 부른다.

인스턴스화 : 클래스로 부터 객체를 찍어내는 과정을 의미하는 용어

ex) || 붕어빵 틀 = Class || 붕어빵 = Object || 각각의 붕어빵 = Instance || 붕어빵을 굽다 = Instatnce화 하다. ||

 

클래스의 구성요소

클래스 구성요소를 가리킬 대 클래스 멤버라는 용어와 혼용해서 사용

- 필드(멤버변수)(Field) : 클래스의 부품역할, 클래스 내에서 선언된 변수나 데이터를 담는 Container로 개체상태를 저장한다. 클래스 내에서 선언된 변수 또는 배열 등을 C#에서는 필드라고 한다.

★ 대부분의 필드는 private이 붙는다. ex) 전역변수는 private, 함수를 public으로 열어서 사용

 1) 전역변수 :  Main 메서드가 아닌 클래스 내에서 선언된 변수를 필드라고 한다. 변수는 소문자 또는 _로 시작

 2) 지역변수 : 특정 메서드 내에서 사용되는 변수

- 메서드(Method) :개체의 동작이나 기능을 정의(함수와 비슷한 기능)

class Project{
	public void Pr(){ // Method
    
    }
}

 

- 생성자(Constructor) : 개체를 생성하면서 무엇 인가를 하고자 할때 사용되는 메서드. 일반적으로 개체를 초기화하는데 사용. 생성자는 생성자 이름이 클래스 이름과 동일하다. 클래스 내에서 클래스 이름과 동일한 이름을 갖는 메서드는 모두 생성자이다.

생성자는 static생성자,public 생성자로 구분된다.

class Project{
	public Project{ // 생성자
    
    }
}

 

- 종료자(Destructor) : 개체를 모두 사용한 후 메모리에서 소멸될 때 실행

GC에서 클래스의 인스턴스를 사용한 후 최종 정리할 때 실행되는 클래스에서 가장 늦게 호출하는 메서드이다. C#에서는 GC가 개체를 소멸할 때 메모리를 해제하는 등의 역할을 대신 해주기 때문에 종료자에 직접 접근할 일이 별로 없다.

 

- 속성(Property) : 개체의 색상, 크기, 형태 등을 정의한다.

클래스에서 필드의 값을 읽거나 쓸 수 있게 제공하는 멤버이다. 데이터를 손쉽게 접근하고 안정성과 데이터의 유효성을 검사할 수 있다. 메서드와 비슷하고 개체 필드 중에서 외부에 공개하고자 할 때 사용하는 방법이다. private 성격이 있는 필드를 public 속성으로 외부에 공개할 때 사용한다. 클래스 안에 선언된 필드 내용을 설정(Set) 하거나 참조(Get) 할 때 사용하는 코드 블록을 속성이라고 한다.

class Player{
	public string name = "홍길동";
	public string Name {
		get
   	 	{
    		return this.name;
    	}
    	private set
    	{
    		this.name = value;
    	}
	}
}

public static void Project(){
	Player player = new Player();
    player.Name // 홍길동을 받아올 수 있지만
    player.Name = "고길동"; // set을 private으로 했기 때문에 수정하는건 불가능하다.

}

 

상속

객체 지향 프로그래밍의 장점중 하나는 이미 만든 클래스를 재사용하는 것이다. 이 재사용의 핵심 개념이 바로 상속이다. 부모 재산을 자식에게 상속하듯이 부모 클래스의 모든 멤버를 자식 클래스가 재사용 하도록 허가하는 기능이다. 여러 클래스 간의 관계를 설정할 때 수평 관계가 아닌 부모와 자식 간 관계처럼 계층적인 관계를 표현할 때 사용하는 개념을 상속이라고 한다. 클래스의 상속은 단일 상속과 다중 상속으로 구분할 수 있다. (C#의 클래스는 단일 상속만 지원)

 public class Monster // [기본 클래스 이름]
 {
      // 기본 클래스 멤버를 정의
 }
  
 public class Wolf : Monster // [파생 클래스 이름] : [기본 클래스 이름]
 {
      // 기본 클래스의 멤버를 포함한 자식 클래스의 멤버를 정의
 }

기본(Base) 클래스 = 부모 클래스

파생(Derived) 클래스 = 자식 클래스