MixedCode

안녕하세요. 믹스드코드 강창훈입니다.

믹스드코드랩이 실전형 코드랩(프로젝트)에 치중하다보니 개발의 기본인 개발언어 와 교양있는? 개발자들을 위한 교양수업 내용이 많이 부실한듯하여 객체지향프로그래밍(OOP) 개념과 C#,Javascript 언어 기반으로 개발언어의 객체지향적 사용법들에 대한 실무적인 내용 위주로 강의를 진행해보기로 했습니다.

앞으로 시간나는대로 점진적으로 해당 내용들에 대해 올리도록 노력하겠습니다. ^^

본론으로 돌아와서
제 주변에 개발을 잘하시거나 나름 성공?했다고 하는 개발자분들 그리고 저와 같이 나이가 많은 생명력?이 긴 개발자들의 특징과 백그라운드를 조금 들여다보면 컴퓨터공학과 출신보다는 철학과,인문계열,물리학과,통계학과,수학과등 의외로 컴퓨터와는 직접 관계가 없을것 같은 전공분야의 분들이 많습니다.

왜? OOP,Class,Object에 대해 이야기하려는데 이런 말씀을 드리냐면 객체지향프로그래밍 자체가 수와 계산의 영역보다는 개념 정립의 싸움이고 개념확립의 영역이기 때문입니다.

개념을 정확히 잘 이해하고 활용하면 객체지향 프로그래밍(OOP : Object Oriented Programming)은 그리 어렵지 않으며 각종 개발언어를 이용해 객체지향 프로그래밍이 가능해집니다.

프로그래밍 방법의 변화 즉 개발 패러다임의 변화를 큰틀에서 먼저 한번 짚고 넘어가겠습니다.
아래 프로그래밍 패러다임은 어느 프로그래밍 기법이 좋다,나쁘다  관점이나 주류,비주류 관점으로 절대 나눠 생각하시면 안될듯하며 개발의 목적이 되는 비지니스나 데이터의 성격에 따라 다양한 프로그래밍 기법을 혼합해 사용하거나 이전 패러다임들이 사용될수 있음을 인지하고 읽어주시기 바랍니다.

1.순차적 프로그래밍 : Sequential  Programming
-코딩 줄(라인) 순서대로 읽어 들이고 해석하여 실행시키는 프로그래밍 방법
-이시대를 대표해서 회자되는 " 몇만줄을 짜봤어, 이거 돌리는데 몇일이 걸렸어." 이런말들이 있죠.
-순차 프로그래밍의 단점은 라인수가 많을수록 모든 라인이 실행이 완료되어야 결과물을 확인할수 있어 라인수와 실행시간이 오래걸리면 몇시간에서 몇일을 기다려 결과값을 확인하고 올바른 결과치가 아니면 다시 이와같이 비효율적이고 생산적이지못한 일을 반복해야하는 상황이 발생합니다. ㅋㅋ
-찾아 보면 아직도 요즘의 최신 브라우저도 이 순차적 프로그래밍 방식과 유사하게 서버로부터 제공된 HTML소스를 라인별로 위에서 밑으로 읽어 들이면서 해석하여(인터프리팅 방식) 브라우저를 통해 사용자들에게 HTML 컨텐츠를 표시해주고 있습니다.


2.절차 지향 프로그래밍: Procedural Programming
-프로시져 호출 개념을 바탕으로 하는 기법으로 명령형 프로그래밍과 혼용되어 사용되기도 한다.
-프로시저에 입출력 형식을 정확히 규정하여 사용해 입력 매개변수의 수와 유형, 그리고 실행 결과값(리턴값) 형식을 명확히 지정하여 프로그래밍합니다.
-프로시저 단위로 기능을 분리할수 있기 때문에 프로그래밍의 복잡도가 높지않고 코드의 재사용성이 좋기때문에  유지보수가 쉽습니다.
-다양한 프로시저(함수)를 준비해두고 기초데이터를 다양한 함수를 절차적으로 태워 결과물을 얻어내는 방식입니다.
-제품하나를 만드는데 원재료가 다양한 기계(프로시져,함수,메소드)를 통과해 완성품인 결과값을 얻어 내는 구조라고 이해하시면 좋겠네요. ^^
ㄴ원재료인 데이터가 움직이면서 프로시져(기계)은 움직이지 않고 결과물을 얻습니다.

