return
: 점프문의 한 종류
: 프로그램의 흐름을 갑자기 호출자에게로 돌려놓는다.
: 언제든지 메소드 중간에 호출되어 메소드를 종결시키고 프로그램의 흐름을 호출자에게 돌려 준다.
※재귀 호출
: 메소드가 자기 자신을 스스로 호출하는 것을 일컬어 재귀 호출(Recursive Call)이라 한다.
메소드 오버로딩 [ Method Overloading ]
: 오버로딩이란 '과적'하다라는 뜻을 가지고 있다.
: 메소드 오버로딩은 하나의 메소드 이름에 여러 개의 구현을 올리는 것을 뜻한다.
가변길이 매개 변수
프로그래밍을 하다 보면 똑같은 그저 매개 변수의 "수"가 다르다는 이유만으로 똑같은 메소드를 여러 가지 버전으로 오버로딩하고 싶을 때가 있다. 이런 경우를 대비해 C#은 "가변길이 매개변수"라는 기능을 제공
가변 길이 매개 변수란, 그 개수가 유연하게 변할 수 있는 매개 변수를 말한다.
이것을 이용하면 메소드를 오버로딩하지 않고 결과값을 구현할 수 있다.
매개 변수의 개수가 유한하게 정해져 있다면 가변길이 매개 변수보다 메소드 오버로딩을 사용하는 것이 적절하다.
가변길이 매개 변수는 형식은 같으나 매개 변수의 개수만 유연하게 달라질 수 있는 경우에 적합
선택적 매개 변수
메소드의 매개 변수는 기본값을 가질 수 있다. 기본 값을 가지는 매개 변수는 필요에 따라 데이터를 할당하거나 할당하지 않을 수 있기 때문에 이를 "선택적 매개변수"라고 한다.
- 항상 필수 매개 변수 뒤에 와야 합니다.
- 필수 매개 변수가 없는 경우에는 신경 쓰지 않아도 된다.
- 메소드의 사용자에게 사용하지 않는 매개 변수를 염두에 두지 않도록 편의를 제공
로컬 함수 [ Local Function ]
: 메소드 안에서 선언, 선언된 메소드 안에서만 사용되는 특별한 함수
: 클래스의 멤버가 아니기 떄문에 메소드가 아니라 함수라고 한다.
: 선언 방법은 메소드와 다르지 않지만, 로컬 함수는 자신이 존재하는 지역에 선언되어 있는 변수를 사용
: 로컬 함수는 메소드 밖에서는 다시 쓸 일 업는 반복적인 작업을 하나의 이름 아래 묶어 놓는데 적격이다.
객체 지향 프로그래밍과 클래스
객체 지향 프로그래밍 [Object Oriented Programming, OOP]
코드 내의 모든 것을 객체로 표현하고자 하는 프로그래밍 패러다임을 뜻한다.
여기서 객체는 세상의 모든 것을 지칭하는 단어이다. 사람도 물건도 자동차도 모두 객체입니다.
객체는 '속성'과 '기능' 두 가지를 가지고 있다.
속성으로는 피부색, 키, 몸무게 등을 뽑을 수 있고 기능으로는 걷기, 뛰기, 보기 등을 뽑을 수 있다.
위에 설명을 바탕으로 C#도 속성과 기능으로 구성되어 있습니다.
속성은 데이터, 즉 변수로 기능은 메소드로 표현하면 된다.
정리하자면 객체는 데이터와 메소드로 이루어져있습니다.
클래스 [ Class ]
객체를 만들기 위한 청사진
객체에서 뽑아낸 속성과 기능은 클래스 안에 변수와 메소드로 표현된다.
이런 식으로 프로그래밍하는 것이 객체 지향 프로그래밍이다.
생성자 [ Constructor ]
생성자는 클래스의 이름과 동일한 이름을 가지며, 객체를 생성하는 역할을 한다.
생상자 앞에 있는 new 키워드는 생성자를 호출해서 객체를 생성하는 데 사용하는 연산자이다.
모든 클래스는 복합 데이터 형식이다. 그리고 복합 데이터 형식은 참조 형식이다.
1. 생성자 ( Constructor )
: 생성자는 클래스와 이름이 같고, 반환 형식이 없다.
: 생성자의 임무는 해당 형식(클래스)의 객체를 생성하는 것뿐이다.
: 클래스를 선언할 때 명시적으로 생성자를 구현하지 않아도 컴파일러에서 생성자를 만들어준다.
→ 이런 생성자를 '기본 생성자' 라고 한다.
: 객체를 다루다 보면 객체를 생성하는 시점에 객체의 상태를, 다시 말해 객체의 필드를 원하는 값으로 초기화한다.
: 이 작업을 할 수 있는 최적의 장소가 바로 객체를 생성하기 위해 호출하는 메소드인 생성자이다.
2. 정적 필드와 메소드
: static은 사전적으로는 "정적"이라는 뜻을 가지고 있다. 움직이지 않는 다는 뜻입니다.
: C#에서 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자이다.
: 한 프로그램 안에서 인스턴스는 여러 개 존재 가능, 클래스는 단 하나 존재한다.
: 똑같은 클래스가 두 개이상 존재 할 수 없다.
: 어떤 필드가 클래스에 소속된다는 것은 곧 그 필드가 프로그램 전체에서 유일하게 존재하는 것
: static , 정적 필드는 만드는 이유는 프로그램 전체에 걸쳐 공유해야하는 변수가 있다면 정적 필드를 사용
: 정적 메소드 역시 정적 필드처럼 인스턴스가 아닌 클래스 자체에 소속된다.
: 정적 메소드가 클래스의 인스턴스를 생성하지 않아도 호출 가능한 메소드라는 점이다.
- static의 반대 메소드 : 인스턴스 메소드
: 이름처럼 클래스의 인스턴스를 생성해야만 호출할 수 있는 메소드이다.
: 보통 객체 내부의 데이터를 이용해야하는 경우에 인스턴스 메소드를 선언
: 내부 데이터를 이용할 일이 없는 경우에는 별도의 인스턴스 생성없이 호출 할 수 있도록 메소드를 정적으로 선언
객체 복사하기 : 앝은 복사와 깊은 복사
- 얕은 복사(Shallow Copy)
데이터 형식에서 참조 형식과 값 형식이 저장되는 방식의 차이가 존재합니다.
참조 형식은 힙 영역에 객체를 할당하고 스택에 있는 참조가 힙영역에 할당된 메모리를 가리킨다.
객체를 복사할 때 참조만 살짝 복사하는 것을 얕은 복사 ( Shallow Copy )라고 합니다.
- 깊은 복사 ( Deep Copy )
: target이 힙에 보관되어 있는 내용을 source로 부터 복사해서 받아 별도의 힙 공간에 객체를 보관하기를 바라는 것
THIS 키워드
1. 나
: 우리는 자신을 지창할 때 "나"라고 합니다. this는 객체가 자신을 지칭할 때 사용하는 키워드이다.
: 객체 외부에서는 객체의 필드나 메소드에 접근 할 때 객체의 이름을 사용한다면, 객체 내부에서는 자신의 필드나
메소드에 접근할 때 this 키워드를 사용한다는 것이다.
예를 들면
class Employee
{
private string Name;
public void SetName(string Name) {
this.Name = Name;
}
}
위 예문에서 Employee 클래스는 Name 필드를 갖고 있고, SetName()메소드는 매개 변수로 입력받은 이름을
Name 필드에 저장하는 기능을 합니다. 이때 SetName() 메소드의 매개 변수는 Name이고, Employee 클래스의 필드도 Name이다. 이를 해결하기 위해 this를 사용하여 모호성을 해결할 수 있다. this.Name은Employee 자신의 필드고, 그냥 Name은 SetName() 메소드의 매개 변수이다.
2. this() 생성자
생성자를 호출하면 지금 생성하려는 객체외에 또 다른 객체를 만든다.
this가 객체 자신을 지칭하는 키워드인 것처럼 this()는 자기 자신의 생성자를 가리킨다.
this()는 생성자에서만 사용할 수 있다.
생성자의 코드 블록의 안쪽이 아닌 앞쪽에서만 사용이 가능하다.
상속
객체 지향 프로그래밍에서는 물려받는 클래스(파생 클래스, Derived Class 또는 자식클래스)가 유산을 물려줄
클래스(기반 클래스, Base Class 또는 부모 클래스)를 지정한다.
파생 클래스의 이름 뒤에 콜론( : )을 붙여주고 그 뒤에 상속받을 기반 클래스의 이름을 붙여주면 된다.
파생 클래스는 자신만의 고유한 멤버외에도 기반 클래스로 부터 물려받은 멤버를 가지고 있다.
이것은 파생 클래스가 기반 클래스 위에 새로운 멤버를 "얹어"만든 것이기 때문이다.
이 사실은 파생 클래스의 생성 과정을 통해서도 확인할 수 있다.
파생 클래스는 객체를 생성할 때 내부적으로 기반 클래스의 생성자를 호출한 후에 자신의 생성자를 호출하고, 객체가 소멸될 때는 반대의 순서로 종료자를 호출한다.
기반클래스의 생성자가 매개변수를 입력받도록 선언되어 있다면 파생 클래스의 인스턴스를 생성할 때 호출되는 기반 클래스의 생성자에게는 매개 변수를 base 키워드를 사용하여 전달한다.
this 키워드가 "자기 자신"을 가리킨다면 base는 "기반 클래스"를 가리킨다. this를 통해 자기 자신의 멤버에 접근할 수 있었던 것처럼, base 키워드를 통해 기반 클래스의 멤버에 접근할 수 있다.
파생 클래스의 생성자에서 기반 클래스의 생성자에게 매개 변수를 넘겨주는 방법은 this와 같다.
this()가 자기 자신의 생성자인 것처럼, base()는 기반 클래스의 생성자이다.
base()에 매개변수를 넘겨 호출하면 우리가 원했던 것처럼 base()생성자를 통해 Name필드를 초기화 할 수 있다.
오버라이딩 ( Overriding )
객체 지향 프로그래밍에서 다형성(Polymorphism)은 객체가 여러 형태를 가질 수 있음을 의미한다.
다형성은 원래 하위 형식 다형성(Subtype Polymorphism)의 준말이다. 다시 말해 자신으로부터 상속받아 만들어진
파생 클래스를 통해 다형성을 실현한다는 것이다.
예를 들어 토니 스타크가 Initialize()라는 메소드를 갖고 있는 ArmorSuite클래스를 만들었다.
토니는 이 ArmorSuite를 업그레이드하기로 했다. 이 때, 장갑 수트는 수중 전투용, 비행용 등의 베리에이션이 나올 수 있으므로 ArmorSuite 자체를 뜯어 고치기 보다 다음과 같이 ArmorSuite를 상속하는 파생 클래스를 만들기로 했습니다.
ArmorSuite의 기본 기능은 사람을 보호하는 장갑을 장착하는 것이다. 하지만 IronMan과 WarMachine은 새로운 기능이 필요하다. IronMan은 리펄서 레이와 같은 빔 무기를 사용하고, WarMachine은 이문 캐논, 소형 로켓 런처와 같은 폭발형 무기를 사용한다. ArmorSuite로부터 물려받은 Initialize() 메소드로는 IronMan과 Warmachine이 자신들의 무기를 장착할 수 없다. 따라서 IronMan이나 WarMachine이 자신들의 무기를 장착하기 위해서 Initialize()를 재정의해아한다.
다시말해 오버라이딩을 해줘야한다.
메소드를 오버라이딩 해주기 위해서는 한 가지 조건이 필요하다. 그 조건은 바로 오버라이딩을 할 메소드가 Virtual 키워드로 한정되어 있어야 한다는 것입니다. 이미 ArmorSuite 클래스의 Initialize() 메소드를 virtual로 선언한다.
오버라이딩을 하는 측에서는 기반 클래스에 선언되어 있던 Initialize() 메소드를 재정의하고 있음을 컴파일러에게 알려야한다.
'Programming > C#' 카테고리의 다른 글
c# _7 : 프로퍼티 (0) | 2020.06.10 |
---|---|
C# _6 (0) | 2020.06.09 |
c# 연습3 (0) | 2020.06.05 |
c# 연습 2 (0) | 2020.06.04 |
C#_4 (0) | 2020.06.04 |