묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
BitConverter.TryWriteBytes 질문입니다.
BitConverter에 TryWriteBytes가 없어서 강사님이 올려주신 솔루션에서 확인해보니 System.Runtime.Extensions에 있는 것을 알게 되었습니다. 제 솔루션에도 using System.Runtime.Extensions를 적용하려했으나 System.Runtime까지는 있는데 Extensions가 없다고 뜨네요. 어떻게 해결할 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
_coPatrol==null 질문
안녕하세요! 항상 강의 잘 듣고 있습니다.(키보드도 잘 쓰고 있습니다.) protected override void UpdateIdle() { base.UpdateIdle(); if(_coPatrol!=null) { StopCoroutine(_coPatrol); _coPatrol=null; } } 로 null 체크하는 부분 관련하여 질문드립니다. 강의 코드에서는 UpdateIdle() 에서 if(_coPatrol=null) 로 확인하고 Coroutine을 실행하고 있는데요, 다음과 같이 생각하여 if문을 지우고 UpdateIdle에서 곧바로 StartCoroutine을 하도록 하였습니다. protected override void UpdateIdle() { base.UpdateIdle(); _coPatrol = StartCoroutine("CoPatrol"); } -> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨. 만약 갈 장소 검색에 실패하거나 CoPatrol이 완료되면 Idle이 되어 다음 Frame에 CoPatrol을 수행한다.(반복) 그래서 실행했을 때의 화면은 다음과 같습니다. https://youtu.be/yHUq12WU2dA 강의 코드에서는 깔끔하게 해당 목적지로 이동하고 끝이지만, 수정한 코드에서는 정신없이 왔다갔다 하다가 해당 목적지로 이동하는 현상이 보입니다. 곰곰이 생각해보았으나 마땅한 이유가 생각나지 않아 질문드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
null 오류
선생님 강의를 보며 코드를 똑같이 작성했는데 널 리퍼런스 오류가 디버깅 도중에 뜨면서 GenPacket.cs가 만들어지지 않아 진도를 못나가고 있습니다 genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3); 이 코드에서 널 리퍼런스 오류가 뜨면서 디버깅이 중단됩니다 정확히는 t가 널이었다면서 오류가 뜹니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
프로젝트 생성 시 오류
안녕하세요 강사님 가장 초반부 설정 강의를 듣고 있는데 프로젝트 파일 생성 하면 디버깅 시작 & 디버그 하지 않고 시작 버튼도 비활성화 되어있고 솔루션 탐색기 창에도 0개 프로젝트라고 해서 아무것도 보이지 않습니다. 여기저기 검색해봐도 해결책이 나오지 않아 여기에 질문 남깁니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
재귀함수 답 질문
안녕하세요 강사님. 좋은 강의 잘 듣고 있습니다! 몇가지 궁금증이 생겨 질문드립니다. static int Factorial(int a) { if (a == 0) { return 1; } return (a * Factorial(--a)); } 제가 작성한 코드입니다. 정상적으로 실행은 됩니다만, 몇가지 사소한 궁금증이 있어서 올려봅니다. 1. a==0이 참일때 return 값을 1으로 주는 것보다 n==1이 참일때 return 값을 1로 주는게 더 효율적일까요?(루프를 한번 덜 돌까요?) 2. 강사님께서 if문의 조건식을 n<=1로 작성하셨던데 n==1이 아니고 n<=1로 설정하신 이유가 따로 있을까요? 3. factorial(n-1)부분을 전위 연산자(--a)로 먼저 처리하게 하였는데, 후위연산자를 사용하여 return (a*Factorial(a--))로 하면 return (a*Factorial(a))가 먼저 실행되고 a--가 실행되기 때문에 무한루프를 돈다고 이해했는데 맞을까요? 아니라면 혹시 다른 이유가 있을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
싱글톤 패턴 관련 질문드립니다
직접 만든 게임을 모바일에서 출시해보고 싶어 유니티 공부를 시작했는데 서적이나 유튜브 강의를 보다보면 거의 싱글톤 패턴을 사용하며 권장하고 있습니다. 여러 커뮤니티에서 싱글톤패턴은 사용하면 안좋은점이 많고 사용하지 말아야 할 문제점 처럼 이야기 하는것을 보게되었는데실질적으로 사용을 피해야하는 안좋은 코딩 방법인지, 사용한다면 개발하는데 제한이 있는 장르가 생기는지 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterAccept() 질문
우선 먼저 사과드립니다... 비슷한 질문이 많은데 그 글들을 봐도 이해에 대해 확신이 서지 않아 같은 질문을 또 드리는것 같네요. 의문이 있는 부분은 SocketAsyncEvnetArgs 부분 입니다. 1. RegisterAccept 에서 AcceptAsync로 args를 처리. 2. args안에 EventHandler<T> Completed; 존재 3. args안에 OnCompleted가 존재하고, Accepted되면 OnCompleted가 실행되면서 Completed.Invoke로 OnAcceptCompleted 동작. 비동기로 accept를 처리하고, accept가 완료되면 callback을 통해서 OnAcceptCompleted 함수가 수행된다는 개념은 이해했지만 동작 메커니즘이 정확하게 이해되지 않아 질문드립니다. 아래 사이트를 참고하였을때, OnCompleted에 뭔가 정의가 있어야 함수가 실행이 될텐데요, event - C# 참조 | Microsoft Docs EventHandler<TEventArgs> 대리자 (System) | Microsoft Docs VS2019에서 정의를 타고 올라갔으나....주석 뿐인 정의만 있었습니다. Socket까지도 정의를 타고 올라갔는데 마찬가지로 프로퍼티+주석만 잔뜩있었습니다 ㅠㅠ.... 제가 옳게 이해한 것이 맞을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
씬 이동시 fade out in 관련 질문입니다.
안녕하세요 씬 이동시 fade out in을 구현하고 싶습니다. 구글링을 통해서 많은 자료를 봤지만 본 강의에서 설계한 Manager 패턴에 적용시키기 어려웠습니다. 가령 버튼을 누르면 fade out in이 동작하거나 monobehavior를 상속받은 별도의 FadeManager를 만드는 등 본 강의와 조금은 이질감이 느껴지는 코드들이었습니다. 기존 틀을 유지한채 fade out in을 적용할 수 있는 방법을 알 수 있을까요? 구글에 떠도는 코드를 따라하려 해도 해당 코드들은 FadeManager의 Child에 검은색 Sprite를 두고 알파값을 변경해가면서 fade in out을 구현했는데 본 강의에서 설계한 대로라면 FadeManager를 생성하고 child를 어떤 방식으로 둬야할 지 모르겠습니다.. 그냥 Manager 밑에 Sprite를 둬도 되는지 의문이 드네요. 가장 좋은 방법이 있을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
함수를 호출할때 배열형식 인자를 참조가 아닌 값 형식으로 전달하고자 한다면 어떻게 해야할까요?
static void WantValue(int[] scores) { // 생략 } static void Main(string[] args) { int[] scores = new int[5] { 1, 2, 3, 4, 5}; WantValue(scores); } 위의 내용에서 WantValue 함수를 호출하면 참조가 전달되는 것으로 알고 있는데요. 근데 만약 참조가 아닌 값 형식으로 전달하려고 한다면 어떤식으로 해야하는지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
애니매이션 질문입니다 (조금 길어요)
중간에 듣다가 점프하는 애니매이션을 넣어보고 싶어서 강의 일시정지 해놓고 점프 하는 애니매이션을 혼자 만들어봤는데 조금 이상한? 부분과 이해가 안가는 부분이 많아서 질문드립니다. 일단 점프 Animation은 유니티짱의 JUMP00 을 사용하였습니다. 점프 조건은 스페이스바를 누를 때 작동되게 하였습니다. 또한 유니티 툴에서 Parameters 부분에 float로 jump를 추가하였습니다. (점프 애니매이션을 실행할때 유니티짱의 position 이 변경이 안되는것을 확인하고 진행하였습니다.) Script코드랑 유니티툴 사진 첨부 하겠습니다. 먼저 Define.cs 에 KeyboardEvent enum타입으로 선언 하였습니다.(아직 왜 Define이라는 파일을 만들어서 관리하는지는 정확하게 이해는 안가지만 그런가보다 하고 여기 선언 하였습니다.) 그리고 왜인지는 모르겠지만 그냥 강의한거 따라서 InputManager.cs 에 사진과 같은 코드를 작성하였습니다. 그리고 이해는 아직 못하였지만 마우스 클릭을 할때 OnmouseClicked 를 Start에 만들어 주었기때문에 똑가이 만들고 선언해주었습니다 그리고 유니티 툴의 State 머신입니다. 현재 State 머신에서 WAIT를 눌러보면 WAIT -> RUN에서는 Has Exit Timed이 꺼져있고 WAIT -> JUMP에는 제가 Has Exit Time 을 껏습니다. 그리고 RUN -> WAIT : Has Exit Time OFF 상태이고 RUN -> JUMP : Has Exit Time OFF 상태입니다. 그리고 JUMP -> WAIT : Has Exit Time OFF상태이고 JUMP -> RUN : Has Exit Time ON(체크된상태) 입니다. JUMP -> RUN에서 Has Exit Time 을 꺼버리면 WAIT 애니매이션이 계속 지속이 되고 Has Exit Time 켜주면 다시 애니매이션이 동작합니다. 다만, 여기서 점프를 하고난 후에 잠시 뛰는 애니매이션을 실행하고 다시 WAIT 애니매이션을 실행합니다. 궁금한 질문 입니다. 질문1 : 막연한 질문이지만 왜 점프를 하고난 뒤에 뛰는 애니매이션을 잠깐 실행하고 멈추는 지 모르겠습니다. JUMP, RUN의 Blending부분을 안곂치게 실행을 해보아도 똑같았습니다. 질문2 : PlayerController.cs에서 작성한 void OnKeyBoardPressed(Define.KeyBoardevent evt) { if (_state == PlayerState.Die) return; Animator anim = GetComponent<Animator>(); anim.Play("JUMP"); } 이 함수 없이도 InPutManager.cs 에 if(Input.GetKeyDown(KeyCode.Space) == true) { KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space); _pressed_space = true; } if(Input.GetKeyUp(KeyCode.Space) == true) { KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space); _pressed_space = false; } 이 부분과 PlayerController.cs에서 작성한 이부분만 있어도 점프가 되던데 어떠한 식으로 함수를 주고받는 것인지 이해가 안갑니다.. Playercontroller.cs의 Start()함수에서 Managers.Input.KeyBoardAction -= OnKeyBoardPressed; Managers.Input.KeyBoardAction += OnKeyBoardPressed; 이 두줄을 주석처리하거고 실행하면 에러가나서 점프가 안되는데 왜 저런식으로 코드를 짜야 점프가 되는지 모르겠습니다. 질문 3 : Playercontroller.cs의 OnKeyBoardPressed의 인자러(Define.KeyBoardEvent evt) 이런식으로 넘겨 주고 밑에 if문으로 함수를 짯는데 Define.KeyBoardEvent evt 의 의미가 Define.KeyBoardEvent 이녀석이 true라는 말이거나 아니면 뒤에 Define.KeyBoardEvent에서 P_Space를선언 해주었다는 말이랑 같은 말인가요? 질문 4 : Start()에서Managers.Input.MouseAction -= OnMouseClicked; Managers.Input.MouseAction += OnMouseClicked; 이러한 부분이 콜백함수인것은 알겠는데 어떤식으로 호출하고 호출되는지 모르겠습니다.. 질문 5: 학교가 게임만드는 학과인데 이때까지 수업들어왔던 내용들이 이해를 못한 부분들이 많은데 그냥 이대로 수업을 쭉 듣고 혼자 실습하는 형태로 진행하는것이 좋을까요 아니면 이해가 될떄까지 늘어지는게 좋은방법인가요..?? 2학년인데 게임개발 잘하시는 분들보면 현타가 옵니다..ㅠㅠ 질문내용을 이해하기 어려우실 수 있는데 답변드린다면 정말정말 감사하겠습니다. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
가시성이라는게
가시성이라는게 사람?코드?의 가시성이 아니라 메모리간의 가시성이라고 이해하는게 맞나요? 그 직원(메모리)들이 잘 볼수있도록 전광판을 업데이트 하는 메모리들간의 가시성?이 맞나요? 어렵네용ㅎㅎ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이건 컴퓨터 성능 때문일까요?
안녕하세요, 선생님 c# 게임 서버 강의를 수강하다가 선생님과 다르게 작동하는 부분이 있어서 질문드립니다 6번째 강의인 컴파일러 최적화 강의에서 코드를 실행하면 4:25초경에 쓰레드 시작! 쓰레드 종료! Stop 호출 종료 대기중 종료 성공 이 순서대로 선생님은 실행이 되는데요, 저는 쓰레드 시작! Stop 호출 종료 대기중 쓰레드 종료! 종료 성공 순서로 쓰레드 종료!가 더 늦게 뜨네요 강의에서처럼 _stop에 volatile을 붙이면 선생님이랑 같은 값이 나오긴 하는데 컴퓨터 성능 차이 때문일 수 있나요? 코드가 다른 부분은 없습니다. 몇 번이고 확인했어요 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Tile collision에 관한 질문입니다.
.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock을 거는 것과 await 키워드를 사용하는 것는 어떤 차이가 있을까요?
제목 그대로 lock과 await의 차이가 궁금합니다. C#에서 제공하는 await 키워드 또한 lock과 비슷한 느낌적인 느낌인데 혹시 차이가 있을까요? lock은 임계구역을 생성해서 보호막을 만드는 느낌이라면 await은 task가 끝날 때까지 잠시 대기 해주는 역할을 하는 것 같은데 먼가 둘의 차이가 정확하게 와닿지가 않아서요! 좀 더 정확하게 잘 이해가 안되는 부분은 "동시 다발적으로 await이 걸려있는 task를 처리한다고 했을 때 어떤 식으로 동작을 할까?"인 것 같아요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
c# 스크립트에서 한글 주석을 달면 깨지는 문제
Unity에서 스크립트를 추가하고 코드를 작성할때, 한글 주석을 작성하고 저장 후 Unity로 돌아오면 한글 주석 부분이 깨져서 나옵니다. 인터넷에 검색해본 결과 스크립트 파일을 메모장으로 열어서 UTP-8로 다시 저장하면 된다고 하여서 시도 해봤더니 한글로 잘 뜨긴 합니다만, 매번 이 방식으로 한글 주석이 달린 모든 스크립트들을 새로 저장하기는 너무 번거롭습니다. 혹시 다른 해결 방법 없을까요? visual studio와 unity 모두 업데이트 해보았으며, unity에서 한글도 설치 했습니다. visual studio에서 도구 - 옵션 - 텍스트 편집기 - 일반 에서 '시그니처 없는 utp-8 인코딩 자동 검색'을 체크 해제 해보기도 하였고 다시 체크 해보기도 하였으나 한글 주석은 계속 깨졌습니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티스레드 와 Lock 질문
안녕하세요. 항상 양질의 강의 감사합니다! 복습중 이해가 확실히 안되는 부분이 있어 질문드립니다. 서버에서 다양한 곳에서 Player를 이동시킬 수 있기 때문에(다른 플레이어가 스킬로 Player를 밀쳐내는 등..) Player를 이동시키는 부분은 한 곳에 몰아서 Lock을 걸고 실행시켜 준다고 설명해 주셨습니다. 그래서 위처럼 GameRoom에 Player가 움직이는 로직을 몰아서 Lock을 걸어주셨는데, 제가 궁금한 점은, HandleMove멤버함수에서 특정 Player를 참조(?) 하고있는 인자 player를 가지고 Lock을 걸고 작업을 하고 있을 때, 다른 클래스의 맴버함수에서도 똑같은 Player를 참조해서 Lock을 걸고 작업하려고 한다면 Lock이 걸리나요? Lock을 건다는건 메모리상에 실제로 생성된 객체(?)를 기준으로 걸리는 건가요? 설명이 많이 미흡한 점 죄송합니다 ㅜ.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
딜리게이트 이해 질문입니다
제가 완벽하게 이해못한거같아 질문드립니다! 질문1. 대리자 딜리게이트를 쓰는이유 함수나 클래스내에 수많은 기능이 있고 그 모든 기능을 전부 쓸필요가 없다면 필요한 기능(함수)만 입력하여 반환 받아 사용하는 편리성? 역할이 맞는가요 질문2. 대리자 사용방법 수업을 들으며 3가지를 만들어야하는거 같았습니다 1. 대리자 delegate 2. 대리자가 사용할 함수(이걸 인자로 넘김) 3. 대리자 함수를 인자로 받으면 그에맞는 값을 반환하는함수 ================================== ( 수업에선 delegate int OnClicked(); ) (우리가 인자에 넣을)함수를 전해주는 대리자 delegate + 반환형식 + 대리자이름(); 여기서 대리자와 같은 형식이며 대리자와 같은 클래스내 함수들을 s라고 하면 메인함수에서 대리자 대 = new 대리자(); 로 객체 생성하고 대리자 대 = new 대리자(s); 또는 대 = s ; 대리자에 함수 전달 =================================== (수업에선 ButtonPressed(Onclicked clickedFunction)) 함수를 지닌 대리자 혹은 함수 자체를 인자로 받는 함수 하나 더 생성 static void Result( 함수 혹은 [함수가 담긴 대리자] ) { 함수(); } 역할은 인자로받은 함수내 필드값을 반환 해주는 함수 ====================================== 끝으로 대리자에 들어가는 함수들은 대리자와 같은 형식이어야하고 (같은 반환형식) 각 함수마다 필드내용은 다르게 설정가능?!? (콘솔명령어로 테스트해보니 그런거같아보여서요) static int test1(){ return 1; } static int test2(){ return 2; } 가 있다면 대리자에 test1함수를 넣고 대리자 혹은 test1함수를 result(대리자 인자)의 인자로 넣을시 1의 값을 반환 대리자에 test2함수를 넣으면 2의 값이 반환되는것이 맞나요?====================================
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unity 실행이 안됩니다..
NetworkManager 에 script를 추가하고 실행을 하면 Unity가 멈춥니다. NetworkManager를 빼고 실행하면 실행이 되는데 뭐가 문제인지 잘 모르겠네요.. 노트북으로 실습하고 있습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
25 x 25 질문입니다
강사님 while(true) 로 하고 강사님의 코드와 똑같이하고 실행하면 마우스 커서 포인트가 0,0 에서 25*25 계속 생성이 안되고 쭉 내려오는식으로 계속 생성이 됩니다. using System; namespace Algorithm { class Program { static void Main(string[] args) { Console.CursorVisible = false; const int WAIT_TICK = 1000 / 30; const string CIRCLE = "●"; int lastTick = 0; while(true) { #region 프레임 관리 // FPS 프레임 ( 60프레임 OK 30프레임 이하로 내려가면 뚝뚝 끊긴다) int currentTick = System.Environment.TickCount & Int32.MaxValue; // 만약에 경과한 시간이 1/30 초볻 작다면 continue; 한다. if(currentTick - lastTick < WAIT_TICK) continue; lastTick = currentTick; #endregion // 1. 입력 // 2. 로직 // 3. 렌더링 Console.SetCursorPosition(0, 0); for(int i = 0; i < 25; i++) { for(int j =0; j< 25; j++) { Console.ForegroundColor = ConsoleColor.Green; System.Console.Write(CIRCLE); } System.Console.WriteLine(); } } } } }
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
객체지향과 절차지향의 구조적(?) 차이점 및 기타질문
아아앗... 질문하구 보니 다음 강의에서 질문 드렸던 내용들이 나오네요... 그래두 질문은 남겨둡니다. 답변 미리 감사드립니다^^ 안녕하세요! 오늘도 강의 잘 보았습니다. 항상 기본적인 질문만 드리는 것 같아 민망하네요... 강의 보고 객체지향, 절차지향의 개념을 처음 알게 돼서 정확히 알고 싶어서 검색을 해보았는데 해결이 안 되는 부분이 있어서 질문을 남깁니다. 1. C 계열 언어는 절차지향 언어이다 혹은 절차지향 언어에 가깝다는 검색 결과가 많았는데, 이러한 C 언어에서 객체지향 프로그래밍을 할 때 이점이 있나요? C 언어가 절차지향 언어라면 객체지향을 사용하는 건 약간 목적이나 기능을 거스르는? 것이 아닌가 하는 의문이 들어서요. 2. 절차지향, 객체지향에 대한 개념적인 차이는 어느정도 이해가 되었는데 코드 구현상에서 그 차이를 잘 모르겠습니다. 선생님이 보여주신 class Knight에 knight의 속성을 넣어서 모듈화 한 것도 이전 강의에서 사용했던 것과 어떻게 다른지 크게 와닿지 않았습니다. 예를 들어서 지난 강의에서 struct를 사용해서 모듬세트를 만들어준다고 하셨는데 그것과 class가 어떻게 다른지, 어떤 상황에서 다른지 잘 모르겠습니다. 검색을 해보았을 때도 접근방법, 상속참조의 차이다 라는 내용이 주를 이뤄서 이 두 개를 왜 구분해야하는가?에 대한 의문은 해결이 안 되었어요. 그리고 혹시 C# 관련 교재를 추천받을 수 있을까요? 기초적 질문을 하게 될 때마다 항상 먼저 검색을 해보곤 하는데 블로그 등으로 알아보는 게 한계가 있는 것 같아서요. 책을 통해서 좀 더 공부하고 싶은데 좋은 교재가 있다면 추천받고 싶습니다! 마지막 질문으로 게임학원을 다니셨다고 했는데 학원을 다니는 것이 좋은 선택이었다고 생각하시는지 궁금합니다. 선생님 강의도 정말 훌륭하지만(제가 인프런에서 들어본 것중에 제일 좋았어요) 혼자서 공부하는 게 힘들 때도 있어서 학원을 고민 중이거든요. 학원에 대한 평가가 워낙 갈려서 선생님 의견도 참고하고 싶어서 여쭤봅니다. 긴 질문 죄송하고, 늘 자세한 답변 감사드립니다. 좋은 하루 보내세요! ^__^