GSI

System.Object & 오버라이딩

C# 2008. 12. 6. 17:25 |

System.Object

System.Object는 모든 .NET의 최상위 클래스이다.
즉, .NET에 있는 모든 참조 타입은 이 클래스를 상속하게 된다.

근데 상속이라고 하면
class A : Object
{
...
이런걸 생각 하겠지만 사실 이렇게 하지 않아도 내부적으로는 Object를 상속 받게 되는 것이다.

우선 기본 멤버들을 보게 되면,
  • Equal : 두 객체 인스턴스가 서로 같은지를 검사한다. 값이 아닌 참조를 비교한다.
  • Finalize : 객체가 제거될때 자동으로 실행되는 protected virtual 메소드
    이 메소드는 오버라이딩이 되지 않으며, C++과 비슷하게 소멸자를 통해서 처리가 됨
  • GetHashCode : 객체에 대한 해쉬 코드를 생성
  • GetType : 객체의 타입을 리턴한다.
  • MemberwiseClone : 객체의 일부분에 대한 복사본을 리턴한다.
  • ReferenceEquals : 두 객체 인스턴스가 동일한 인스턴스를 가리키는지 테스트 하는 public static 메소드
  • ToString() : 객체를 표현하는 스트링을 리턴

System.Object 오버라이딩

public class Pixel {
  public Pixel (byte x, byte y) {
    this.x = x;
    this.y = y;
  }

  private byte x;
  private byte y;

  public override string ToString() {
    return "(" + x + "," + y + ")";
  }

  public override bool Equal(object o) {
    try {
      Pixel p = (Pixel)o;
      return p.x = x && p.y == y;
    } catch (Exception) {
      return false;
    }
  }