-모듈화와 구조화가 가능하기에 순차적 프로그래밍보다 개발이 용이하며 변수의 접근에 대한 허용여부(스코프)란 개념을 적용해 프로시저의 모듈성을 유지할수있게 해줍니다.
-절차프로그래밍언어: Visual Bisic언어,포트란,C언어

3.객체 지향 프로그래밍 : Obect Oriented Programming
-기존 프로그래밍 방법들이 데이터와 그 데이터의 처리방법에 중점을 두었다면 프로그래밍을 수많은 객체라는 기본단위로 나누고 이런 객체들간의 상호작용으로 프로그램을 기술하는 방법입니다.
-절차지향 프로그래밍과 비교해보면  데이터인 원재료는 처음 할당된곳에서 움직이지 않고 결과물을 만들어 내기 위해 다양한 객체의 생성과 사용 과정을 반복해 결과값을 도출해내는 방식입니다.
ㄴ즉 원재료를 작업공간에 올려놓고 이런 기계(객체),저런 기계(객체)를 가져와 갈고 딱고해서 결과값을 만들수 있는 구조입니다. 
-주요언어: 스몰토크로 시작해 C++,C#,JAVA,ObjectiveC-,Swift,Javascript,파이썬등 주요 현대적 언어 모두 지원
-활용분야: 대부분의 현대적 각종 어플리케이션 개발에 사용됨.

4.함수형 프로그래밍 : funtional Programming
-BigData,Machine Learning(머신러닝),AI(인공지능)의 시대가 요즘 도래하면서 부각되고 있는 프로그래밍 방식이 함수형 프로그래밍입니다.
-자료(데이터) 처리를 수학적 함수의 계산으로 취급하고 상태나 값이 변경되는 가변 데이터를 멀리하는 프로그래밍 패러다임입니다.
-함수의 출력값은 입력된 인수에만 의존적으로 프로그래밍되고 실행 떄문에 함수 외부조건인 상태,값에 영향을 받지 않아 항상 정확한 결과값을 만들어 낼수 있고 다른 프로그래밍 기법보다 그 동작 및 결과를 예측하기 쉽다. 따라서 함수형 프로그래밍은 주로 수학,통계분야에서 많이 사용되고 있으며 요즘같은 빅데이터 시대에 부각되는 프로그래밍 기법이라 할수 있습니다.
-상태에 의존하지 않기 때문에 OOP가 취약한 멀티 쓰레딩, 동시성 병렬처리 프로그래밍 및  그런 환경속에서의 테스트 하기도 쉽습니다.
-함수 프로그래밍의 핵심은 프로그래밍을 수학에 가깝게 만드는 것이다라고합니다.
-주요 함수형 언어 : 스킴, 클로져, 얼랭, 하스켈, 스칼라, F#,파이썬
-활용분야: 데이터공학,금융,데이터 처리와 분석,빅데이터,예측분석,검색,보안,R(통계),Mocking,각종람다식,머신러닝과 AI의 기반기술


지금부터 OOP에 집중해 OOP의 주요 핵심 개념들에 대해 하나씩 알아가보도록 하겠습니다.

1.추상화

2.캡슐화
3.상속성
4.다형성


1.추상화: Abstraction 

-정의: 현실에 존재하는 다양한 실체들과 개념들의 공통 속성이나 기능을 묶어 그룹형식으로 이름을 붙여 표현하는 방법.

-목적:개별적인 실체,개념 기반으로 프로그래밍하기에는 실체,개념이  너무 다양하고 그 수가 많아 실체들의 유사성을 기반으로 공통적인 특성이나 기능으로 그룹화(추상화) 하여 프로그래밍을 하는 방법을 단순화시키고 적용 대상을 극대화시키는 위함.

-방법:추상화를 구현하는 구체적인 방법은 클래스를 정의하고 클래스를 인스턴화해 객체를 만들어 객체기반에서 프로그래밍을 하는것이다.

-예시1: 사람,고래,사자,펭귄,독수리들의 추상화된 개념이 동물이고 이들은 동물이란 추상화된 개념을 개별 실체로 표현한 것들이 사람,고래,사자등의 개별 실체인 객체라 표현할수 있다.
-예시2: 박근혜,홍준표,최순실이란 개별 객체를 크게 추상화 한 개념은 사람이며 관점을 바꿔 다시 추상화 하면 악당 이라고도 추상화할수 있습니다. 악당의 대표적인 실체로 박근혜와 최순실이란 객체로 표현될수 있습니다.


1.1 클래스와 객체의 관계
ㅁ 클래스: Class
-클래스는 추상화 개념을 통해 현실 세계의 다양한 실체와 개념들을 일반화 시켜 코드로 표현한것이다.
+일반화(Generalization)
ㄴ연관성이 있는 두 개 이상의 개체(실체) 집합을 묶어 좀더 상위의 개체(실체) 집합을 만드는 것.
ㄴ일반화는 소수보다는 다수의 개념이 내포됨.
ㄴ추상이란 직접 경험하거나 깨달을수 없는것을 말하며 현실적인것과 반대의 개념입니다.


ㅁ객체 : Object
-일반적이고 추상화된 클래스를 구체적으로 실체화하거나 개념화 시킨것.
+실체화:(인스턴스 = Instance ) 
ㄴ일반적이거나 추상적인 것을 구체적인 예를 통해서 표현하는 것.
ㄴ일반화된 실체와 개념을 이용 구체적으로 실체화 하는 행위
ㄴ일반적이고 추상화된 개념인 클래스를 이용해 구체적으로 객체를 생성하는 과정을 인스턴스화(instantiation)라고 표현하며 인스턴스화는 인스턴스화된 결과물인 객체를 저장하기 위해 
메모리에 공간을 할당하고 이름을 지정하여 생성된 객체의 상태나 정보를 메모리를 통해 관리할수 있게 해주는 환경을 제공합니다. 


ㅁ객체(Object) vs 개체(Entity)
OOP에서 객체와 개체란 용어를 혼용해서 사용하는 경우가 많은데 자세히 말씀드리면 클래스를 인스턴스화한 결과물인 객체와 인스턴스화 대상이 대상이 되는 클래스인 개체는 엄연한 다른 뜻을 가지고 있습니다.
언어학으로 개체는
 하나의 의미가 있는 실체 또는 개념을 말하며 현실에 존재하지 않는실체가 아닌 개념이라도 의미가 부여되어 있는 모든것은 개체라고 바라봅니다.
People user = new People();

상기 코드에서 People 클래스를 인스턴스화한 객체가 user 이며 user 객체의 인스턴스화 대상이되는(의미가 있는) People 클래스를 개체라고 표현합니다.
즉, 개체는 클래스의 인스턴스화 진행하는 상황에서 객체생성의 대상이 되는 클래스를 개체라 표현하며 일반적인 클래스와는 약각 다른 뉘앙스를 가집니다.
객체는 클래스를 인스턴스화 결과물로서 메모리상에 할당된 저장공간 및 저장된 공간의 이름을 말하며 개체는 인스턴스화가 가능한 의미가 있는 대상이 되는 클래스를 말합니다. 

개체(Entity)는 의미가 있냐 없냐가 기준이고 인스턴스화가 될수 있냐 없냐가 기준이기에 주로 DATABASE 모델링 과정에서 중요한 위치를 차지합니다.
흔히 DB Modeling의 과정은 개념모델링 =>논리모델링 =>물리모델링 과정을 통해 데이터베이스 모델링이 진행되는데 첫 단계인 개념 모델링 단계에서는 영구적인 데이터 저장 대상으로 의미가 있는
개체를 찾고 분리해내는 과정에서 개체(Entity)를 도출하고 개체들의 관계를 정의(ERD  =  Entity Relationship Model)하여 개념 모델링을 시작합니다. 


정리하면
인스턴스화가 가능한 의미가 있는 개체 클래스를 인스턴스화하면 객체가 만들어지기 때문에 흔히들 혼용해 사용하긴 하지만 개발자라면 그 의미는 정확히 알고계시면 좋을듯합니다.
개체는 인스턴스화가 가능한 의미가 부여된 클래스이자 인스턴스화 할때 그 대상이 되는 클래스를 말합니다.

ex)몸을 구성하는 개체로 심장,눈,코등의 개체가 존재한다.
ex2)회사 조직을 구성하는 개체로는 관리팀,개발팀,디자인팀이란 개체가 존재하며 개발팀은 개발자란 하위 개체들로 구성된다.
ㄴ개별적인 실체(실제 존재하는 물체) 또는 개념
desc)사람과 사물처럼 물리적으로 존재하는 것(실체)만을 의미하지는 않고 개념적인것들도 포함된다.

객체를 일반화하여 추상화 시킨것이 클래스입니다.
클래스를 구체적인 실체로 표현한것이 객체입니다.
인스턴스화될 대상이 되는 클래스를 개체라고 합니다.


박근혜,홍준표,노회찬,손석희 와 같은 구체적인 객체의 일반화된 개념이 사람입니다.
사람이란 클래스를 인스턴스화해 개별적으로 만들어진 객체들이 박근혜,홍준표,노회찬,손석희입니다.

ㅁ자료형(DataType) 과 자료형의 종류 ?
-자료형이란 데이터를 저장하기 위한 타입(유형)을 말하며 언어별로 숫자형,문자형 자료형같이 기본자료형이 제공됩니다.

1.값형 DataType
값을 변수에 넣는 자료형을 말하며
기본자료형의 종류에는 정수형,실수형,문자형,날짜형,불린형,구조체등이 존재하며 이런 기본자료형을 값형 데이터 타입이라고합니다.
-값형은 독자적으로 데이터의 복사본을 가지고 있기 때문에 서로에게 영향을 주지 않는다.
- 값형 변수는 자신에게 활당된 메모리 영역에 값을 직접 저장한다.

2.참조형 DataType
변수에 대한 메모리의 위치(주소) 정보를 담는 자료형을 말하며
개발언어별로 기본적인 자료형을 제공하지만 현실 세계의 다양한 실체나개념을 기본자료형 만으로 정의해서 사용하기에는 한계가 있기에
클래스 개념을 이용해 타입을 정의해서 데이터 구조를 표현하고 인스턴스화 하여 메모리에 저장된 객체를 참조해 사용하는 자료형을 참조형 데이터 타입이라고 합니다..
클래스는  기본적으로 속성이란 개념을 이용해 객체의 자료형을 표현할수 있습니다.
대표적인 참조형은 클래스,배열,문자열등이 해당됩니다.
- 참조형 변수는 자신에게 활당된 메모리 영역에 저장된 데이터를 직접 저장하지 않고 참조된 (메모리 주소)정보만 저장관리합니다.
실제 데이터는 별도의 메모리 영역에 저장된다.
참조형 변수는 참조된 값을 변경하면 참조하고 있는 모든 변수의 값까지 바뀝니다.
클래스의 인스턴스인 객체는 모두 참조형입니다.


ㅁ메모리에 대한 이해
프로그램을 개발하려면 데이터를 일반적으로 메모리공간에 저장하고 저장된 데이터를 이용해 프로그래밍을 합니다.
메모리의 종류는 스택(Stack),힙(Heap),데이터(Data) 영역으로 크게 나뉩니다.

-Data 영역 : 전역변수나 Static 변수가 할당되는 영역으로 프로그램 시작과 함께 할당되고 종료시 메모리에서 소멸됩니다.

-Stack 영역 : 주로 값형 자료형을 저장하기 위한 공간으로 사용되며 함수호출시 사용되는 지역변수,매개변수등이 저장되는공간으로 함수호출이 완료되면 메모리에서 자동 소멸됩니다. 변수 선언시 메모리 할당안되고 사용시 메모리가 할당됩니다.

-Heap 영역: 보통 참조형 값이 저장되는 메모리 영역으로 필요시 동적으로 메모리를 할당해 사용하며 가변형 데이터 저장시 사용되며 선언과 동시에 메모리할당,별도 메모리관리 필요하며 일반적으로 C#에서는 명시적으로 메모리를 해제하지 않으면 Garbage Collector라는 사용하지 않는 메모리 수집기가 알아서 메모리를 해제해줍니다.


일반적으로 참조형 타입,대표적으로 클래스(객체)는 속성과 행위로 정의합니다.

1.2 속성(필드) 과 메소드
ㅁ속성=Attribute=Property=Field=Column
특정 객체의 특성을 프로그래밍 언어의 자료형으로 표현하는 방법입니다.
필드나 속성은 해당 객체에 속한 변수로 메소드내에 정의한 지역변수와 구분하기 위해 멤버변수 라고도 합니다.

ㅁ메소드 =Method =Behavior
-특정 객체의 행위,기능을 표현하는 단위입니다.
-접근자: public,private 등의 접근 제한자를 통해 표시
-반환타입: 메소드는 처리결과를 반환할수도 있는데 반환되는 타입을 나타냅니다. 반환값이 없으면 void라 표시합니다.
-메소드이름:언어에서 인식하는 메소드명
-매개변수목록: 메소드에 전달되는 데이터 목록
-메소드내용: 메소드내 코드블록

private int GetTotalPrice(int price,int count)
{        
    int totalPrice = price * count;
    return totalPrice;
}


2.캡슐화

정의: 추상화를 구현한 각종 클래스 파일 내부 코드는  다른 시스템이나 해당 클래스를 호출하여 사용하는 사용자에게는 클래스내의 내부에서만 사용되는 내부 멤버나 메소드를 굳이 노출할 필요없이 해당 코드들을 숨김처리하여 사용자로 하여금 필요한 기능과 속성에 대해서만 접근할수 있게 할 필요가 있습니다. 이를 캡슐화 라고 표현합니다.

목적: 클래스는 캡슐화를 통해 클래스내의 데이터의 일관성을 보장해 데이터의 충돌을 방지하고  클래스 구조및 메소드의 내부 구현구조를 숨겨 외부개발자가 입력과 출력 기반으로한 클래스와 메소드 사용에 간결함과 편리함을 제공합니다.

방법: 해당  클래스 또는 메소드의 내용을 숨기기 위해  접근 제한자인 private,public등을 통해 클래스 및 메소드의 접근 미 사용범위를 제약할수 있습니다.

 2.1 접근 제한자 유형

-private: 내부(클래스,어셈블리)에서만 접근가능함

-protected: 내부 와 상속구조에서 파생(자식)클래스에서만 접근가능함

-public : 내부 및 외부,파생 클래스 등 모든 영역에서 호출 사용이 가능함.

-internal: 동일한 어셈블리(컴포넌트 .dll)내의 클래스들간에서만 호출 사용이 가능함.

-internal proected : 동일한 어셈블리내 내부 클래스와 파생클래스에서만 접근가능함.


Tobe Contined~

*