본문 바로가기
프로그래밍/C#

[C#] 클래스의 응용

by SUGI_ 2023. 7. 5.

{ 인터페이스_상속 , 다형성, 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("살입니다.");
        }
    }
}
728x90

'프로그래밍 > C#' 카테고리의 다른 글

[유니티] Rigidbody 중력 제어  (0) 2023.07.27
[C#] 문자열의 응용  (0) 2023.07.07
[C#] 파일과 스트림  (0) 2023.07.06
[C#] 클래스의 응용  (0) 2023.07.06