|
Programming/.NET Programming 2009. 5. 31. 05:55
상속과 키워드 sealed 용어 정리 |
상속 : 어떤 클래스를 기본으로 새로운 클래스가 파생되는 것.
부모클래스(기본 클래스)로부터 상속을 받아 자식클래스(파생 클래스)가 생성된다.
상속 과정에서 클래스의 내용이 추가되기도 하고 함수의 내용이 바뀌기도 한다.
sealed : 더이상의 상속을 막는 keyword, 추상클래스/인터페이스 앞에는 못 씀
추상클래스를 상속받은 클래스에서 추상함수를 정의를 해줘야하고, 인터페이스 역시 다른 클래스에 상속을 하여 선언된 함수들을 정의 해줘야 하기 때문이다. |
상속과 키워드 sealed 예제 |
using System;
namespace Study
{
interface 인터페이스
{
void Test();
}
interface 인터페이스2
{
void Test();
}
abstract class 추상클래스
{
public abstract void Test();
}
class 일반클래스 : 인터페이스, 인터페이스2, 추상클래스
{
void 인터페이스.Test() // '인터페이스.' : 어디에서 상속받은 건지 명시
{
throw new NotImplementedException();
}
void 인터페이스2.Test() // '인터페이스2.' : 어디에서 상속받은 건지 명시
{
throw new NotImplementedException();
}
public override void 추상클래스.Test()
// '추상클래스.' : 어디에서 상속받은 건지 명시
{
throw new NotImplementedException();
}
}
sealed class 일반클래스2 : 일반클래스
{
}
class 일반클래스3 : 일반클래스2 // Error. 일반클래스2 앞에 sealed 때문에 안됨
{
public 일반클래스3()
{
}
}
} |
Programming/.NET Programming 2009. 5. 31. 05:11
인터페이스, 추상클래스, 클래스 용어 정리 |
인터페이스 : 가장 기본적으로 가질 수 있는 공통 기능을 포함하고 있는 것
이것을 일반 클래스에 여러개의 상속해서 사용
---> 팀프로젝트에서 주로 사용, 필요한 함수들을 미리 선언하고, 여러 부분으로 나눠서 각각 따로 구현하니까 자신이 구현하는 부분이 아닌 나머지 부분은 구현되있다고 (상속을 받는다거나) 가정하고 코딩
추상클래스 : 비슷하거나 같은 기능을 포함, 이름은 같고, 하는 일은 비슷하거나 같지만 구현 내용(방식)이 다를 때 사용
클래스 : 가장 일반적인 클래스를 말하며, 인터페이스나 추상클래스로부터 상속받은 뒤 추가적인 기능을 구현하여 각각의 새로운 객체로 만들 떄 사용
---> class안에 class를 선언할 수 있지만, methode안에는 class를 선언할 수 없다. |
인터페이스, 추상클래스, 클래스의 특징 |
인터페이스 : method의 원형만 선언할 수 있음
1. 변수 선언 불가능
2. 함수 정의 불가능
3. 함수 원형 선언 가능
추상클래스 : 추상 method를 가질 수 있는 클래스, 객체 가질 수 없음 (class 생성 불가)
1. 변수 선언 가능
2. 함수 정의 가능
3. 함수 원형만 선언 가능
클래스 : 가장 일반적인 Class
1. 변수 선언 가능
2. 함수 정의 가능
3. 함수 원형만 선언은 불가능, 정의도 해줘야 함
상속 관계
1. 인터페이스 → 인터페이스 (가능)
2. 인터페이스 → 추상클래스 (가능)
3. 인터페이스 → 일반클래스 (가능)
4. 추상클래스 → 일반클래스 (가능) : 추상함수 정의를 해야함
5. 추상클래스 → 추상클래스 (가능)
6. 일반클래스 → 추상클래스 (가능)
7. 일반클래스 → 일반클래스 (가능)
8. 추상클래스 → 인터페이스 (불가능)
9. 일반클래스 → 인터페이스 (불가능) |
인터페이스, 추상클래스, 클래스 예제 |
using System;
namespace Study
{
/// <summary>
/// 인터페이스
/// </summary>
interface 인터페이스
{
// int a; // 변수 선언 X
// void test(){}; // 함수 정의 X
void Test1(); // 함수 선언만 가능
}
/// <summary>
/// 추상클래스
/// </summary>
abstract class 추상클래스
{
int a; // 변수 선언 O
void Test1() // 함수 정의, 선언 O
{
a++;
}
public abstract void Test2(); // 추상함수(선언만 하는 함수)
}
/// <summary>
/// 일반클래스
/// </summary>
class 추상클래스 : 일반클래스 // 추상클래스로부터 상속받음
{
public static void Main(string[] args)
{
}
public override void Test2() // 추상함수를 override해 줌
{
throw new NotImplementedException();
}
}
} |
Programming/.NET Programming 2009. 5. 31. 04:34
키워드 static |
using System;
namespace Program
{
class A
{
int a;
static int b;
// static 변수
public void main()
{
this.a; // Error. 객체생성이 아직 안된 상태라서 사용할 수 없음
}
public static void main2()
{
this.b; // 에러. static 함수내에서는 this를 사용할 수 없음
b = 10; // 함수도 변수도 모두 static이니까 객체 생성 전에도 사용할 수 있음
}
}
class B
{
// static 함수
public static void Write()
{
Console.WriteLine("Test");
}
// 굳이 객체 생성하지 않아도 클래스 이름만으로 접근 가능 ---> B.Write();
// 자주 사용하는 함수는 편하게 사용하라고 static으로 선언
// 대표적인 예가 Math함수
}
}
// 정리
// static은 프로그램이 구동되기 직전 메모리 할당을 받고,
// 프로그램 종료시 까지 사라지지 않도록 변수 및 함수 앞에 붙이며
// 프로그램 구동 되기 전 메모리에 할당이 되기 때문에
// 소속된 객체 생성 여부에 상관없이 클래스의 이름만으로도 사용가능하다. |
키워드 new |
A a; // 클래스를 가리키기 위한 포인터 변수만 선언, 크기는 4byte
A a = new a(); // 클래스 크기의 공간이 잡힘, 포인터가 그 클래스를 가리킴
* C# 문법에는 pointer라는 개념이 없지만, 다른 문법을 구현 과정에 사용되고 있다. |
private 함수를 접근 가능하게 해주는 Property |
namespace Study
{
public class A
{
private int a;
public int results // 함수와 모양이 비슷하지만 파라미터를 가지지 않음
{
get { return a; } // 읽기
set { a = value; } // 쓰기
// 둘 중 하나를 지우면 읽기 전용이나 쓰기 전용 변수로 바꿀 수 있음
}
}
}
// property를 사용하는 이유
// 1. 읽기와 쓰기 둘 중 어느 하나만 가능하게 할 수 있다.
// 2. 실제 값을 변경하지 않고도 가져올 때 처리를 해서 가져올 수 있다. |
Programming/.NET Programming 2009. 5. 31. 04:13
C# Console 응용프로그램 프로젝트 생성시 기본 소스 |
// 키워드 Using
// 자주 사용하는 namespace가 포함하는 클래스를 사용할 수 있게 함(간략화)
// 자주 사용하는 namespace를 적지 않아도 그 안의 내용을 사용할 수 있음
// ex. System.Console.WriteLine(); --> Console.WriteLine();
// namespace는 다른데 함수 이름이 같을 경우는 문제가 됨
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Program // 범위 설정
{
// 필요한 코드나 타입을 정의함
// C#은 클래스 단위로 실행됨
class Program
{
static void Main(string[] args) // Main 함수
{
}
}
} |
변수 접근 권한 설정 키워드(클래스 및 변수 선언시 사용) |
private : 선언된 클래스 내부에서만 사용됨, 변수 기본설정
protected : 선언된 클래스와 상속된 클래스에서 사용됨
internal : 같은 어셈블리(프로젝트) 안에서만 사용됨, 외부공개(extern) 안됨
public : 어떤 곳에서도 사용됨, 함수/클래스 기본설정, 특히 생성자는 public으로! |
변수 Type의 종류와 각각의 크기 |
int a; // integer형, 4byte
float f; // float형, 4byte
double d; // double형, 8byte
char c; // character형, 유니코드 기본지원, 2byte
string s; // char형 배열
s = "EnSharp"; // string은 큰 따옴표 사용
c = '#'; // char는 작은 따옴표 사용 |
Programming/GUI Programming 2009. 5. 31. 00:19
Tool : Visual Studio 2008
Language : C++
Library : MFC |
2009년 5월 10일 ~ 2009년 5월 15일(6일) |
박상일 교수님의 Visual C++ Programming 수업 과제
스페이스 바나 불꽃 버튼을 누르면 노드가 생성되고 포물선을 그리면서 올라간다.
메뉴에서 여러가지 옵션을 줄 수 있다.
Divition(분할), Fragments(분할 입자 수), Color Change(투명도 변화), Tails(꼬리 생성)
교수님이 하신 것보다 조금 많이 부자연스럽지만
그래도 처음에 과제를 접하고 ㅈㅈ칠 뻔한 것을 완성했다는 점에 의의를 둔다. |
Programming/GUI Programming 2009. 5. 31. 00:09
Tool : Visual Studio 2008
Language : C++
Library : MFC |
2009년 4월 6일 ~ 2009년 4월 10일(5일) |
박상일 교수님의 Visual C++ Programming 수업 과제
마우스 왼쪽 버튼으로 드래깅 : 김태희 사진으로 채워진 사각형이 그려짐
마우스 오른쪽 버튼으로 드래깅 : 색깔이 채워진 원이 그려짐
마우스 가운데 버튼을 클릭 : 다각형의 꼭지점을 찍을 수 있음
가운데 버튼 클릭으로 꼭지점을 그린 후 마우스 왼쪽/오른쪽 버튼 누르면
찍었던 점이 이어지면서 다각형이 그려지는 프로그램 |
Programming/SRM Practice 2009. 5. 30. 23:09
SRM 191 DIV 2 (250)
문제 요약 : 내기에서 이긴 사람이 받을 수 있는 돈을 Cents 단위로 반환하라.
#include <iostream>
#include <vector>
using namespace std;
class BettingMoney
{
public:
int moneyMade(vector <int> amounts, vector <int> centsPerDollar, int finalResult);
};
int BettingMoney::moneyMade(vector <int> amounts, vector <int> centsPerDollar, int finalResult)
{
int sum = 0;
for(int i = 0 ; i < amounts.size() ; i++)
if(i != finalResult) sum += amounts[i];
return (sum*100) - (centsPerDollar[finalResult]*amounts[finalResult]); }
using system;
public class BettingMoney
{
public int moneyMade(int[] amounts, int[] centsPerDollar, int finalResult)
{
int sum = 0;
for (int i = 0; i < amounts.Length; i++)
if (i != finalResult) sum += amounts[i];
return (sum * 100) - (amounts[finalResult] * centsPerDollar[finalResult]);
}
}
Programming/SRM Practice 2009. 5. 27. 17:19
SRM 148 DIV 2 (250)
문제 요약 : 주어진 숫자를 그 숫자의 각 자리수로 나눌 수 있다면,
그 횟수를 반환하라.
#include <iostream>
using namespace std;
class DivisorDigits
{
public:
int howMany(int number);
};
int DivisorDigits::howMany(int number)
{
int temp = number;
int cnt = 0;
int n;
while(temp >= 1)
{
n = temp % 10;
temp /= 10;
if(n != 0 && number % n == 0) cnt++;
}
return cnt; }
Programming/SRM Practice 2009. 5. 27. 15:51
SRM 146 DIV 2 (250)
문제 요약 : 주사위를 5번 던진 값이 주어지면,
그 중에서 같은 값의 경우는 그 값을 전부 더한다. 이 때 나올 수 있는 최대값을 구하라.
#include <iostream>
#include <vector>
using namespace std;
class YahtzeeScore
{
public:
int maxPoints(vector <int> toss);
};
int YahtzeeScore::maxPoints(vector <int> toss)
{
int sum = 0, max = 0;
for(int i = 1 ; i < 7 ; i++)
{
for(int j = 0 ; j < toss.size() ; j++)
{
if(i == toss[j]) sum += toss[j];
}
if(sum > max) max = sum;
sum = 0;
}
return max;
}
Programming/SRM Practice 2009. 5. 27. 00:48
SRM 147 DIV 2 (250)
문제 요약 : 주어진 문장을 주어진 수만큼 shift한 후
결과 값을 반환하라.
#include <iostream>
using namespace std;
class CCipher
{
public:
string decode(string cipherText, int shift);
};
string CCipher::decode(string cipherText, int shift)
{
string res = "";
for(int i = 0 ; cipherText[i] ; i++)
if(cipherText[i] - shift < 'A') res += cipherText[i] + 26 - shift;
else res += cipherText[i] - shift;
return res;
}
|