프로그래밍/(도서)프랙티컬 C#

[C#] 프랙티컬 C# - 1. 객체지향 프로그래밍 기초

Victory_HA 2022. 3. 31. 22:34

  • C#과 같은 객체지향 언어에서는 '객체'와 '인스턴스' 용어가 등장하는데, 두 개의 차이는 무엇일까?
  • 프로그래밍 언어에서 대체로 '객체' == '인스턴스' 라고 생각하면 됩니다.
  • '객체지향'이라고 말할 때의 '객체'는 '클래스' or '인스턴스' 두 가지 의미를 포함한 개념을 나타냅니다.

1.1 클래스

1.1.1 클래스 정의

클래스

  • 클래스 내부에 데이터, 메서드 등을 정의할 수 있습니다.
  • Class 정의*생성자
  • [접근 제한자] class 클래스명 { // 필드, 메소드 ... }
  • 클래스와 이름이 같은 특수한 메서드
  • 아래 예제에서는 생성자의 정의에 맞춰 Code, Name, Price 속성에 있는 set 접근자의 권한을 private로 설정했습니다.
  • 이렇게하면 생성자를 통하지 않고서는 속성 값을 초기화 하지 못합니다.

생성자 예제

class Program
{
    // class
    public class Product
    {
        // 속성
        public int Code { get; private set; }
        public string Name { get; private set; }
        public int Price { get; private set; }

        // 생성자 
        // Class와 같은 이름의 메서드
        // 생성자를 통해서 Code,Name,Price를 초기화 해야합니다.
        public Product (int code, string name, int price)
        {
            this.Code = code;
            this.Name = name;
            this.Price = price;
        }
    }
}

1.1.2 클래스의 인스턴스 생성

  • 클래스를 이용하려면 new 연산자를 사용해 클래스의 인스턴스를 생성합니다.
  • 인스턴스란?
    • '컴퓨터의 메모리상에 확보된 클래스의 실체'라고 생각하면 됩니다.
  • 인스턴스 예제*
  • Product cloth = new Product(001,"jean",19000);

1.2 구조체

  • 구조체는 클래스와 매우 유사합니다.
  • 구조체에도 속성과 메서드가 있으므로 클래스처럼 이용할 수 있습니다.
  • 구조체 예제*
  • DataTime date = new DateTime(2021,06,10); int year = date.year;

구조체와 클래스의 차이점?

  • 객체를 메모리 상에 저장하는 방식의 차이
  • 클래스는 변수가 있는곳과 다른 곳에 객체의 영역이 확보되고 변수에는 그 참조가 저장됩니다.
    • 클래스 객체 : 힙 영역에 할당됩니다.
  • 구조체는 변수 자체에 객체가 저장됩니다.
    • 구조체 객체 : 스택 영역에 할당됩니다.
    • 또한 상속할 수 없다는 제한이 있습니다.

클래스, 구조체 선언 예제

//클래스
class MyClass
{
    public int x { get; set; }
    public int y { get; set; }
}

//구조체
struct MyStruct
{
    public int x { get; set; }
    public int y { get; set; }
}

MyClass myClass = new MyClass {x = 1, y = 2};
MyStruct myStruct = new MyStruct {x = 1, y = 2};

1.3 값형과 참조형

1.4 정적 멤버와 정적 클래스

1.4.1 정적 속성과 정적 메서드

정적 속성, 정적 메서드

  • 아래 코드는 인스턴스를 생성하지 않은 상태입니다.
  • Today 속성을 참조했고, WriteLine 메서드를 호출했습니다.
  • 이처럼 인스턴스를 생성하지 않고 이용할 수 있는 속성, 메서드를 각각 정적속성, 정적메서드라고 부릅니다.

정적속성 , 정적메서드 예제

// Today 는 static 속성
DateTime today = DateTime.Today;

// Console은 static 클래스, WriteLine은 static 메서드
Console.WriteLine("");

정적 멤버

  • 정적 속성, 정적 메서드, 정적 필드를 모두 정적 멤버라고 합니다.
  • 선언부에 static 키워드를 사용합니다.
  • 정적 멤버 이용시 new로 객체를 생성할 필요가 없습니다.
    • '형 이름.속성', '형 이름.메서드'와 같이 '형 이름'을 사용해서 접근합니다.

정적멤버 예제

pubilc static DateTime Today { ... }

1.4.2 정적 클래스

  • 선언부에 static 키워드를 사용합니다.
  • 정적 클래스에서 인스턴스 생성은 의미가 없기 때문에, 인스턴스 속성, 인스턴스 메서드가 없습니다.

정적 클래스 예제

public static class Console { ... }
  • C# 정적 클래스 인스턴스 생성 시 오류 발생합니다.

1.6 상속

1.6.1 상속이란?

  • 이미 정의된 클래스를 확장,변경 하여 새로운 클래스를 만드는 것
  • 상속한다는 '파생한다'라고도 말합니다.