노무현 전 대통령 서거 - 삼가 고인의 명복을 빕니다

바람이 머무는 곳

블로그 이미지
by 파란바람
  • 110,233Total hit
  • 1Today hit
  • 2Yesterday hit

'c#'에 해당되는 글 3건

  1. 2008.03.03
    window form의 controlbox의 닫기 버튼을 숨기기로 바꾸기
  2. 2008.02.27
    c# : Method Hiding
  3. 2008.02.27
    c# : operator overloading
참고 : http://www.thescripts.com/forum/thread225292.html
닫기 버튼을 누르면 창이 사라지는 것이 아니라 숨겨지도록 바꾸려고 구글링하다가 찾았다.
참고용 코드라서, 제대로 돌아가려면 당연히 손을 봐줘야함..

더 깔끔하게 정리된 링크 : http://geekswithblogs.net/TimH/archive/2007/09/13/115323.aspx

이건 subform : http://geekswithblogs.net/TimH/archive/2007/09/13/115323.aspx
TRACKBACK 0 AND COMMENT 0



using System;
using System.Collections.Generic;
using System.Text;
namespace Hide2
{
    class Root
    {
        public void Call()
        {
            Console.WriteLine("Root Call()");
        }
    }
    class Sub:Root{
        //new private void Call()   //1.
        //new protected void Call() //2.1,2 결과는 똑같이 "Root Call()"이다.
        new public void Call()   //3. "Sub call()"
        {
            Console.WriteLine("Sub call()");
        }
    }
    class LastSub:Sub{
    }
       
    class MethodHide2{
        public static void Main()
            {
                LastSub s = new LastSub();
                s.Call();
            }
    }
}
주석 단 곳을 보면..
0. new 키워드가 없을 때 : 아예 컴파일 안된다. (콘솔에서 csc 사용)
1. new private void Call() : "Root Call()"
2. new protected void Call() : "Root Call()"
3. new public vodi Call() : "Sub call()"

private일 때는 당연히 LastSub객체인 s라도 Sub의 함수에 접근 할 수 없으므로 그 위의 Root의 Call을 부르는 것은 책(소설같은 C#)에도 나와있고, 금방 이해를 했다.
그런데 책에서 설명한 건 1번 경우 뿐이라 protected로 바꿨는데 1번과 결과가 똑같다.

맨 처음 protected로 바꾸면서 한 생각은, LastSub는 Sub를 상속받았으니 "Sub call()"이 나올 것이라고 생각했다. 그런데 생각과 달리 1번과 같은 결과가 나와서 규온 오빠에게 도움을 청했다.

protected로 바꾸었더라도 여전히 1번과 결과가 같은 까닭은..
스코프 문제다.
LastSub 객체 s는 MethodHide2 스코프 아래에서 생성되고, 거기에서 Call()을 불러오고 있다.
protected는 상속한 개체만, 그것도 상속한 개체의 스코프 안에서만 상속받은 부모의 멤버필드에 접근할 수 있다. 위에서는 상속한 개체를 벗어난 스코프에서 접근하려는 것이므로 접근이 되지않는다. 그래서 불러오는 것은 Root class의 Call()이 되는 것이다.

3번은 public으로 바꾸었으므로 어디에서든 Sub::Call()에 접근할 수 있다. 그러므로 Sub를 상속받은 LastSub가 다른 스코프에서 생성된 다음 call을 부르면 Sub의 Call()을 호출할 수 있다.


다른 사람은 다 알고 있을 거 적으려니까 엄청 창피하네ㅠㅠ
그래도 까먹으면 안되니까 복습차원에서 블로깅..
TRACKBACK 0 AND COMMENT 0



1. 정의할 때
  • 무조건 public
  • 무조건 static
  • return type은 마음대로
2. 예제
    class operOverloadTest
    {
        public int a = 0;
        public int b = 0;
        public operOverloadTest(int a, int b)
        {
            this.a = a;
            this.b = b;
        }
        public static operOverloadTest operator +(operOverloadTest oot1, operOverloadTest oot2)
        {
            int resultA = oot1.a + oot2.a;
            int resultB = oot1.b + oot2.b;
            operOverloadTest result = new operOverloadTest(resultA, resultB);
            return result;
        }//연산자 오버로딩
    }
    class operOverloadTestMain{
        public static void Main(string[] args)
        {
            operOverloadTest oot1 = new operOverloadTest(3, 5);
            operOverloadTest oot2 = new operOverloadTest(7, 16);
            operOverloadTest result = oot1 + oot2;
            Console.WriteLine("sum of a's = " + result.a);
            Console.WriteLine("sum of b's = " + result.b);
        }
    }
TRACKBACK 0 AND COMMENT 0




ARTICLE CATEGORY

분류 전체보기 (471)
미투데이 (142)
연습일기 (2)

CALENDAR

«   2021/08   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

ARCHIVE