05
28

1) 클래스(class)

기본 자료형에 속하는 타입만으로는 현실 세계를 모델링하기에는 역부족이다. 따라서 객체지향 프로그래밍 언어는 기본 타입 외에 개발자가 원하는 모든 객체의 타입을 새롭게 정의해서 사용할 수 있게 한다.

class 클래스_명
{
	//속성(attribute) 정의;(필드/클래스변수)
	//행위(behavior) 정의;(메서드)
}

 

1.1) 필드(field)

  • 필드 : 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳
  • 필드에 값을 대입 : 객체.필드명 = 필드의 타입과 일치하는 표현식;
  • 필드로부터 값을 가져옴 : 필드의 타입과 일치하는 변수 = 객체.필드명;

 

1.2) 중복 코드 제거

함수는 코드를 재사용하기 쉽게 만들어주는 역할을 한다. 함수, 즉 메서드를 사용하면 중복된 코드를 줄일 수 있어 일일이 코드를 찾아 변경할 필요가 없어진다. 따라서 향후 유지보수가 쉬워진다.


1.3) 코드 추상화

메서드를 사용할 때 입력 인자와 출력 인자의 용도를 알고 제대로 동작한다면 내부에 어떤 식으로 코드가 작성되어 있느냐에 상관없이 이용하는데 불편함이 없다. 따라서 개발자는 외부 개발자에게 굳이 내부 구조가 어떻게 구현되었는지 알려줄 필요가 없다. 따라서 메서드는 특정 목적을 수행하는 일련의 코드를 모아서 입력 인자와 출력 인자를 정의해 추상화할 수 있다.

 

ex)

class Car
{
	//##########상태 정보###########
	//속도
	public int i_speed; // 클래스 변수

	//##########행위 정보###########
	//가속한다
	public void Acc() // 클래스 메서드
	{
		i_speed = i_speed + 10;
	}
	//감속한다
	public void DeAcc() // 클래스 메서드
	{
		i_speed = i_speed - 10;
	}

	public void PrintState()
	{
		Console.WriteLine("현재 속도는 {0}Km입니다.", i_speed);
	}
}

static void Main(string[] args)
{
	/*
	int i_num = 100; // 메서드 변수

	Console.WriteLine(i_num);
	*/

	Car mycar = new Car();
	mycar.i_speed = 0;
	mycar.PrintState();

	mycar.Acc();
	mycar.PrintState();

	mycar.DeAcc();
	mycar.PrintState();

}

 

예제 실행 화면

 

class Mathematics
{
	public int GetAreaOfSquare(int x)
	{
		return x * x;
	}

	public int GetValue()
	{
		return 10;
	}

	public void Output(string prefix, int value)
	{
		Console.WriteLine(prefix + value);
    }
}

class Program
{
	static void Main(string[] args)
	{
		Mathematics m = new Mathematics();
		int result = m.GetAreaOfSquare(m.GetValue());

		m.Output("결과: ", result);
	}
}

 

예제 실행 화면

 

class Book
{
	public string Title;
	public decimal ISBN13;
	public string Contents;
	public string Author;
	public int PageCount;

	public void Open()
	{
		Console.WriteLine("Book is opened");
	}

	public void Close()
    {
		Console.WriteLine("Book is closed");
	}

	public void WriteIf(bool output, string txt)
	{
		if (output == false)
		{
			return;
		}
	 	Console.WriteLine(txt);
	}


    }

class Program
{
	static void Main(string[] args)
	{
		Book b = new Book();

		b.Open();
		b.Close();
		b.WriteIf(false, "123");
		b.WriteIf(true, "123");
	}
}

 

예제 실행 화면

 

class Mathematics
{
	public void PrintIfEven(int value)
	{
		if (value %2 ==0)
		{
			Console.WriteLine(value);
		}
	}
}

class Program
{
	static void Main(string[] args)
	{
		Mathematics m = new Mathematics();

		int x = 5;
		m.PrintIfEven(x);
		x = 10;
		m.PrintIfEven(x);
	}
}

 

예제 실행 화면

 

1.4) 생성자(constructor)

생성자 메서드는 객체가 생성되는 시점에 해당 메서드가 자동으로 호출된다.