  public override int GetHashCode() {
    return (x<<8) + y;
  }
}

ToString() 내부에서 x, y 좌표값을 콤마로 구분해서 보여줍니다.
만약 이게 선언되어 있지 않다면, 클래스 이름만을 리턴합니다.

Pixel p = new Pixel(200, 250);
Console.WriteLine(p); //"(200,250)" 을 출력한다.

Equal() 메소드는 내부에서 해당 값들을 비교해서 같다면
true를 리턴하게 됩니다.

Pixel을 선언한 두개의 변수가 있다고 하지만 이것은 어디까지나 참조 타입으로
참조 주소가 두개가 틀리게 되기 때문에 내부의 값이 같은지 비교 하기 위해서는
Equal을 오버라이딩 해줘야 하는 것입니다.

Finalization
참조 타입은 힙에 생성된다. 힙은 런타임이 알아서 관리 한다.
힙 공간을 좀 더 확보할려면 사용하지 않는 객체에 대해 가비지 컬렉션을 수행해야 한다.
System.Object에 있는 Protected visual 인스턴스 메소드인 Finalize를
"오버라이드" 하여, 가비지 컬렉션에 의해 객체가 제거되기 전에 사용한 자원을 리턴할 수 있다.
하지만 ToString(), Equal()등의 메소드와 같이 일반적으로 오버라이드가 불가능하며
소멸자 기호를 사용해야 한다.

Finalization & Dispose 메소드
객체를 제거하기 전, 사용한 리소스를 명시적으로 해제해야 할 경우, .NET 관련 문서에서는
Dispose 메소드를 작성한 후 이를 호출해 주는 방법을 권장하고 있다.
이때 System.IDisposable 인터페이스를 사용하게 된다.

Dispose 메소드에서는 GC.SuppressFinalize(this) 라는 static 메소드를 호출함으로써 더 이상의
finalization이 진행되지 못하도록 할 수도 있다.


결과적으로 Dispose를 통해서 특정한 자원을 리턴하거나, finalization 을 사용해서
프로세스에 맏기도록 선택할 수 있다.

즉, 더이상 사용할 필요가 없는 객체를 완전히 제거하려는 경우에는 Dispose 메소드를 이용하는 것이 좋다.
Finalization은 어느정도의 시간이 소모되기 때문에 가급적 명시적으로 자원을 리턴해야 하는 경우만 사용하자.


이잉
Posted by gsi
:

저번주에 값, 참조 타입에 대해서 스터디를 했다.
한번더 복습의 경험이 된거 같다.

우선 여기서 적을 것은 참조 타입의 주소 참조를 통해서 일어나는
몇가지를 적을 생각이다.

string 의 경우 값을 여러개 대입하거나 += 연산자를 통해서
해당 값들을 추가 할때 참조타입이기 때문에 메모리 공간에 값이 추가 되면서
string의 변수가 참조를 하게 된다.

이때 값을 대입하거나, += 을 통해서 대입되는 값들은
새로운 메모리 공간을 또 요구 하게 된다. 즉, 나머지 이전의 참조 값들은
더이상 참조가 되지 않는 것 뿐이며, 그 값은 가비지 컬렉터를 통해서
지워지게 된다.
그렇다 보니 그 값은 지워지지 않은 상태에서 많은 메모리를 소비 하게 된다.

string은 대입을 한번만 하고 해당 정보를 가져다 쓸때만 사용하는 것이 좋다.
만약 여러번의 대입을 사용할 경우는 StringBuilder 을 쓰는게 좋다.
이건 메모리를 충분히 잡아 놓은 상태에서 해당 값들을 계속해서
추가 하더라도 string보다는 메모리 소비가 적게 된다.

Posted by gsi
:

XP 정품 시리얼 번호 변경

Etc 2008. 11. 22. 00:52 |

레지스트리수정을 통한 Windows XP시리얼 번호 변경

1. 시작 > 실행 에서 regedit 입력하고, HKEY_Local_Machine+Software+Microsoft+WindowsNT+Current Version+WPAEvents 이걸 찾아서 오른쪽 창에 있는 "oobetimer" 항목에 대고 마우스 오른쪽 눌러서 값을 아무거나 바꿔 인증상태를 Deactivation 상태로 변경한다. (값에서 CA만 지워도 가능)
 


2. 레지스터리 편집창 닫고, 다시 시작 > 실행에서  %systemroot%\system32\oobe\msoobe.exe /a  을 입력하면, 인증창이 뜨는데, 
리스트중 두번째 전화를 걸어 인증할 수 있는 옵션을 선택한다.
 
 
3. 두번째 옵션을 선택하고 next 누르면 새창이 뜨는데 다른것은 무시하고 하단 메뉴의 '제품 key 변경' 버튼을 누른다. 그러면 또 새로운 key 입력 창이 뜨는데, 거기에 정식 시리얼키를 입력하고 화면 하단의 '나중에 알림'버튼을 눌러 인증과증을 종료한다.

Posted by gsi
:

부팅 USB 제작하기

Etc 2008. 11. 15. 17:21 |


1. USB TOOL SETUP.exe 를 사용해서 설치 한다.
2. USB의 데이터는 모드 백업한 후에 위의 설치된 프로그램을 사용해서 생성 가능합니다.
3. 설치후에 해당 내용은 도움말을 참조 하세요.

전 위의 내용을 사용해서 win98의 부팅 이미지가 복사되도록 하고 나서
부팅 해보니 제대로 되네요. (단, BIOS에서 USB 부팅이 지원되어야 합니다.)

설치 파일 :
.
Posted by gsi
:

조인 테이블 테스트시 필요한 쿼리문
학생, 동아리 테이블은 기본으로 생성됨
학생동아리 테이블은 FK로 구성되어짐
-------------------------------------------------------------------------------------------
use sqlDB
create table stdTbl
(
 stdName nvarchar(10) not null primary key,
 addr nchar(4) not null
)
go

create table clubTbl
(
 clubName nvarchar(10) not null primary key,
 roomNo nchar(4) not null
)
go

create table stdclubTbl
(
 num int identity not null primary key,
 stdName nvarchar(10) not null
  foreign key references stdTbl(stdName),
 clubName nvarchar(10) not null
  foreign key references clubTbl(clubName)
)
go

insert into stdTbl values('박지성', '서울')
insert into stdTbl values('박주영', '경기')
insert into stdTbl values('조재진', '충북')
insert into stdTbl values('이천수', '인천')
insert into stdTbl values('안정환', '강원')
go
insert into clubTbl values('수영', '101호')
insert into clubTbl values('바둑', '102호')
insert into clubTbl values('축구', '103호')
insert into clubTbl values('봉사', '104호')
go
insert into stdclubTbl values('박지성', '바둑')
insert into stdclubTbl values('박지성', '축구')
insert into stdclubTbl values('조재진', '축구')
insert into stdclubTbl values('이천수', '축구')
insert into stdclubTbl values('이천수', '봉사')
insert into stdclubTbl values('안정환', '봉사')
go

Posted by gsi
: