프로그래밍 언어 31

상속(2) - 결합도(Coupling)와 응집도(Cohesion)

결합도(Coupling)클래스 간에 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도이다낮은 결합도와 높은 결합도로 나뉘어지며결합도는 낮을 수록 좋은 형태를 띄며인터페이스로 전달되는 파라메터를 통해서만 상호작용이 일어나는 경우를결합도가 제일 낮고 제일 좋은 형태 라고 볼 수 있다. 응집도(Cohesion)클래스나 모듈 내부의 관련성이나 일관성의 정도를 나타낸다응집도가 높으면 클래스의 기능이 잘 모여 있고, 응집도가 낮으면 기능이 분산되어 있다.높은 응집도는 클래스나 모듈이 자신의 기능을 명확하게 하고 있다는 것을 의미한다.//IElement.csinterface IElement{ void Use();}//ElementFire.csclass ElementFire : IElement{..

함수포인터와 델리게이트

c와 c++에는 함수포인터 라는 기능이 있다#include//함수포인터는 반환형과 매개변수로 정의됨void PrintHello(){ printf("Hello\n");}void PrintWorld(){ printf("World!\n");}int Sum(int _lhs, int _rhs){ return _lhs + _rhs;}int Sub(int _lhs, int _rhs){ return _lhs - _rhs;}void main(){ //함수포인터(Function Pointer) void (*pFunc)() = PrintHello; //반환형이 void고 매개변수가 없는 함수는 아무거나 들어 올 수 있다. pFunc(); pFunc = PrintWorld; pFunc(); int (*pCalc)(int, i..

Overloading 과 Overriding 그리고 다형성(Polymorphism)

오버로딩과 오버라이딩은 그 개념은 완전 다르지만영어를 잘 모르는(......) 한국인들은 헛갈릴 수가 있기에면접에서 자주 물어보는 질문중 하나 라고 한다. 여기 3개의 클래스가 있다.//Base.csclass Base{ public void Foo() { Console.WriteLine("Base Foo Call!"); }} //Derived.csclass Derived : Base //Base클래스를 상속 받음{ public void Foo() { //부모의 기능을 가지면서도 기능을 확장하려면 base를 활용하자, base는 부모 매소드를 지정한다. //base.Foo(); Console.WriteLine("Derived Foo Call!")..

상속(Inheritance)

상속(Inheritance)이란객체 지향 프로그래밍에서 가장 중요한 개념이다.클래스는 기능들을 묶어놓은 모듈이라고 했다.그리고 이 클래스를 이용해 생산성을 높이는 것이 객체 지향 프로그래밍 인데클래스에 기능을 추가 해야하는데 이 추가된 기능이 한정된 상황에서 필요 할 경우클래스에 기능을 추가하는 것은 생산성을 떨어뜨리는 일이 된다. 그런 상황에 대처하기 위해 나오게 된 것이 바로 상속 이다상속은 하나의 클래스(자식)가 하나의 클래스(부모)의 기능을 모두 이어 받은 뒤별도로 그 자식이 해야 할 일을 추가해주는 것 이라고 생각하면 된다.자식 A와 자식 B는 별도의 존재이지만자식 A가 할 수 있는 일이 있고 자식 B가 할 수 있는 일이 있다.부모가 자식A와 B가 하는 일을 모두 다 할 수 있어서 이를 상속 받..

생성자(Consturctor)와 소멸자(Destructor)

C#에서는 메모리를 우리가 직접 관리 할 수 없다( Garbage Collection ) 그렇기에 효율적인 프로그램을 위해서 개발자에게는 객체라는 것에 대한 올바른 이해와 사용이 필수적인데객체의 생성주기(LifeCycle)에는 생성자와 소멸자라는 필수적인 두 기능이 있다.이를 이해하고 있으면 메모리 관리를 효과적으로 할 수 있을 것 이다. 생성자 및 소멸자는반환형이 없고 이름은 클래스명과 같다. 이런 형태로 임의로 호출을 안하는 것이 기본(default)이다.(자동 호출됨)하지만 공부를 위해 지금은 호출한다.//Character.csclass Character{ //생성자(Constructor) public Character() { Console.WriteLine("Chara..

