인스턴스 생성 코드를 어떻게 사용하시나요?

  • C v = new C();
  • var v = new C();
  • C v = new();
  • C v = new (); // -_-;
0 투표자
5개의 좋아요

헉…저는 투표를 못하네요 ㅎㅎ

저는 C v = new(); 방식으로, 3번입니다 ㅎㅎ

2개의 좋아요

아…네모안에 체크를 하고 지금 투표 버튼을 누르는 거 였군요…
지금 투표 버튼을 눌러서 활성화 시키는 줄 알았습니다…ㅎㅎ

1개의 좋아요

C v = new (); // -_-; ← 이 이모티콘 몬가욜? ~ㅁ~?
(전 사실 이건 쓰고 싶어도 C# 버전이 낮아서 못 ㅆ…)

1개의 좋아요

아 이모티콘을 지우려고 했는데 시간을 넘겨서 못지웠습니다. 혹시 이렇게 쓰시는 분이 있을까 하는 표현인데… 흑 해외에는 new와 인자 사이에 공백을 하나 둬서 표현하는 스타일도 쓰시더라고요.

1개의 좋아요

앙… 나쁘다는 게 아니라 뭔가 다른 의미가 있나 해서욜…=ㅂ=;;;

개인적으로는 var 를 사용하는 게 언어설계의 방향성에 따르는 것이라고 생각하기 때문에 자주 씁니다.(Effective C# 내용에 공감 … 끄떡 ‘ㅁ’)

3개의 좋아요

저는 2번 우선적으로 쓰고있습니다!!

여담으로 퀴즈~

2번이 오답이네요. 정적타입추론이 불가능…

제가 그 책은 못봤는데 혹시 어떤 내용인지 알 수 있을까요?

내용을 정리하신 분이 있군요.

책이 17년도 판이 마지막이라 C# 6.0까지의 내용 기준인데요.
(전 집에 구판이나 신판 둘 다 있지욤 >ㅂ<)

그래도 C# 이라는 언어의 철학적인면을 잘 해설해 놓은 책이라 지금 봐도 가치가 있는 책입니다.
(김명신 (구)부장님 이 번역하셨어용)

var 관련 내용은 저 링크에서 표현하는 것보다 더 많은 내용이 정리되어 있어욜!

저는 Effective C# 강추욤 ~ㅂ~b

2개의 좋아요

투표 결과를 보면 절반 정도의 분들이 var를 사용해 코딩을 진행하는 것을 알 수 있는데요 var가 생성시점에서는 타입이 오른쪽에 나타나기 때문에 선호되지만 타입을 유추할 수 없을 때는 var가 아니라 타입을 적어주는 것을 선호하는 분들도 꽤 계셨던 것으로 기억합니다.

저같은 경우는 최근에 new() 형태로 쓰려고 훈련하고 있으며 대량의 목록을 초기화 할 때 깔끔한 느낌을 받았습니다. 이 역시 타입이 드러나지 않는 것에 대한 면에서 지양하시는 분들도 있는데요, 어떤 것이 맞다고 할 수 없는 취향의 문제인것 같아요.

2개의 좋아요

링크 감사합니다. var를 권장하는 의견이 책으로 정리된 것을 보고 싶었습니다.
저는 링크에서

지역변수의 타입을 명확히 유추할 수 없고 모호할 경우엔 차라리 명시적으로 선언하는 코드가 낫다.

… 각각의 정밀도가 다르기 때문에 var를 사용할 경우 가독성과 정밀도에 있어 오류가 발생할 수 있기 때문에…

부분에 집중된 타입의 취향인 듯 합니다. C# 9.0이 되어 new()가 등장뒤로부터 제 코드에는 linq-> Select를 통해 익명 클래스가 반환된 케이스가 아니라면 var를 쓰지 않습니다.

그렇다고 제가 타입을 그럼 메서드에 마우스를 올려놓고 다 일일이 치고있느냐…그것은 아닙니다.

var쪽에 커서를 두고 alt + enter 또는 ctrl + . 을 누르면 Visual Studio가 명시적으로 타입을 바꿔주겠냐고 컨텍스트 메뉴가 발생하고, 그냥 엔터치면 타입을 Visual Studio가 만들어 줍니다.

어느 것은 var로 하고, 어느것은 타입을 명시하고…저는 그것이 오히려 통일감이 없다는 쪽이라 전 var로 타입을 정적추론하는 것은…개인적으로 싫어하는 느낌입니다…MS에서 .NET은 강력한 타입언어 로 디자인해서 만들었고, 그 신념이 깃들어 typescript도 강력한 타입언어가 되었듯이요…ㅎㅎ

하지만 제가 코드 칠 때 그렇게 하는거고 다른 개발자가 var를 쓰던… 그것은 언어에서 지원하는 강력하고 편리한 키워드임에는 분명하니까 쓰는 것은 뭐라하지는 않습니다…ㅎㅎ

1개의 좋아요

맞습니닷 ‘ㅂ’ 개취죵.

var 에 대해 거부감을 느끼는 사람들도 많더라구요. var 없이 타입을 명시해도 문제가 없으니까요. 왜 선언할 때 타입이 안 보이게 작성하냐… 하는 사람들도 많았어요.
반대로 저처럼 var 를 찬성하는 사람들은, 타입 명시 안 하면 코딩 못 하냐… 그럴 거면 메모장에 코딩하지 VS 왜 쓰냐… 뭐 이런 사람들도 있었구요.
뭐 이럴 땐 사실, 팀의 컨벤션을 논의해 정하는 것으로 해결하는 게 정답인 거 같습니다.

사족을 좀 더 붙여보자면
var 의 등장은 익명형식을 위한 처리였지만, 사실 좀 더 C# 이라는 언어 철학에 가까운 것이라 생각합니다.
제 생각엔 var 와 strong type 언어의 강점의 연관성은 없어보여요. 오히려 dynamic 이 관련 있겠죠.
var 는 개발자의 실수를 방지하고 편의를 도모한 다는 것에 좀 더 무게가 있는 기능이라고 봐야 할 겁니다.

즉슨, 이미 작성된 코드나 런타임에서의 중요도가 아니라 말 그대로
코드를 작성하는 디자인 타임에서 개발자의 실수를 줄이고 편의를 증대하는 것이 중요하다.
고 봐야 하지 않을까 합니다.

컴파일러를 통한 타입 유추 -> 사용자 실수를 줄인다.

이게 포인트 거든요.
저는 저를 신뢰하지 않기 때문에 항상 틀릴 수 있다고 생각하고 코드를 작성합니다.
그래도 문제없이 결과물을 낼 수 있는 건 컴파일라는 무기가 있기 때문이죠. 디자인 타임에도 최대한 컴파일러의 도움을 받는 게 핵심이라고 봅니다.

게다가 책에서 말하고 있듯이, 타입 자체에 의존하는 것보다 변수명을 잘 만들고 의미에 맞게 잘 사용하는 것이 더 중요하고, 구체화된 타입에 의존하는 것보다 추상화된 것에 의존하는 것이 더 옳은 방향이라고 생각하는 편입니다.

그리고 결정적으로는… 타입 일일이 쓰는 게 길고 귀찮기도 해요. ~ㅁ~;;;

2개의 좋아요

var로 개발은 하되, 그걸 나중에 보거나, 아니면 다른사람이 볼 때는 본인이 타입을 보면서 개발할 수 있으니 제 생각에는 오히려 불편할 것 같습니다.

거기다 저도 언급했지만…타입을 일일히 다 치지않고 인텔리센스 기능으로 타입을 자동완성시켜서 하니까요 ㅎㅎ 어차피 var를 통해 타입을 자동으로 완성시켜주면 실수는 없을 것 같습니다.

2개의 좋아요

오옷! 실시간 댓글! 좋아욜 >ㅁ<

말씀하신대로 그런 상황은 충분히 있을 수 있습니다. 특히 github 같이 VS 가 아닌 곳에서 코드를 볼 때 때 살짝 불편한 상황은 있죠. 근데 이게 타입 명시하지 않았다고 코드 보기가 불가능한가… 하면 또 그건 아니라서요.
결국 이건 작성자를 위함이냐, 보는 사람의 편의이냐. 인데 제 생각엔 C#의 언어 철학은 작성자 쪽에 더 무게가 있다고 생각합니다.

그리고 그 자동완성이 문제 일 때도 간혹 있어요. 비슷한 이름의 타입명을 여럿 나열해 줄 때 잘못된 타입을 선택하기도 하거든요. 지금은 뭐 자동완성 없이는 개발이 불가능한 상황이 되어버렸지만(자동완성의 노예… ;ㅂ; ) 실수는 여전히 나와요…

어느 쪽이든 장단은 있는 거 같습니다. 취사선택의 문제이긴한데
그런 상황이라면 저는 C# 설계자의 의도에 한 표! 랍니닷 =ㅂ=0

2개의 좋아요

자동완성이 문제인 경우가 있다고는 들었습니다. 하지만 아직 var로 문제된 경우를 제가 경험 못해봐서 인텔리센스를 너무 의존한 경향이 있네요. 그런 쪽도 나중에 경험해본다면 참고가 될 것 같습니다.

말씀하신 타입을 명시하지 않았다고 코드가 보기 불편한가…는 저같은 경우는 좀 확실히 불편한 감이 있습니다.제가 아무래도 경력이 짧고 많은 코드를 더 보지 못해서 그런 걸 수 있을 듯 합니다.

고수끼리 보면 어디에서 어디로가고 그런게 촥촥 연결이 될텐데, 저는 제 코드를 저보다도 한참 뉴비가 본다고 생각하면, 배려하는 차원에서 한 줄마다 타입을 명시하도록 하는 것이 좋다고 생각합니다.

코드는 결국 유지보수가 최종목표니까 mvvm이던 여러 설계패턴이던 나오는 것이라 생각하기 때문에, 유지보수를 생산성에 넣고 본다면 코드로 명시하는 타입은 … 개발할 때는 불편할 수 있어도 내 팀원이 본다고 생각하면 몇자 타이핑은 더 해줄 수 있는 마음입니다…ㅎㅎ

4개의 좋아요

var v = new C();를 사용하시는 분들께 여쭤봅니다.
만일 클래스 멤버로 인스턴스를 선언하고, 초기화한다면 해당 방식을 사용할 수가 없어서 일관성이 떨어지지 않나요?

var는 지역변수로만 사용할 수 있으니까요.

2개의 좋아요

저는 일관성이 떨어지지 않는다고 느낍니다. 일관성을 어느 범주까지 설정하느냐의 차이인 것 같네요.

클래스의 필드를 선언 및 초기화 할때 이런 식으로 쓸 수 있잖아요?

private C _instance = new();

var는 말씀하신 것 처럼 메소드 안에서만 허용하는 구문이니까 메소드에서는 동일한 형태

C instance = new();

가 일관성에 맞지 않나 라고 하신것 같아요. 저의 의견은 물론 오래된 습관도 한 몫 하지만

메소드의 구현부에서는 구현에 초점을 맞추는 반면 클래스의 선언부는 필드의 표현에 초점을 맞춰 이 두가지를 굳이 동일한 일관성으로 묶을 필요는 없다고 생각합니다.

5개의 좋아요

메서드는 '구현’에 클래스는 '표현’에 좋은 말씀이네요. 감사합니다!

4개의 좋아요

필드를 선언과 동시에 초기화하는 경우에는 C v = new();
지역 변수를 초기화할 때는 var v = new C();

저는 이렇게 쓰는 편입니다.

5개의 좋아요