class 클래스명
{
	접근_제한자 클래스명(타입 매개변수명 ...)
    {
    
    }
}
  • 이름이 클래스명과 동일하며 반환 타입을 명시하지 않는다.
  • 객체를 생성하는 시점에 실행돼야 할 코드를 담을 수 있다.
  • 생성자를 명시적으로 정의하지 않았다면 C# 컴파일러는 일부러 다음과 같은 빈 생성자를 클래스에 집어넣고 컴파일한다.
  • 기본 생성자(default constructor) : 매개변수가 하나도 없는 생성자
  • 개발자가 명시적으로 생성자를 정의한 경우 컴파일러는 기본 생성자를 추가하지 않는다.

ex)

class Car
{
	//##########상태 정보###########
	//속도
	public int i_speed; // 클래스 변수

	//##########행위 정보###########
           
	// 일반 메서드일 경우
	// 반환타입 메서드이름(매개변수)
	// {
	// }

	// 생성자 메서드의 경우
	// 클래스이름(매개변수)
	// {
	// }

	public Car() // 디폴트 생성자
	{
		i_speed = 0;
		Console.WriteLine("Car() 클래스 생성됨");
	}

	public Car(int i_num)
	{
		i_speed = i_num;
		Console.WriteLine("Car(int) 클래스 생성됨");
	}

           
           
	//가속한다
	public void Acc() // 클래스 메서드
	{
		i_speed = i_speed + 10;
	}
	//감속한다
	public void DeAcc() // 클래스 메서드
	{
		i_speed = i_speed - 10;
	}

            
	public void PrintStatus()
	{
		Console.WriteLine("현재 속도는 {0}Km입니다.", i_speed);
	}
}
        
static void Main(string[] args)
{
	Console.WriteLine("1===========================");
	Car MyCar = new Car();
	MyCar.PrintStatus();
	Console.WriteLine("2===========================");
	Car MyCar1 = new Car(100);
	MyCar1.PrintStatus();
	Console.WriteLine("3===========================");
    new Car();
}

 

예제 실행 화면

 

cf. 내부 클래스(inner class)

클래스 안에 선언된 클래스. 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.

class a 	// 외부 클래스
{
	class b // 내부 클래스
    {
    
    }
}

내부 클래스는 외부 클래스의 멤버들을 쉽게 접근할 수 있으며 코드의 복잡성을 줄일 수 있다.

 

cf. new 키워드

  • new 연산자 : 개체를 만들고 생성자를 호출하는 데 사용

  • new 한정자 : 기본 클래스 멤버에서 상속된 멤버를 숨기는 데 사용(상속받은 부모 클래스의 멤버를 숨기고 자식 클래스에서 선언하고 구현한 멤버를 사용)

  • new 제약조건 : 제네릭 선언의 형식 매개 변수에 인수로 사용할 수 있는 형식을 제한하는 데 사용

 

cf. 오버로딩(overloading)

클래스 내에서 같은 이름의 메서드를 여러 개 선언하는 것

메서드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서중 하나가 달라야 한다.

 

메서드 오버로딩

 

 

cf. 지역 변수와 전역 변수

종류 저장 장소 선언하는 위치 허용 범위 파괴 되는 시기 초기값
지역 변수 스택 메모리(Stack) 함수 내부 함수 내부 함수가 끝나는 시기 수동으로 설정
전역 변수 힙 메모리(Heap) 함수 외부 클래스 내 전체 프로그램 종료 0으로 기본 설정

 

cf. 통합 개발 환경(IDE)

통합 개발 환경(IDE)은 Integrated Development Environment의 줄임말로 개발을 하면서 사용되는 도구들의 집합이다.

 

cf. 명령형 컴파일러

명령행에서도 닷넷 개발을 할 수 있다.

csc.exe : Visual Studio에서 사용하는 컴파일러 /  csc(C#compiler)

 

ex)

① 메모장에 소스 입력

메모장에 소스 입력

 

② 소스이름.txt를 소스이름.cs로 확장자명 변경

txt → cs

 

③ Developer Command Prompt for VS 2019 실행 후 소스 저장 위치로 디렉토리 이동

 

④ 디렉토리 이동후 csc 소스이름.cs 실행 

 

⑤ 소스이름.exe 실행파일 생성

생성된 실행파일

 

cf. 유효 범위

프로그래밍에서 특정 이름(변수명 등)이 영향을 미치는 영역. { } 중괄호로 영역을 표시

 

ex) 

{
	int i_num = 100;

	Console.WriteLine("iNum : " + i_num);
}

Console.WriteLine("iNum : " + i_num); // 범위에서 벗어나 에러가 난다.

 

cf. WinMerge

파일비교 프로그램으로 소스 파일 비교를 위해 사용한다.

 

 

COMMENT