강력한 타입 언어에서 저런 위험한 키워드를 지원하는것 자체가 아이러니 하네요 ㅋㅋㅋ 잘못쓰면 버그도 찾기 힘들어질거같은 느낌. 가능하면 인터페이스를 하나 선언해서 넘기던지 하는 식이 좋아보이기도 하고.. 아니면 c++만큼 강력한 템플릿 프로그래밍 기능들이 c#에서는 타입 체크의 명목으로 많은 부분이 제한되는데, 프로그래머가 자신이 있으면 그런 제한을 푸는데 사용할 수 있을 것도 같아보이네요?
안녕하세요 지석님! 수준 높은 댓글 감사드립니다! 맞습니다 dynamic 잘못쓰면 바로 런타임애러가 납니다. ㅠㅠ 그럼에도 불구하고 dynamic keyword가 생긴 이유는 C#이 아닌 다른 기종간에 API 호출에 따른 귀찮은(?) 타입 케스팅을 줄이기 위해서 탄생했습니다. 대표적으로 Office API의 COM API를 예를 들 수 있습니다. 링크를 드리니 링크 안에 COM interop를 찾아서 보시면 이해가 쉬우실 겁니다! learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/using-type-dynamic#com-interop 혹시 또 다른 의견 있으시면 언제든지 댓글 달아주시면 감사하겠습니다! 다시 한번 댓글 달아주셔서 감사합니다!
@@User_Masuri 오피스 api를 쓸일은 없었어서 저런 내용은 몰랐네요 그래도 가능하면 dynamic의 사용은 개인적으로 지양할 것 같습니다 ㅋㅋㅋ 느낌이 unsafe키워드랑 비슷한데 오피스 api를 써도 일일히 캐스팅 해서 사용할 것 같네요 강타입 언어의 최대 장점 중 하나가 컴파일 타임에 적어도 타입에 대한 체크 만큼은 확실하게 하고 넘어가기에, 런타임 때 날 수 있는 오류들을 미리 잡아주는 부분이라고 생각해서요. 그냥 일반 소프트웨어면 아 프로그램이 자꾸 튕기네;;하고 끝날 문제겠지만 절대 죽으면 안되는 중요한 프로그램들이 있으니까요. 비행제어기나 관제 컴퓨터 등에 들어가는 소프트웨어처럼요. 물론 임베디드에 사용되는 제어 소프트웨어는 애초에 c#을 안쓰지만, 관제 어플리케이션은 데스크톱 환경이라 c#으로 개발할 수도 있을거 같은데, 관제 도중 dymanic으로 인한 런타임 에러로 어이없게 튕기면 좀 무서울거같아요 ㅋㅋㅋ
안녕하세요~ 유현수님 좋은 질문 감사합니다~ [컴파일타임 vs 런타임] 컴파일타임은 현재 코드를 치고 있는 시기를 말해요. 런타임은 코드를 실행해서 실제로 조작할 수 있는 시기를 말합니다. 여러분이 사용하는 모든 프로그램은 런타임이라고 보셔도 됩니다. 계산기, 게임, 윈도우, 인스타그램 앱 등등 결국 컴파일타임에 타입을 알 수 있다는 것은 코드를 칠 때 이 변수에 들어가 있는 타입을 알 수 있다는 말입니다. dynamic이나 다형성을 이용해서 코드를 만들면 실제로 어떤 타입이 들어오는지는 런타임때 알 수 있습니다. 예를 들어 볼게요 void TestFunc(int num) { } 파라미터로 들어온 num의 타입은 무엇일까요? int형인걸 알 수 있죠? void TestFunc(dynamic num) { } 파라미터로 들어온 num의 타입은 무엇일까요? 이건 실제로 프로그램을 실행(런타임)해서 이 함수를 호출하는 함수가 파라미터로 어떤 값을 던졌는지 봐야 알 수 있습니다. [var type] 우선 var 형에 대해 알고가야 할 것 같아요. var는 '축약형'이예요. 무슨말이냐면 var list = new List();라고 하면 list에 들어갈 데이터가 List()타입인걸 보고 var list = new List();를 컴파일러가 List list = new List();로 '컴파일타임'에 인식합니다. 고로 var list = new List();로 적는것과 List list = new List():로 적는건 아무런 차이가 없는 완벽히 똑같은 동작을 합니다. 위와 같은 특징으로 var를 사용하시려면 꼭 대입연산자(=)를 통해 어떤 데이터 타입이 들어갈지 명시해야합니다. 그래야 컴파일러는 var타입을 실제로 대입되는 값을 이용해 추론할 수 있기 때문입니다 한마디로 var list; 와 같이 대입연산자 없이 var를 사용하는건 불가능합니다. 정리하면 var는 그저 같은 타입을 변수 선언할 때 1번 변수에 값을 대입할 때 1번 이렇게 총 2번 치는 것을 방지하기 위해 변수 선언시는 var를 사용하고 값을 대입할 때만 한번만 타입을 적어도 동작하게 한거예요 MSDN에 따르면 최근 나온 C# 9.0에선 'List xs = new();' 이런 코드도 동작한다고 합니다. 결국 이것도 List를 2번 치기 싫어서 나온 것으로 var와 같은 맥락입니다. 감사합니다! 다른 질문이 있으시면 언제든지 댓글 달아주세요~
좋은 강의 올려주셔서 항상 감사드립니다! 업로드 항상 기다리고 있어요^^ 새해 복 많이 받으세요.
안녕하세요. JYH님도 늦었지만 새해 복 많이 받으시기 바랍니다!! 기다려 주시면 다시 업로드 시작하도록 하겠습니다. 그동안 코로나 조심하세요~ :)
유익한 강의 항상 감사드려요
그렇게 생각해주신다면 감사드립니다!
강력한 타입 언어에서 저런 위험한 키워드를 지원하는것 자체가 아이러니 하네요 ㅋㅋㅋ 잘못쓰면 버그도 찾기 힘들어질거같은 느낌.
가능하면 인터페이스를 하나 선언해서 넘기던지 하는 식이 좋아보이기도 하고..
아니면 c++만큼 강력한 템플릿 프로그래밍 기능들이 c#에서는 타입 체크의 명목으로 많은 부분이 제한되는데, 프로그래머가 자신이 있으면 그런 제한을 푸는데 사용할 수 있을 것도 같아보이네요?
안녕하세요 지석님! 수준 높은 댓글 감사드립니다!
맞습니다 dynamic 잘못쓰면 바로 런타임애러가 납니다. ㅠㅠ
그럼에도 불구하고 dynamic keyword가 생긴 이유는 C#이 아닌 다른 기종간에 API 호출에 따른 귀찮은(?) 타입 케스팅을 줄이기 위해서 탄생했습니다.
대표적으로 Office API의 COM API를 예를 들 수 있습니다.
링크를 드리니 링크 안에 COM interop를 찾아서 보시면 이해가 쉬우실 겁니다!
learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/using-type-dynamic#com-interop
혹시 또 다른 의견 있으시면 언제든지 댓글 달아주시면 감사하겠습니다!
다시 한번 댓글 달아주셔서 감사합니다!
@@User_Masuri 오피스 api를 쓸일은 없었어서 저런 내용은 몰랐네요
그래도 가능하면 dynamic의 사용은 개인적으로 지양할 것 같습니다 ㅋㅋㅋ 느낌이 unsafe키워드랑 비슷한데
오피스 api를 써도 일일히 캐스팅 해서 사용할 것 같네요
강타입 언어의 최대 장점 중 하나가 컴파일 타임에 적어도 타입에 대한 체크 만큼은 확실하게 하고 넘어가기에, 런타임 때 날 수 있는 오류들을 미리 잡아주는 부분이라고 생각해서요.
그냥 일반 소프트웨어면 아 프로그램이 자꾸 튕기네;;하고 끝날 문제겠지만
절대 죽으면 안되는 중요한 프로그램들이 있으니까요. 비행제어기나 관제 컴퓨터 등에 들어가는 소프트웨어처럼요.
물론 임베디드에 사용되는 제어 소프트웨어는 애초에 c#을 안쓰지만, 관제 어플리케이션은 데스크톱 환경이라 c#으로 개발할 수도 있을거 같은데,
관제 도중 dymanic으로 인한 런타임 에러로 어이없게 튕기면 좀 무서울거같아요 ㅋㅋㅋ
var 형이랑 비슷하네요.
컴파일은 아는데 런타임은 뭔지 자세히 알려주실 수 있나요??
안녕하세요~ 유현수님 좋은 질문 감사합니다~
[컴파일타임 vs 런타임]
컴파일타임은 현재 코드를 치고 있는 시기를 말해요.
런타임은 코드를 실행해서 실제로 조작할 수 있는 시기를 말합니다.
여러분이 사용하는 모든 프로그램은 런타임이라고 보셔도 됩니다.
계산기, 게임, 윈도우, 인스타그램 앱 등등
결국 컴파일타임에 타입을 알 수 있다는 것은 코드를 칠 때 이 변수에 들어가 있는 타입을 알 수 있다는 말입니다.
dynamic이나 다형성을 이용해서 코드를 만들면 실제로 어떤 타입이 들어오는지는 런타임때 알 수 있습니다.
예를 들어 볼게요
void TestFunc(int num)
{
}
파라미터로 들어온 num의 타입은 무엇일까요?
int형인걸 알 수 있죠?
void TestFunc(dynamic num)
{
}
파라미터로 들어온 num의 타입은 무엇일까요?
이건 실제로 프로그램을 실행(런타임)해서 이 함수를 호출하는 함수가
파라미터로 어떤 값을 던졌는지 봐야 알 수 있습니다.
[var type]
우선 var 형에 대해 알고가야 할 것 같아요. var는 '축약형'이예요. 무슨말이냐면
var list = new List();라고 하면 list에 들어갈 데이터가 List()타입인걸 보고
var list = new List();를 컴파일러가 List list = new List();로 '컴파일타임'에 인식합니다.
고로 var list = new List();로 적는것과 List list = new List():로 적는건
아무런 차이가 없는 완벽히 똑같은 동작을 합니다.
위와 같은 특징으로 var를 사용하시려면 꼭 대입연산자(=)를 통해 어떤 데이터 타입이 들어갈지 명시해야합니다.
그래야 컴파일러는 var타입을 실제로 대입되는 값을 이용해 추론할 수 있기 때문입니다
한마디로 var list; 와 같이 대입연산자 없이 var를 사용하는건 불가능합니다.
정리하면 var는 그저 같은 타입을 변수 선언할 때 1번 변수에 값을 대입할 때 1번 이렇게
총 2번 치는 것을 방지하기 위해 변수 선언시는 var를 사용하고 값을 대입할 때만 한번만 타입을 적어도 동작하게 한거예요
MSDN에 따르면 최근 나온 C# 9.0에선 'List xs = new();' 이런 코드도 동작한다고 합니다.
결국 이것도 List를 2번 치기 싫어서 나온 것으로 var와 같은 맥락입니다.
감사합니다! 다른 질문이 있으시면 언제든지 댓글 달아주세요~
안녕하세요. 감사하겠습니다~
메일 주시겠어요? 메일로 답변 드리겠습니당~
메일주시면 감사하겠습니다. 연말 잘보내세요ㅎㅎ
@ᄋᄃ2ᄋ 메일 주소 확인했습니다. 빠르게 답변 드릴 수 있도록 하겠습니다.
댓글로 적어주신 메일 주소는 다른 사람이 볼 수 없도록 삭제 했습니다~