[C#] 클래스의 응용
{ 인터페이스_상속 , 다형성, overried & new, object 클래스, 네임스페이스, 형추론, 동적 형 지정 변수, 확장메소드 }
인터페이스
클래스와 비슷한 구조 추상메소드, 추상속성, 추상인덱서, 이벤트 클래스에 집어넣는 형태로 사용 (설계)
//인터페이스 A
interface A{
public abstract void say(); //추상메소드
public abstract int prop { //추상속성
get;
set;
}
}
//인터페이스 구현
class X : A {
public void say(){
console.WriteLine("Helllo");
}
public void prop
{
namespace 인터페이스
{
interface A //모든 메소드는 public으로 취급하므로 액세스 수식자는 생략가능
{
void say(); //추상메소드 abstract
int prop //추상속성
{
get;
set;
}
}
class X : A //인터페이스는 여러개의 한곳에 넣어주는 개념이기 때문에 여러개를 할 수 있다. ex) A, B, C
{
public int b;
public void say() //인터페이스 함수 구현
{
Console.WriteLine("Hello");
}
public int prop //인터페이스 속성 구현
{
get
{
return b; //속성으로 b 가져오기
}
set
{
b = value; //속성으로 b에 값넣기
}
}
}
internal class Program
{
static void Main(string[] args)
{
X x = new X();
x.say();
x.prop = 52;
Console.WriteLine(x.prop);
}
}
}
인터페이스 상속
인터페이스는 다른 인터페이스를 상속
interface A{
void 애플();
void 애플키보드();
}
interface B : A{
void 애플마우스();
new void 애플키보드();
}
namespace 인터페이스상속
{
interface Greet
{
void greet();
}
interface Bye : Greet //bye는 greet을 상속
{
void bye();
}
class Greeting : Bye
{
public void greet()
{
Console.WriteLine("안녕하세요!");
}
public void bye()
{
Console.WriteLine("안녕하 가세요");
}
}
internal class Program
{
static void Main(string[] args)
{
Greeting greeting = new Greeting(); //객체생성
greeting.greet(); //호출
greeting.bye();
}
}
}
객체지향프로그래밍
추상화 : 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것,
현실세계의 있는 내용을 클래스로 만드는 것
상속 : Inheritance 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 문법
다형성 : 어떤객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질
캡슐화 : public private 함수화 서로연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것,
데이터 보호 / 데이터 은닉
다형성
namespace 다형성
{
class E
{
public int n;
}
class J : E
{
public void greet(E e)
{
Console.WriteLine(e.n);
}
}
internal class polymorphism
{
static void Main(string[] args)
{
J j = new J(); //j객체
E e = new E(); //e객체
e.n = 10; //e.n 변수에 10
j.greet(e); //j자식에 있는 함수 greet(e)넣어주기 부모타입으로 넣어줬다.
J j2 = new J();
j2.n = 5;
j.greet(j2); //j2가 E클래스 타입 부모타입으로 인자로 들어가진다. 다형성 업캐스팅
}
}
}
override
namespace 연습
{
class A
{
public virtual void m()
{
Console.WriteLine("A 클래스의 메소드");
}
}
class B : A
{
public override void m()
{
Console.WriteLine("B 클래스의 메소드");
}
}
internal class Program
{
static void Main(string[] args)
{
A a = new A(); //부모타입의 부모만큼 메모리할당 자식으로 못가서 부모m을 사용한다.
a.m();
B b = new B(); //B타입의 자식객체만들어서 오버라이드된 함수를 호출해야지
b.m();
A ab = new B(); //다형성을 사용한거다.
ab.m();
}
}
}
new
namespace 연습2
{
class A
{
public void m()
{
Console.WriteLine("A 클래스의 메소드");
}
}
class B : A
{
public new void m()
{
Console.WriteLine("B 클래스의 메소드");
}
}
internal class Program
{
static void Main(string[] args)
{
A a = new A(); //A타입의 A만큼 할당
a.m();
B b = new B(); //B타입의 B의 메모리 할당
b.m();
A ab = new B(); //A타입의 B의 메모리 할당
ab.m();
}
}
}
object 클래스
모든 클래스의 기본이 되는 클래스
박스화 박스화해제
namespace 오브젝트클래스
{
internal class Program
{
static void Main(string[] args)
{
float b = 3.14f;
object ob;
float c;
Console.WriteLine(b);
ob = b; //박스화
c = (float)b; //박스화 해제
Console.WriteLine(c);
}
}
}
네임스페이스
클래스나 구조체의 그룹입니다. *라이브러리
(1)
namespace A {
class Render{
}
}
namespace B{
class Render{
}
}
namespace 네임스페이스
{
class Tokyotower
{
public void print()
{
Console.WriteLine("도쿄타워");
}
}
namespace Toshima
{
class Sunshine
{
public void print()
{
Console.WriteLine("션샤인 60");
}
}
}
internal class Program
{
static void Main(string[] args)
{
네임스페이스.Tokyotower tower = new 네임스페이스.Tokyotower();
네임스페이스.Toshima.Sunshine sunshine = new 네임스페이스.Toshima.Sunshine();
tower.print();
sunshine.print();
}
}
}
(2)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using F = Finshing;
namespace Finshing
{
class Fish
{
int num;
string name;
public Fish(string m, int n)
{
name = m;
num = n; ;
}
public void print()
{
Console.WriteLine(name + "낚은 수 " + num + "마리");
}
}
}
internal class FishingSample
{
static void Main(string[] args)
{
F.Fish iwashi = new F.Fish("정어리", 12);
F.Fish fugu = new F.Fish("복어", 5);
iwashi.print();
fugu.print();
}
}
형추론
변수를 선언할 때 int나 string 등을 대신해 var를 사용하면 C#컴파일시에 자동으로 형을 추측한다.
-> 잘알고 써야지 안그럼 헷갈림 실수할 수 있는 부분.
var x1 = 10; //x1은 int로 알아서 추측
var str = "candy"; //문자열로 추측
var x3; //컴파일 에러
namespace 형추론
{
internal class Program
{
static void Main(string[] args)
{
var a = 1;
var b = 2.1f;
var str = "안녕하세요";
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(str);
}
}
}
동적 형 지정 변수
dynamic 키워드
컴파일하고 실행할때 콘솔이 실행
실행시에 동적으로 형이 결정된다.
var키워드와 비슷하지만 var키워드는 컴파일할때 형이 결정
dynamic x;
if(DateTime.Now.Second % 2 == 1)
{
x = 1;
}
else
{
x = "제로";
}
ExpandoObject 클래스
dynamic pet = new ExpandoObject();
pet.name = "test";
pet.age = 10;
Console.WriteLine("이름 : " + pet.name + "나이 : " + pet.age);
확장메소드
namespace 확장메소드
{
class Animal
{
public int age = 10;
}
static class animalEx
{
public static void print2(this Animal a, string addstr)
{
Console.WriteLine(a.age.ToString() + addstr);
}
}
internal class Program
{
static void Main(string[] args)
{
Animal myanimal = new Animal();
myanimal.print2("살입니다.");
}
}
}