** 객체지향 프로그래밍 수업 내용 정리입니다.
** C# 기준으로 작성되었습니다.


데이터 타입(Data Type)

  • 변수(Variable): 데이터를 담는 일정 크기의 공간
  • 값 형식: 변수가 값을 담는 데이터 형식
  • 참조 형식: 변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식
  • 기본 데이터 형식
    • 정수 계열 형식(Integral Types): byte, sbyte, short, ushort, int, uint, long, ulong, char
    • 부동 소수점 형식(Floating Point Types): float, double, decimal
    • 문자 형식: char / 문자열 형식: string
    • 논리 형식: bool
    • object 형식(참조 형식, 상속을 이용한 데이터 형식)
  • 상수(Constant): 그 안에 담긴 데이터를 바꿀 수 없는 메모리 공간
  • 열거형(Enumeration): 열거된 형태의 상수, enum 키워드를 이용하여 선언
  • Nullable 형식: null한 변수가 필요할 때 사용. 데이터 형식 뒤에 ‘?’를 붙여서 사용. 예)int? a = null;
  • var: 자동 형식 지정. 반드시 지역변수로 사용하고 초기값 필요.

연산자

  • 산술 연산자
    • 수치 형식의 데이터를 다루는 연산자.
    • + - * / %
  • 증가 연산자와 감소 연산자
    • 증가 연산자: 값을 1 증가, ++
    • 감소 연산자: 값을 1 감소, –
  • 문자열 결합 연산자
    • String 형식에서 문자열을 결합, +
  • 관계 연산자
    • 두 연산자 사이의 관계를 확인
    • < > <= >= == !=
  • 논리 연산자
    • 참과 거짓으로 이루어지는 진리값이 피연산자인 연산
    • && || !
  • 조건 연산자
    • 조건에 따라 두 값 중 하나의 값을 반환
    • 조건식 ? 참일때의 값 : 거짓일때의 값
  • 비트 연산자
    • 비트 수준에서 데이터를 가공하는 연산자
    • « » & | ^ ~ & | ^ ~
  • 할당 연산자
    • 변수 또는 상수에 피연산자를 할당
    • = += -= *= /= %= &= |= ^= «= »=
연산자 우선순위
  • 후위 ++/– 연산자
  • 전위 ++/– 연산자
  • * / %
  • + -
  • « »
  • < > <= >= is as
  • == !=
  • &
  • \^
  • |
  • &&
  • ||
  • ?:
  • = *= /= %= += -= «= »= &= |=

코드의 흐름 제어

  • 분기문
    • 프로그램의 흐름을 조건에 따라 여러 갈래로 나누는 흐름 제어 구문
    • if, switch
  • 반복문
    • 특정 조건을 만족하는 동안 코드 또는 코드 블록을 계속 반복해서 실행하도록하는 문장
    • while, do while, for, foreach
  • 점프문
    • break, continue
    • goto

메소드(Method)

  • 메소드
    • 일련의 코드를 하나의 이름 아래 묶은 것
    • OPP적인 의미에서는 객체의 데이터를 처리하는 방법을 추상화한 것
  • return문
    • 메소드를 종결시키고 프로그램의 흐름을 호출자에게 돌려줌
    • 반환 형식이 void인 경우에도 return문 사용 가능
  • 매개 변수
    • 메소드 외부에서 메소드 내부로 데이터를 전달
    • 변수가 담고있는 데이터가 복사되어 메소드 내부로 전달
  • 참조에 의한 매개 변수 전달
    • 매개 변수가 메소드에 넘겨진 원본 변수를 직접 참조하게 하는 방법
    • 메소드 선언과 호출 시 ref 키워드 사용
  • 출력 전용 매개 변수: out
  • 메소드 오버로딩
    • 하나의 메소드 이름에 여러 개의 구현을 올리는 것
  • 가변길이 매개 변수
    • 개수가 유연하게 변할 수 있는 매개 변수
    • params 키워드와 배열을 이용하여 선언
  • 명명된 매개 변수
    • 메소드를 호출할 때 매개 변수의 이름을 명시하여 순서에 관계없이 매개변수에 할당할 데이터를 바인딩 가능
  • 선택적 매개 변수
    • 메소드 선언 시 매개 변수에 기본값을 할당

