oops concepts c object oriented programming concept tutorial
이 자습서에서는 C #의 OOPS 개념을 설명합니다. 다형성, 캡슐화, 상속 및 추상화와 같은 객체 지향 프로그래밍 원리에 대해 배울 수 있습니다.
객체 지향 프로그래밍은 동작이나 논리가 아닌 객체를 중심으로 돌아가는 원칙에 따라 작동하는 프로그래밍 모델입니다. 이를 통해 사용자는 요구 사항에 따라 개체를 만든 다음 해당 개체에 대해 작동하는 메서드를 만들 수 있습니다.
원하는 결과를 얻기 위해 이러한 객체에 대해 작업하는 것이 객체 지향 프로그래밍의 목표입니다.
=> 여기에서 전체 C # 교육 자습서 시리즈 살펴보기
이전 튜토리얼에서 배운 개념 중 일부를 수정 해 보겠습니다 !!
네임 스페이스
C #의 네임 스페이스는 클래스 모음입니다. 하나의 클래스 이름을 다른 네임 스페이스에서 선언하여 다른 클래스 이름과 구분하는 구조를 제공합니다. 같은 이름의 수업이 서로 충돌하지 않도록합니다.
수업
클래스는 데이터 유형의 청사진입니다. 실제로는 개체의 모음입니다. 여기에는 개체와 해당 개체에서 수행해야하는 작업에 대한 정의가 포함되어 있습니다.
사물
객체는 클래스의 인스턴스입니다.
이전 튜토리얼에서 이미 클래스와 객체에 대해 자세히 배웠습니다.
학습 내용 :
C #의 OOPS 개념
객체 지향 프로그래밍은 다음과 같은 다른 프로그래밍 모델에 비해 몇 가지 장점을 제공합니다.
- 프로그램에 대한 정확하고 명확한 모듈 식 접근 방식은 이해와 유지 보수가 쉽습니다.
- 프로젝트에서 생성 된 클래스와 개체는 프로젝트 전체에서 사용할 수 있습니다.
- 모듈 식 접근 방식을 사용하면 서로 다른 모듈이 독립적으로 존재할 수 있으므로 여러 개발자가 서로 다른 모듈에서 함께 작업 할 수 있습니다.
이 튜토리얼에서는 다른 주요 핵심 OOPS 개념에 더 중점을 둘 것입니다.
- 캡슐화
- 다형성
- 계승
- 추출
캡슐화
캡슐화는 프로그래머가 엔클로저 내부에 데이터와 코드 조각을 래핑 할 수있게 해주는 객체 지향 프로그래밍 개념입니다. 캡슐화 프로그램을 사용하면 한 클래스의 멤버를 다른 클래스에서 숨길 수 있습니다. 패키지 내에서 논리적 항목을 둘러싸는 것과 같습니다. 외부에서 사용 가능하고 볼 수있는 관련 정보 만 허용하며 특정 회원에게만 허용됩니다.
캡슐화는 액세스 지정자를 사용하여 구현됩니다. 액세스 지정자는 C #에서 클래스 멤버의 가시성과 접근성을 정의하는 데 사용됩니다.
C #에는 다음 액세스 지정자가 포함됩니다.
7z 파일이란 무엇입니까?
- 공공의
- 은밀한
- 보호
- 내부의
액세스 지정자는 클래스 및 해당 값의 가시성을 정의합니다. 이를 통해 코드의 특정 부분에 대한 데이터를 표시하고 다른 부분에서 숨길 수 있습니다. 가장 일반적으로 사용되는 가시성은 공개 및 비공개입니다.
그것들을 살펴 보겠습니다.
공공의: public 키워드를 사용하면 멤버가 프로젝트 내부 어디에서나 볼 수 있습니다. 이 액세스 지정자는 가시성 제한이 가장 적습니다.
은밀한: private 멤버는 동일한 클래스 내의 멤버 만 액세스 할 수 있습니다. 이것은 가장 제한된 가시성 중 하나입니다.
보호됨 : 보호 된 액세스 가능성을 사용하면 클래스 내에서 및이 클래스를 상속하는 다른 클래스에서 멤버에 액세스 할 수 있습니다.
내부의: 내부는 프로젝트 내에서 접근성을 제공합니다. 또 다른 유사한 내부 접근성은 내부적으로 보호됩니다. 이것은 내부와 동일한 것을 허용하고 유일한 차이점은 자식 클래스가이 클래스를 상속하고 다른 프로젝트에서도 구성원에게 도달 할 수 있다는 것입니다.
다형성
다형성은 그리스어 사전에서 파생되었으며 다양한 형태를 가진 사전을 의미합니다. Poly는 많은 것을 의미하고 Morph는 형태를 의미합니다. 이를 통해 C #의 클래스는 동일한 이름의 여러 구현을 가질 수 있습니다.
다형성은 기본적으로 두 부분으로 나뉩니다.
- 컴파일 타임 다형성
- 런타임 다형성
# 1) 정적 또는 컴파일 시간 다형성
컴파일 시간 다형성은 정적 다형성이라고도합니다. 메서드 오버로딩은 컴파일 타임 다형성이 달성되는 방법 중 하나입니다. 컴파일시 메서드 호출 결정이 이루어 지므로 컴파일 타임 다형성이라고합니다.
메서드 이름을 동일하게 유지하지만 다른 매개 변수 집합을 전달하면됩니다. 메서드 오버로딩에서 시스템은 먼저 사용 된 매개 변수를 확인하고 매개 변수 집합을 기반으로 적절한 메서드를 호출하기로 결정합니다.
예:
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i+j) ); } void print(string a, string b) { Console.WriteLine('Printing String: ' , (a+b)); } static void Main(string() args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello','World'); Console.ReadKey(); } }
위의 예에서 우리는 다른 매개 변수를 사용하여 동일한 메서드를 'print'두 번 호출했습니다. 처음에는 두 개의 정수를 매개 변수로 전달한 다음 두 개의 문자열을 매개 변수로 전달했습니다. 이름이 같은 두 가지 '인쇄'방법이 있습니다.
정수 시스템으로 매개 변수를 전달하면 두 개의 정수 매개 변수를 받아들이는 'print'라는 메소드를 찾고 동일한 이름을 가진 다른 메소드를 무시하고 실행합니다.
두 번째 부분에서는 문자열 매개 변수를 전달했습니다. 다시 시스템은 두 개의 문자열 매개 변수를 허용하는 메소드를 찾습니다. 따라서 전달 된 매개 변수에 따라 첫 번째 메소드는 두 개의 정수를 추가하고 다음 메소드는 두 개의 문자열을 연결합니다.
# 2) 동적 다형성 또는 런타임 다형성
런타임 다형성 또는 동적 다형성은 메서드 이름과 메서드 서명이 동일한 이름과 매개 변수를 가질 때 발생합니다. 메서드 재정의는 동적 다형성의 예입니다. 사용자가 부분 인터페이스 구현으로 추상 클래스를 만들 수 있습니다.
메서드 재정의는 상속을 사용하여 수행됩니다. 메서드를 재정의하려면 기본 클래스와 파생 클래스가 동일한 이름과 매개 변수를 가져야합니다. 컴파일 시간 동안 컴파일러는 재정의 메서드를 인식 할 수 없으므로 오류가 발생하지 않습니다. 메소드 실행은 런타임 중에 결정됩니다.
예:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public void print() { Console.WriteLine('Printing from class Execute'); } public static void Main(string() args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
Printing from class Execute
Execute 클래스가 Program 클래스의 모든 메서드를 상속했지만 두 클래스에 모두있는 print 메서드를 호출하면 자식 클래스에있는 메서드가 부모 클래스의 메서드를 재정의합니다.
동적 다형성은 추상화를 구현하는 데 사용됩니다. 이를 통해 사용자는 파생 클래스에서 상속 될 때 인터페이스에 대한 구현을 제공하는 데 사용되는 추상 클래스를 만들 수 있습니다. 추상 클래스는 메서드의 이름 / 서명을 포함 할 수 있으며 파생 클래스는 메서드에 대해보다 전문화 된 정의를 가질 수 있습니다.
계승
상속은 OOPS 개념의 중요한 부분입니다. 상속에서는 부모 및 자식 클래스를 정의합니다. 자식 클래스는 부모 클래스의 모든 메서드, 개체 및 속성을 상속 할 수 있습니다. 자식 클래스는 자체 메서드와 특정 구현을 가질 수도 있습니다.
부모 클래스는 기본 클래스라고도하며 기본 클래스를 상속하는 자식 클래스는 파생 클래스라고도합니다.
예:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public static void Main(string() args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
여기에는 하나의 메서드가있는 프로그램으로 명명 된 클래스가 있습니다. Program 클래스를 상속하는 또 다른 클래스 Execute가 있습니다. Execute 클래스는 파생 클래스이고 클래스 프로그램은 기본 클래스로 알려져 있습니다.
이제 클래스 프로그램에 대한 개체 인스턴스를 만드는 대신 Execute 클래스에 대한 개체 인스턴스를 만들었습니다. 이 인스턴스를 사용하여 기본 클래스에서 인쇄 메서드에 액세스 할 수 있습니다.
따라서 위 코드의 출력은 다음과 같습니다.
Printing from class Program
파생 클래스는 메서드를 상속 할뿐만 아니라 가시성에 따라 필드, 속성 등과 같은 거의 모든 클래스 멤버를 상속합니다. C #의 상속은 여러 상속의 사용을 허용하지 않습니다. 즉, 한 클래스는 여러 다른 클래스에서 상속 할 수 없지만 한 클래스는 다른 클래스에서 상속 할 수있는 다른 클래스에서 상속 할 수 있습니다.
추출
추상화는 객체 지향 프로그래밍의 주요 원칙 중 하나입니다. 추상화를 통해 프로그래머는 필요한 세부 사항 만 세상에 표시하고 나머지는 숨길 수 있습니다. 추상화는 Abstract 클래스와 인터페이스를 사용하여 C #에서 수행됩니다.
'Abstract'키워드를 사용하여 클래스를 추상 클래스로 선언 할 수 있습니다. C #의 Abstract 클래스는 항상 계층 구조의 기본 클래스입니다. 다른 클래스와 다른 점은 인스턴스화 할 수 없다는 것입니다. C # 추상 클래스는 상속되어야합니다.
예:
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public void Describe() { return 'Description of the car'; } } class Hyundai : Car { }
다음의 출력은 다음과 같습니다.
Description of the car
상속 또는 동적 다형성 동안 이전 예제와 비교하면 유사점을 찾을 수 있습니다. 가장 눈에 띄는 차이점은 Car 클래스 이전에 abstract 키워드를 사용하는 것입니다. 이를 재정의하거나 동적 다형성에서 수행 한 것과 유사한 자체 구현을 제공하려는 경우. 그런 다음 다음과 같이 할 수 있습니다.
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
따라서 지금이 코드를 실행하면 다음과 같은 출력이 표시됩니다.
Description of the car is now Hyundai
파생 클래스 메서드는 기본 클래스 메서드를 재정의합니다. 이러한 방식으로 자체 구현 메서드를 사용하여 Ferrari, Porsche, BMW 등과 같은 다른 파생 클래스를 만들 수 있습니다.
자세히 살펴보면 추상 클래스의 설명 메서드에 구현이 포함되어 있지 않음을 알 수 있습니다.
그렇다면 왜 우리는 빈 메서드를 정의합니까?
이는 Abstract 클래스가 메서드의 시그니처를 제공하고 하위 클래스가 이러한 모든 메서드에 대한 구현을 생성하는 것을 의무화하기 때문입니다. 이렇게하면 기본 클래스를 공유 할 수 있지만 동시에 파생 클래스의 메서드 구현에 대한 검사도 유지됩니다.
상호 작용
C #에서 인터페이스는 클래스의 청사진입니다. 인터페이스는 추상 클래스와 유사하며 100 % 추상화를 달성하는 데 사용됩니다. 인터페이스 내부에 설명 된 모든 메서드는 기본적으로 추상적입니다. 메서드 본문이 없으며 인스턴스화 할 수 없습니다.
인터페이스는 주로 다중 상속 및 전체 추상화를 달성하는 데 사용됩니다. 인터페이스 내에서 선언 된 모든 메서드 서명은이를 구현하는 클래스 또는 구조체의 구현과 함께 제공되어야합니다.
예:
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } interface Car { string Describe(); } class Hyundai : Car { public string Describe() { return 'Description of the car is now Hyundai'; } }
위 코드의 출력은 다음과 같습니다.
Description of the car is now Hyundai
여기에서 인터페이스 Car를 만들었습니다. 인터페이스는 메소드 정의를 가질 수 없으므로 인터페이스에 메소드 이름과 리턴 유형을 제공했습니다. 그런 다음 인터페이스 Car를 다른 클래스 Hyundai에 구현했습니다. 구현 된 클래스에서 인터페이스 내부에 정의 된 메서드에 대한 정의를 제공했습니다.
결론
객체 지향 프로그래밍 개념에서 프로그램의 각 부분은 객체로 취급됩니다. 클래스는 유사한 유형의 요소 모음이며 객체는 클래스의 인스턴스입니다.
C #의 캡슐화를 통해 사용자는 클래스 및 해당 멤버의 가시성을 설정할 수 있습니다. 다형성을 사용하면 메서드가 동일한 이름을 갖지만 동일한 클래스 내에서 다른 매개 변수를 사용하거나 다른 클래스에서 동일한 매개 변수를 사용할 수 있습니다.
상속은 파생 클래스라고도하는 자식 클래스가 기본 클래스라고도하는 부모 클래스의 메서드, 개체, 필드 등을 포함한 모든 속성을 상속하는 경우입니다. 추상화를 통해 프로그램은 구현 세부 정보를 숨기면서 서명 만 표시 할 수 있습니다.
통합 프로그램
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i + j)); } void print(string a, string b) { Console.WriteLine('Printing String '+ a + b); } static void Main(string() args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello', 'World'); Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
=> 여기에서 전체 C # 교육 자습서 시리즈 살펴보기