궁금한게 있어서 검색을 해보았는데요.
답변이 이해가 잘 안가서 여쭈어 봅니다.
아래 답변에 'as 연산자는 같은 형이거나 자손형이 아니면 예외' 라는 말이 구체적으로 어떤 의미인가요?
무엇과 비교해서 같은형이거나 무엇의 자손형이 아니면 예외라는건지...
TLabel을 sender로 전달하고 그것을 받은 procedure에서 Sender를 형변환할때 TLabel이 아닌 다른 클래스로 변환하게 되면 예외라는 말인가요?
제가 form을 하나 sender로 전달해서 (Sender as TForm) 으로 전달했더니 오류나던게
TForm(Sender)로 하니 오류가 나지 않던 상황과 연관이 있을것 같아 이렇게 문의드립니다.
-----------------------------------------------------------------------------------------------------------------
둘다 강제로 형변환을 하는것인데 as연산자는 같은형이거나 자손형이 아니면 예외를 일으킵니다. 직접적으로 형변환하면 같은 클래스나 파생된 클래스가 아니면 그 객체에 엉뚱한 값이 들
어가버릴 수도 있죠...
TLabel(Sender)이런 구문은 Sender가 확실히 TLabel형일때 사용하세요...
그렇지만 as연산자의 사용보다는 직접적으로 형변환하는게 더 빠릅니다...
문창배 wrote:
> (Sender as TLabel ) 하고 TLabel(Sender)의 차이점이 뭐예여....
>
> 사용하면 ... 결과는 같은데 ..
> 구체적으로 언제 차이가 나는지는 모르겠습니다..
>
> TLabel(Sender)는 상속인거 같고 ..
> (Sender as TLabel)은 대입하는거 같은데 ..
>
> 아시는분 가르쳐 주세요 ...^^
as는 님께서 쓰신대로 같은 클래스 형이거나 hierarchy상에 같은 부모를 가지면 됩니다.
TLabel을 예로 들면 아래와 같이 TObject에서 시작되어 최종적으로 TCustomLabel에서 상속받았습니다.
TObject - TPersistent - TComponent - TControl - TGraphicControl - TCustomLabel - TLabel
as는 위에 있는 어느 클래스든지 형변환되고 그 외에는 예외를 발생합니다.
TForm(Sender)와 같은 형변환은 Sender가 TForm에서 상속받은 객체라는것을 명확히 알고 있다는 가정에서 하는 강제적인 형변환으로 어떠한 형체크도 하지 않습니다. 형체크를 하지 않기 때문에 속도상은 이득이 있지만 전혀 다른 객체를 형변환하면 문제가 생길 여지가 있기 때문에 주의해서 사용할 필요가 있습니다.
" form을 하나 sender로 전달해서 (Sender as TForm) 으로 전달했더니 오류가 났다"는 이야기는 전달한 Sender가 TForm이 아니란 이야기입니다. 뭔가 버그가 있었거나 이유가 있었겠죠...