객체 지향 프로그래밍(Object Oriented Programming)

OOP(Object Oriented Programming) 라고 불린다 프로그래밍엔절차 지향과 객체 지향 두가지로 나뉘어 지는데 절차 지향 프로그래밍은 컴퓨터의 관점에서 생각하고 데이터를 처리하도록 짜여져 실행 속도가 빠르다는 점이 있으며대표적으로 C가 해당되고 객체 지향 프로그래밍은 정보와 기능을 하나로 묶어서 생각하게 된다기능별로 묶어 모듈화를 시킴으로서 같은 기능을 중복으로 연산하지 않으며모듈을 재활용하기에 데이터처리량을 줄였고 C#, Java등이 이에 해당된다. 객체 지향에는 몇가지 특징이 있는데캡슐화 (Encapsulation) 가 그중 핵심이다객체를 캡슐로 만들어서 그 내부를 보호하고 볼 수 없게 한다(은닉)실제로 캡슐에 든 약을 보면 우리가 그 약의 안이 어떻게 되어있는지 어떠한 성분을 가졌..

Garbage Collection(가비지 컬렉션)

C#의 데이터 타입에는 크게 두가지가 있다 Value Type : int float 같은 타입 Reference(참조) Type : 모든 클래스는 참조 타입 -> class는 복사를 하면 얕은 복사가 된다. 참조는 0바이트 : 해당 주소를 부르는 이름이 변수인데 포인터는 이 주소를 저장하는 곳이라 8바이트의 크기를 가지지만, 참조는 해당 주소를 부르는 이름(변수)가 하나가 더 추가 되는 개념이다. 이를 기억해두고 있어야 한다. C#은C나 C++과 다르게 동적할당 된 데이터를 개발자가 임의로 메모리 해제를 하는 것이 불가능하다.대신 이를 해결해주기위해 나온 것이 바로 가비지 컬렉션(Garbage Collection)이다. 가비지 컬렉션은 자동으로 메모리를 관리해주는 편리한 기능을 가지고 있다.따라서 개발자..

Namespace

//Namespace.csnamespace LJH{ class Lee { public int jihee = 0; }}namespace abc{ class Lee //다른 namespace에 있는 클래스라면 이름이 같더라도 사용 가능 { }}//Program.csclass Program{ static void Main() { LJH.Lee lee; abc.Lee lee1; }}Namespace가 다르면 class의 이름은 같아도 된다.게임으로 생각하면캐릭터와 몬스터의 스텟은 차이를 두는 경우가 많기에 이런식으로의 분류도 가능은 하다.상황에 맞게 사용하자

String(문자열)과 활용

char[] charArr = { 'A', 'B', 'C', '\0'}; //문자열 배열Console.WriteLine(charArr); //Console.WriteLine은 여러 변수들을 받아 알맞게 출력하는 함수들을 오버로딩 해놓았다string strTest = new string("strTest!"); // string : 마우스 커서 올려보면 calss 확인 가능string strChar = new string(charArr);string strConst = "strConst";char와 string의 데이터 타입이 다른 것을 확인 할 수 있다. static void Main(){ // 문자열(String) char[] charArr = { 'A', 'B', 'C', '\0'}; ..

구조체(Structure) / 함수 오버로딩(Function Overloading)

C#에서 구조체란 사용자 정의 데이터 유형(Data Type)으로 int, double 등과 같은 기본적으로 제공되는 (변수)값 유형이 아닌새로운 유형, 여러가지 유형을 사용하기위해 사용자가 직접 만들어서 사용하는 값 유형(Value Type)이다.라는 C에서 배운 구조체와 크게 다르지는 않다. 다만 몇가지가 다르고 추가로 알아둬야 할 것들이 있다. C#에서 구조체는 일반적인 변수와 같이 값을 가지는 데이터 형식이며클래스는 데이터 형식이 아닌 참조 형식 이라는 것이다이에 대한것은 기억만 해두고 차후 설명을 더 하도록 하겠다. //Point.csstruct Point{ //public int x = 100; //구조체는 선언과 동시에 초기화 하는 것이 불가능 하다. public int x..