클래스(Class)

  • 클래스: 객체를 만들기 위한 청사진
  • 생성자
    • 선언하지 않아도 컴파일러가 암시적으로 기본생성자 제공
    • 객체의 초기화에 필요한 파라미터를 입력받을 수 있음
  • 복사
    • 얕은 복사: 객체에서 힙의 주소만 복사
    • 깊은 복사: 원본 객체와 별도의 객체를 할당하여 각 필드의 값을 복사
  • this 키워드
    • 객체의 스스로를 가리키는 키워드
    • 객체 내부에서 자신의 필드나 메소드에 접근할 때 사용
  • 접근 한정자
    • public: 클래스의 내부/외부 모든 곳에 접근 가능
    • protected: 클래스의 외부에서는 접근 불가, 파생 클래스에서는 접근 가능
    • private: 클래스의 내부에서만 접근 가능
    • internal: 같은 어셈블리에 있는 코드에 대해서만 public으로 접근 가능, 외부는 private
    • protected internal: 같은 어셈블리에 있는 코드에 대해서만 protected로 접근 가능. 외부는 private
  • 상속
    • 한 클래스가 다른 클래스로부터 필드, 메소드, 프로퍼티 등을 물려 받는 것
    • 자식 클래스는 파생 클래스, 부모 클래스는 기반 클래스라고도 불림
    • 부모 클래스를 가리키는 키워드는 base
  • 기반 클래스와 파상 클래스 사이의 형식 변환
    • 파생 클래스의 인스턴스는 기반 클래스의 인스턴스로써 사용 가능
  • 다형성(Polymorphism)
    • 객체가 여러 형태를 가질 수 있음
    • 자신으로부터 상속받아 만들어진 파생 클래스를 통해 다형성을 실현
  • 오버라이딩(Overriding)
    • 부모 클래스에서 선언된 메소드를 자식 클래스에서 재정의 하는 것
    • 부모 클래스에서 미리 virtual 한정자로 선언 필요
  • 메소드 숨기기: 부모 클래스에서 virtual로 선언하지 않고, 자식 클래스에서 new 한정자를 이용하여 재선언하여 부모 클래스 버전의 메소드를 숨김
  • 오버라이딩 봉인: sealed 한정자를 이용하여 메소드를 선언하면 파생클래스에서는 해당 메소드를 오버라이딩 할 수 없음
  • 중첩 클래스: 클래스 안에 선언된 클래스
  • 분할 클래스: 여러 번에 나눠서 구현하는 클래스
  • 확장 메소드: 기존 클래스의 기능을 확장
  • 구조체(struct)
    • 클래스처럼 필드와 메소드를 가질 수 있음
    • 첨조 형식은 값 형식, 복사는 깊은 복사, 인스턴스는 선언만으로도 생성이 가능

인터페이스(interface)와 추상클래스(abstract class)

  • 인터페이스
    • 선언되어 있는 메소드를 구현하기만 한다면 해당 인터페이스를 지원하는 코드에는 그 인터페이스의 모든 파생클래스를 사용할 수 있음
    • 인터페이스를 인터페이스로 상속 가능
    • 다중 상속 가능 (여러개의 인터페이스를 한꺼번에 상속 가능)
  • 추상 클래스
    • 인터페이스와 달리 구현을 가질 수 있음
    • 인스턴스를 가질 수 없음

프로퍼티(property)

  • 자동 구현 프로퍼티: get, set 자동 구현

    • public class NameCard{
          public string Name{
              get; set;
          }
          public string PhoneNumber {
              get; set;
          }
      }
      
  • 프로퍼티를 이용한 초기화

    • NameCard card = new NameCard(){
          Name = "홍길동",
          PhoneNumber = "010-1234-5678"
      }
      
  • 무명 형식

    • 선언과 동시에 인스턴스를 할당하는 형식

    • 1회용 데이터 형식으로 사용

    • var card = new {Name="홍길동", PhoneNumber="010-1234-5678"}
      
  • 추상 프로퍼티: 인터페이스처럼 구현되지 않은 프로퍼티

배열(Array), 컬렉션(Collection), 인덱서(Indexcer)

  • 배열(Array)
    • 다수의 데이터를 한번에 다루기 위해 사용
    • 다차원 배열: 차원이 둘 이상인 배열
    • 가변 배열: 배열을 요소로 갖는 배열. 차원 단위에서 배열 크기 변경 가능
  • 컬렉션(Collection)
    • 같은 성격을 띄는 데이터의 모음을 담는 구조
    • ArrayList, Queue, Stack, Hashtable
  • 인덱서(Indexer)
    • 인덱스를 이용하여 객체 내의 데이터에 접근하게 해주는 프로퍼티

일반화 프로그래밍(Generalization)

  • 일반화 프로그래밍: 데이터 형식 일반화를 이용하는 프로그래밍
  • 일반화 메소드: 데이터 형식을 일반화한 메소드. void MyMethod<T> ( T[] value)
  • 일반화 클래스: 데이터 형식을 일반화한 클래스. class MyClass<T>
  • 일반화 컬렉션: 데이터 형식을 일반화한 컬렉션. List<T>, Queue<T>, Stack<T>, Dictionary<TKey, TValue>

델리게이트(Delegate)와 이벤트(Event)

  • 콜백(Callback): 어떤 일을 대신 해 주는 코드

  • 델리게이트(Delegate)

    • 메소드에 대한 참조.
    • 델리게이트에 메소드 주소를 할당한 후 델리게이트를 호출하면 할당된 메소드가 호출됨
    • 코드의 일부를 직접 정의해서 사용하고 싶을 때 사용
  • 일반화 델리게이트: 일반화 메소드 참조 가능

  • 델리게이트 체인: 델리게이트가 여러개의 메소드를 동시에 참조하여 델리게이트 호출 시 참조된 메소드를 하나씩 호출

  • 익명 메소드: 이름이 없는 1회용 메소드

    • Calculate Calc = delegate(int a, int b) { return a+b; }
      
  • 이벤트(Event)

    • 사건을 나타내는 객체
    • 델리게이트를 event 한정자로 수식하여 선언
    • 델리게이트와 달리 임의로 일으킬 수 없음

람다식(Lambda Expression)

  • 람다식: 1회용 메소드(=익명 메소드)

    • Calculate Calc = (int a, int b) => a+b;
      
  • 형식 유추: 람다식의 매개 변수를 컴파일러가 유추. (매개변수에서 형식 지정x)

댓글남기기