뭐 공통되지 않은 뭔가를 클래스로 만들려는건가 이해가 잘 안가네
[💬] 근데 저능아라 그런데 추상 클래스 왜 쓰는거냐
익명(darling5762)
2025-07-09 14:24:00
추천 0
댓글 51
다른 게시글
-
친구랑 게임 만들지 마세요
[18][💬] 익명(121.166) | 25.07.09추천 1 -
한 평범한 개발자는 어떻게 탁월함에 도달했을까?
[2][💬] Indie(220.83) | 25.07.09추천 0 -
고도가 인앱만 제대로 되어도
[💬] Indie(121.169) | 25.07.09추천 0 -
아 gigdc영상 어케찍냐...
[6][💬] 도토리쥐(apost1234) | 25.07.09추천 0 -
소코반에도 인풋 버퍼가 있어야 하나보네
[3][💬] RIP(vote8459) | 25.07.09추천 0 -
어셈블리어 배우면 좋음?
[15][💬] 익명(protest4155) | 25.07.09추천 0 -
애니메이션 몇 개
[8][📜일지] 한결같은(7ej1gdlhkjkt) | 25.07.09추천 8 -
사랑니 뽑아본사람 있어?
[18][💬] Indie(124.54) | 25.07.09추천 0 -
내가 본 역대급 빌런
[5][💬] 익명(182.227) | 25.07.09추천 1 -
게임 기획책 읽는게 도움이 되는가?
[20][💬] Indie(210.217) | 25.07.09추천 0
인터페이스와 추상클래스는 is a와 can do의 차이 - dc App
이즈 어 가 뭔 소리야 1개 있다 와 할수 있다의 차이라는 건가
추상클래스를 상속받는 클래스는 "a"다와 인터페이스는 ~을 할수있다 can do - dc App
이건 ㄹㅇ 먼말인지 모르겠네 ㅋㅋ ㅠ
디시로 비유를 하면 인붕이는 디시를 하는 사람일 일꺼임 이 경우엔 인붕이 is 디시 인거겠지 그리고 사람은 글을 쓸수있고 인붕이도 사람이기 때문에 글을 쓸수있겠지 write라는 인터페이스 가있을때 can do write가 되는거임 한마디로 가상 클래스는 관계를, 인터페이스는 책임을 나타낸다고 생각하셈 - dc App
이 말은 이해한듯 ㄱㅅㄱㅅ 인터페이스를 아직 근데 잘 몰라서 더 공부하면 도움될듯
@ㅇㅇ 인터페이스는 상속받는 객체가 기져야하는 책임들의 집합이라 생각하셈 - dc App
정확히 질문이 뭐야 그냥 부모클래스란 존재 대신 왜 추상클래스란게 따로 있냐는 질문이야?
ㅇㅇ
그건 그냥 언어차원에서 이 클래스는 다른 클래스의 부모로만 사용가능할 뿐 이 클래스의 인스턴스는 직접 만들 수 없다고 제약을 거는 기능임
제약을 거는게 다라고? 그런일을 왜해야하는거임?
코딩 의도를 언어차원에서 더 명확하게 강제하려는 문법인거지. 그 질문은 마치 if랑 goto만 있으면 무슨 반복문이든 만들 수 있는데 왜 for가 따로 필요하냐? 같은거임
가독성을 위한거라는건가... 어렵네... ㄱㅅㄱㅅ
가독성에도 물론 도움이 되지만 실제 코딩에도 도움이 됨. 상속 관계를 만들다 보면 공통 부모역할만 할 뿐 실체화될 수 없는 클래스를 설계할 경우가 흔히 생기는데 언어차원의 제약 없으면 실수로 인스턴싱을 시도할수도 있잖아. 언어차원에서 제약이 있으면 컴파일타임에 오류를 발견할 수 있으니까 훨씬 낫지
모든 프로그래밍 언어는 언어 설계자가 추구하는 패러다임이 있음. 예를 들면 로우레벨 접근을 제한없이 허용하는 C/C++, 상태(state)를 최소화하려는 rust 등이 있음. C#이나 Java 등에서 abstract란 문법이 있는건 OOP를 추구하는 언어 설계 철학을 최대한 실제 코딩에서 실수 없이 구현하라는 의도임.
먼말인지는 알겠는데 너무 으렵다... 좀 더 정보를 찾아봐야할거같네 ㄱㅅㄱㅅ
어렵게 생각할 필요 없음 내말대로 그냥 언어차원에서 명시적으로 제약을 거는거라고 대충 알고 넘어가면 됨. 유사한걸로는 readonly 같은게 있음. 값을 한번 입력한다음에 변하지 않는 경우에 쓰는 키워드지만 사실 없어도 그냥 내가 그렇게 코딩 안하면 되는거잖아? 하지만 굳이 readonly 같은걸 만든 이유는 일단 딱 봤을때 아 이 변수는 초기값 설정 후엔 변하지 않을거구나 알수도 있고 코딩하면서 실수로 값을 변경하려고 했을때 바로 컴파일오류로 알려주기도 하고.. 뭐 그런거임
이런 건 설명으로 해봤자 이해 잘 못함. 직접 작성하다가 깨우쳐야 함
ㅋㅋ 글쿠나 ㄱㅅㄱㅅ...
@ㅇㅇ 굳이 설명을 해보자면, 무기를 만든다치자. 우리 겜에는 총이 있음. AK47과 M4A1이 있다고 해보자. 이 놈들이 모두 가져야 하는 기능들이 뭐가 있을까? 사격 쿨타임이 있어야 겠으니 cooldown이란 필드를 추가하고, cooldown인지 아닌지 판별하기 위해 CanFire 라는 프로퍼티도 추가하자. 그리고 발사할 때를 위해 Fire()라는 함수도 있어야겠고, 장전을 해야하니 Reload()란 함수도 있어야겠다. 이런 애들은 모든 총들에 공통되니까 GunBase라는 공통 부모 클래스를 작성해서, 각각의 총들이 상속받게 만드는 게 중복방지 차원에서 도움이 되겠지? 그리고 유지보수에도 도움이 되겠지. 모든 총의 공통 기능을 수정하기 위해서는 부모 클래스인 GunBase만 수정하면 되니까. 그런데,
@ㅇㅇ 이 GunBase는 실체가 없는 클래스임. 무슨 말이냐면, AK47와 M4A1는 실제로 이 GunBase를 상속받아서 존재하는 무기이지만, 이 GunBase가 자체적으로 무기가 되지는 않는다는거임. 즉, 이 GunBase를 인스턴스화를 하지는 않는다는 거임. 그렇기 때문에, '추상적인 클래스'라는 의미에서 abstract를 선언하는 거임.
ㅈㄴ 어렵네 좀더 공부해야 이해되려나 계속 읽어봤는데 먼소린지는 알겠는데
@ㅇㅇ 이걸 이해하기 위해서 해야하는 건 공부가 아니라, 실구현임. 만들어봤다면 이해를 못 할 수가 없음
와쓰ㅔㅅ 설명잘한다 바로이해함ㄹㄴ - dc App
롤로 예를 들어볼게. 모든 챔피언들은 Q를 누르면 뭔가 나가잖아? 근데 스킬이 모두 다 다름. SkillQ라고 함수가 있다고 하자고. 이때 단 한개의 추상클래스를 써서 모든 챔피언 클래스에 상속받아 재정의한다면 SkillQ를 호출할 때 Override된 함수가 불러온다고.
이건 이해 했는데 갑자기 무조건 써야하고 인스턴스화는 안되고 이러길래 ㅋㅋ
뭔소리여 그게
그니깐 위에 말처럼 부모 클래스 써도 되는거 아닌가 굳이 추상클래스를 써야하나 싶어서
부모클래스 쓰면 재정의는 어떻게 하게??
@사랑맛쿠키 글쓴애가 부모 클래스 쓴다는게 추상이 아니라 그냥 일반 클래스 상속한다는 의미 아님?
비슷한 기능들을 구현할때마다 정의하기 귀찮지? 추적하기도 힘들고 그걸 하나로 추상화해서 그걸 가져다 재정의해서 쓰는거임. 추적도 저 인커페이스 쓰는놈들 링크되니까 가서 수정하면돠고
무기에 다양한 종류가 있겠지? 칼, 총, 창, 활... 등등 그런 무기를 객체로서 취급은 해야하는데, '칼'을 드는건 가능하지만 '무기'라는거 자체를 드는걸 불가능하게 하려고 쓰는거
위에 저분이랑 비슷한 늬앙스같은데 ㅅㅂ 뭔소린지 잘 모르겠네 ㅋㅋ
그니까 공통되는 속성과 동작은 가지게 하고 싶은데, 그 속성과 동작을 직접적으로 객체화를 못하게 하려는거임
예를들어 '무기'를 상속한 두 무기 '총'과 '칼'이 있다고 하자? '총'도 공격을 할 수 있어야하고, '칼'도 공격을 할 수 있어야하니까, '무기'에 '공격()' 이라는 함수를 만들어 두는거임 이제 플레이어로 넘어가서 장착한 무기를 '무기' 손에_든_무기 = new 총(); 손에_든_무기 = new 칼(); 이런 식으로 들게 하는건 가능한데 손에_든_무기 = new 무기(); <<< 이걸 불가능 하게 하려는거
@Ray. 저렇게 두면 '무기'라는 추상 클래스에 '공격()'이 있으니까, 손에_든_무기 와 상관 없이 '공격'은 가능함
오 오키 좀 검색하면서 읽으니깐 좀 이해가 되는거같기도
혼자 작업할때는 왜 중요한지 와 닿지 않을 수 있음. 하지만 여러명이 작업할 때, 특히 설계자는 미국에 있고 그거 받아서 재정의 해서 쓰는 사람은 한국에 있다고 하면 어떤 설계 패턴을 명시적으로 해놓아야 할 수 있음.
결국 명시적인 이유랑 부모 함부로 써서 ㅈ대는 경우를 방지하는 뭐 그런거같은데 대략 이해한 바로는
기본 무기 클래스 상속 받는 수십개 무기 클래스 만들다가 Attack() 메소드 하나 오버라이드 안한거 있어서 버그 터지고 고생하면 아하 추상메소드라는게 있었지 라면서 떠올리면 됨
캐스트를 이용하면 분기문을 줄일 수 있어
그리고 나중에 추가 기능이 필요할 때 확장을 하거나 줄일 때도 기존 코드 수정 없이 가능해
근데 적고 보니까 일반 상속 구조에서도 되네 ㅡㅡ
추상 클래스는 abstract 함수를 쓸 수 이써...
음.. 저는 걍 가상메서드 만들어놓고 비워둔채로 쓰는데 이거랑 다른 점이 있는 거임?
@211214 컴파일러가 알려줌
걍 안쓰고 작업하다보면 코드가 엿같아 지는 상황이 옴. 그럴 때 다른 사람들은 이 엿같은을 어떻게 해소하지? 하면서 찾아보면 됨
실제 개발할때 체감되는 건 다중상속 정도?