5장, 클래스의 상속 (5-2) 오버라이드 / 구조체
* 오버라이드 (override)
: 상속한 메소드와 같은 이름, 같은 인수의 메소드를 작성해서 메소드를 덮어쓰는 것. 반환값 형도 같아야 한다.
이름의 은폐가 같은 이름을 가진 멤버를 숨긴다면(사라지는 것은 아님)
오버라이드는 같은 이름을 가진 메소드를 숨기는 거네?
(순서도 다름. 은폐(new)는 수식자 앞에(문장 맨 앞에) 있는데, 오버라이드는 수식자 뒤, 형 앞에 있음.
class Greeting { public virtual void bye() //virtual : 오버라이드되는 메소드엔 얠 붙여야 한다. { Console.WriteLine("good bye"); } } ... .. Greeting greeting = new Greeting(); greeting.bye(); .. |
여기까지의 결과를 부른다면 "good bye"로 나온다.
class Aisatsu : Greeting { public override void bye() //override : 오버라이드한 새 메소드에는 얠 붙인다. { Console.WriteLine("안녕히 가세요."); } } ... .. Aisatsu aisatsu = new Aisatsu(); aisatsu.bye(); .. |
override한 이후의 결과는 "안녕히 가세요." 로 나온다.
오버라이드된 메소드 bye()
- 속성과 인덱서도 오버라이드될 수 있다.
각각 이름, 인수, 반환 값의 형이 같아지도록 주의하기.
아무튼, 기본 클래스 Word1이 아닌 오버라이드해서 Word2의 (i >= 3)이 출력되었다.
A.
56, 58 행에 Console.WriteLine 을 Console.Write 로 바꾸면 된다!
그런데 이렇게 바꿔서 실행하면 이상하게 key의 공백이 나타나지 않는다.
이 부분에 대해선,
아무리봐도 공백 처리할 함수가 없어서 아예 새로운 함수(?)를 만들었다고.
31행을 추가하면 제대로 출력된다.
* 구조체
: 클래스와 거의 같이, 필드와 메소드의 모임으로 이루어져 있다. struct를 이용해 정의한다.
struct Cake { public int price; public string name; public int getName() { return name; } } |
는 필드.
는 메소드.
구조체는 public int price = 1380; 같은 초기화가 불가능하다.
: 다만, 클래스는 참조형이고, 구조체는 값형이라는 점이 차이점이다.
Cake cake = new Cake(); |
구조체 = 값형의 경우,
값형은 값을 자체에 가지고 있는 데이터형이다. 다른 구조체나 클래스를 상속하거나 상속 원본이 될 수 없다. 인터페이스를 장착할 수는 있다. 변수를 복사하면 내용도 복사된다.
class Book { public int price; public string title; public int getTitle() { return title; } } ... .. Book book = new Book(); |
클래스 = 참조형의 경우,
데이터형은 값을 자체에 갖지 않고 값이 있는 장소를 저장하는 데이터형이다. 문자열, 배열, 클래스, 델리게이트, 인터페이스 등이 참조형이다.
* 예제 프로그램 (p150)
* 수치 리터럴
: 수치를 직접 소스 코드 상에 기술한 것 ( int a = 100; ).
보통 십진수로 표현하지만 16진수( int a = 0x64; )나 2진수( int a = 0b1100100 )라고 표현할 수도 있다.
또, 숫자 사이에 언더바( int a = 123_456_789 )를 써도 된다(= 자리수가 많을 때 사용).
마지막으로 숫자 끝에 L등의 영문자를 붙이면 long형 등을 표현할 수 있다.
long형 : = 100L
uint형 = 100U
ulong형 = 100UL
float형 = 100F
double형 = 100D