묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2 - L 어디가 틀린건지 모르겠습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.http://boj.kr/479470df1029497d9df3d10d7ce3e633방식은 현재 골 넣은 시간을 입력 받고 원래 이기고 있던 상황이거나 상대가 골 넣었는데도 아직도 이기고 있는 상황에서 이전 시간과 현재 시간의 차이 만큼 팀의 승리 시간에 추가하는 방식입니다.두 팀의 골이 같아진 경우에는 마지막으로 골을 넣은 팀의 상대 팀의 승리 시간을 추가했습니다.마지막으로는 경기 종료 48분까지 이기고 있는 팀의 시간을 추가해서 출력했는데 예제 3번까지는 맞게 나오는데 제출해보면 틀리다고 나옵니다. 어디가 틀린 걸까요?
-
해결됨김영한의 실전 자바 - 기본편
이부분이 이해가 안갑니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Pay pay = PayStore.findPay(option)뭐라고 말을 질문을 해야할지 모르겠지만 이 코드가 왜 되는건지 이해가 잘안됩니다.PayService 클래스에서 Pay pay = PayStore.findPay(option) 이 코드가 되는 이유가 PayStore 클래스가 public이기 떄문에 불러올수있는건가요? public은 같은패키지 안에서 공유 가능하기떄문에 저런 코드가 되는거죠? ㅠㅠ 질문을 이해하셨느지 모르겠지만 이 부분이 왜 되는지 이해가 안돼요
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
암시적 생성자 관련
암시적 복사 생성자는 암시적 기본 생성자와는 달리 명시적으로 기타 생성자를 만들어도 그대로 작동이 잘 되는 것 같은데문법 상으로 원래 이런 것인가요?그리고 다른 객체들의 경우 return 0; 이후에 소멸자를 호출하고 있지만Knight k5;k5 = (Knight)1;의 k5는return 0; 이전에 소멸자가 호출되는 것 같은데 이유가 무엇인가요?
-
해결됨스프링 핵심 원리 - 기본편
강사님께서 말씀하시는 "클라이언트 코드"는 무엇인가요 ??
클라이언트 코드라고 자주 언급해주시는데, 사용자와 관련되어 일하는 코드를 전반적으로 일컫는 말일까요 ???
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Query 사용 시 연관테이블은 order by 가 불가한가요?
@Query("SELECT t From Team t join Fetch t.member m ORDER BY m.name desc")예를 들어 이런 식으로 Fetch join을 이용해서 연관테이블 리스트를 가져올 때에 정렬해서 가져오고 싶습니다.검색 등을 통해 해결해보려 했지만 방법을 모르겠네요 ㅠㅠ 만약 @Query가 안된다면 다른 방식으로 가져오는 방법이 있을까요?
-
해결됨[임베디드 입문용] 임베디드 개발은 실제로 이렇게 해요.
안녕하세용 오튜브님 서버 개발자 취준생임다
고졸 비전공자고컴퓨터와 큰 연관 없이 살다언제부턴가 환경 개선에 관심 가지다보니서버 개발에도 관심 가지게 되었고지금은 취업 준비하고 있습니다 앞으로 웹도 개발하고앱도 개발하고 (시간나면)짬밥 쌓일 때 운좋게 로봇 인터페이스가 나오면로봇 개발도 해서 서로 시스템 통신할 수 있지 않을까라는 막연한 이유로그 때를 위한 재료로써 오제이 튜브님 임베디드 강의 구매했슴다지금 임베디드로 취업하기엔 솔직히 빡셀 것 같단 생각에 ㅎㅎ.. 정답일진 모르지만 불경기에 주식같은거 살면서 가만있으니 공부 열심히 해서 장학금도 받고 훌륭한 기계들도 만들어오시고 결혼해서 착실히 사는 분 본받아서 잘 살아보자 라는 맘에 깔짝깔짝 곁눈질 하고 다니려고 합니다 오제이튜브님 오늘도 화이팅 ^^
-
해결됨[왕기초] 후디니 게임 이펙트 만들기
warngle 기초 지식 2 랑 warngle 기초지식3 내용이 똑같아요
영상길이도 내용도 똑같은거같은데 오류인지 의도하신건지 궁금합니다
-
미해결스프링 핵심 원리 - 기본편
DIP와 관련된 어노테이션
강의 : 스프링 핵심원리 - "관심사의 분리" 현재 스프링 안쓰고 자바로만 하고 계시니 강의에는 안맞을 수도 있는데 궁금해서 질문 드립니다 ...DIP지키려고 객체생성 안해주고 인터페이스들을 선언만 해주고, 생성자 주입으로 마침내 DIP를 지킬 수 있다 이렇게 이해를 했습니다.여기서 더 나아가서 생성자도 쓰기 귀찮으니 @RequiredArgsConstructor쓰면 아래 코드에서 생성자 부분 안쓰고도 원래 의도대로 DIP지킬 수 있는거죠???
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
아니 강사님
이렇게 떠먹어도 되나..? 싶은 느낌이 자꾸 드는데요로드맵 다 들으면 강사님 없이 어떻게 살죠..?어쩔 수 없이 반복해야 되는 건가요..? :D오늘도 화이팅 ^^
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
EF사용시 async사용
EF 변경사항을 저장할 때 SaveChangeAsync가 아닌 SaveChange를 사용하게되면 해당 쓰래드는 blocking이 발생할텐데 괜찮나요? 제 추측으론EAP 기반 IO 통신이기때문에 어차피 패킷요청마다 개별의 쓰래드에서 처리가되니 굳이 async를 사용안해도 다른 패킷(Thread)에 대한 blocking이 이러나지 않으니까 그냥 SaveChange를 사용한건가? 라고 생각하긴 했는데 선생님의 답변을 듣고싶습니다.
-
미해결
파이썬 프로그램
파이썬에서 커널을 설정 해야 하는데 화면에 커널이 없습니다. 어떻게 커널를 실행 하난요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
커리큘럼 질문드립니다
취업목적이 아닌 개인 사업용으로 모바일 앱개발을 할 예정인데요 커리큘럼을 어떻게 가져가면 좋을지 문의 드립니다. 프로그래밍에 대한 지식은 전무합니다 (자바의정석 챕터 8까지 가볍게 읽어본게 전부입니다)
-
미해결
급합니다 ㅠㅠ 도와주십쇼 고수님들 리액트네이티브입니다.
리액트네이티브에서 카카오로 로그인하는건 되는데 카카오로 회원가입하려는게 안됩니다.카카오 개발자도 해서 테스트용 리다이랙트 유알아이랑 네이티브 앱 발급키도 받았씁니다.현재 어플을 만들고 있는 중이거든요 프로젝트로 ㅠ근데 카카오 로그인은 됩니다.근데 카카오 회원가입화면이 이 밑에 사진ㅊㅓ럼 적용되게 하고 싶은데 잘 안되네요 도와주십시오뭐가 문제인지 맨첫번쨰 코드는 App.js 코드이고 2번쨰 세번쨰 코드는 2가지로 구현해봣는데 안되는 코드들입니다 ㅠㅠㅠ import React, { useState } from 'react'; import { StyleSheet, View } from 'react-native'; import KakaoLogin from './component/KakaoLogin'; import Main from './component/Main'; import Sign from './component/Sign'; import KakaoSign from './component/KakaoSignUp'; import Superlogin from './component/Superlogin'; import { name as appName } from './app.json'; import { AppRegistry } from 'react-native'; // 각 페이지 컴포넌트를 렌더링하는 App 컴포넌트 const App = () => { const [currentPage, setCurrentPage] = useState('Main'); // 현재 페이지에 따라 해당 컴포넌트를 렌더링하는 함수 const renderCurrentPage = () => { switch (currentPage) { case 'Main': return <Main onSignUp={() => setCurrentPage('Sign')} onKakaoLogin={() => setCurrentPage('KakaoLogin')} />; case 'Sign': return <Sign onSignUpComplete={() => setCurrentPage('Main')} onKakaoSignUp={() => setCurrentPage('KakaoSignUp')} />; case 'KakaoLogin': return <KakaoLogin />; case 'KakaoSignUp': return <KakaoSign onSignUpComplete={() => setCurrentPage('Main')} />; case 'super': return <Superlogin />; default: return <Main onSignUp={() => setCurrentPage('Sign')} onKakaoLogin={() => setCurrentPage('KakaoLogin')} />; } }; return <View style={styles.container}>{renderCurrentPage()}</View>; }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', }, }); // App 컴포넌트를 앱 레지스트리에 등록 AppRegistry.registerComponent(appName, () => App); export default App;import React, { useEffect, useState } from 'react'; import { Button, Platform } from 'react-native'; import * as AuthSession from 'expo-auth-session'; import * as Random from 'expo-random'; import { StyleSheet } from 'react-native'; const useProxy = Platform.select({ web: false, default: true }); const redirectUri = AuthSession.makeRedirectUri({ useProxy }); export default function App() { const [request, response, promptAsync] = AuthSession.useAuthRequest( { clientId: '', redirectUri, responseType: 'code', scopes: ['profile', 'account_email'], extraParams: { response_type: 'code', }, }, { useProxy } ); useEffect(() => { if (response?.type === 'success') { const { code } = response.params; // TODO: 이 코드를 백엔드로 전송하여 액세스 토큰과 리프레시 토큰을 교환하세요. const fetchAccessToken = async () => { try { // 백엔드 엔드포인트에 맞게 URL을 수정해주세요. const response = await fetch('YOUR_BACKEND_ENDPOINT', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ code }), }); const data = await response.json(); // 성공적으로 토큰을 받아온 경우 console.log(data); // Or perform other actions based on the received tokens } catch (error) { console.error(error); } }; fetchAccessToken(); } }, [response]); return ( <Button disabled={!request} title="카카오 계정으로 회원가입" onPress={() => { promptAsync(); }} /> ); } const styles = StyleSheet.create({ container: { flex: 1, marginTop: 24, backgroundColor: '#fff', }, });KakaoSignup.jsimport React, { useEffect } from 'react'; import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'; import * as AuthSession from 'expo-auth-session'; import * as WebBrowser from 'expo-web-browser'; // Make sure you complete the authentication session if the app is opened via a deep link WebBrowser.maybeCompleteAuthSession(); const KakaoSignUp = () => { // Replace 'YOUR_KAKAO_REST_API_KEY' with your actual Kakao REST API Key // For production, replace 'yourapp://redirect' with your actual redirect URI const [request, response, promptAsync] = AuthSession.useAuthRequest({ clientId: '', redirectUri: AuthSession.makeRedirectUri({ useProxy: false, native: ' http://localhost:8082/KakaoSign', // Custom URI scheme for standalone apps }), responseType: 'code', scopes: ['profile', 'account_email'], extraParams: { response_type: 'code', }, }, { useProxy: false }); useEffect(() => { if (response?.type === 'success') { const { code } = response.params; console.log('Authorization Code:', code); // Send the authorization code to your backend server to exchange it for an access token // and then proceed with user sign-up or sign-in process } }, [response]); // Render a button that, when pressed, initiates the OAuth flow return ( <View style={styles.container}> <Text style={styles.header}>MealJoy 회원가입</Text> <TouchableOpacity disabled={!request} onPress={() => { promptAsync(); }} style={styles.button} > <Text style={styles.buttonText}>카카오 계정으로 회원가입</Text> </TouchableOpacity> </View> ); }; // Define your styles for the components const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20, backgroundColor: '#fff', }, header: { fontSize: 22, fontWeight: 'bold', marginBottom: 20, }, button: { backgroundColor: '#FEE500', padding: 15, borderRadius: 10, marginVertical: 10, }, buttonText: { color: '#000', fontWeight: 'bold', }, }); export default KakaoSignUp;
-
해결됨CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
싱글톤 패턴을 구현하는 방법중 첫번째에 관해 질문 있습니다.
안녕하세요 큰돌님싱글톤 패턴을 구현하는 방법중 첫번째인 단순한 메서드 호출에 관해 질문이 있습니다.자바의 경우 단순한 메서드 호출을 통해 싱글톤 패턴 생성여부를 확인할때 멀티스레드 환경에서 인스턴스가 2개 이상 만들어질수 있다고 하셨는데싱글스레드 기반의 자바스크립트를 사용하여 싱글톤 패턴을 구현하는경우에는 1번의 방법만으로 패턴 구현하는것이 충분한가요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
Switch문에서 비교하는 값이 String이어도 되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? -> 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? -> 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? -> 예[질문 내용]Switch 문에서 비교하는 값이 String이어도 되나요?앞선 강의에서 String 외 다른 타입들은 == 을 통해서 두 값이 같은지 비교하지만,String은 .equals 를 통해 값을 비교해주신다고 하셨는데switch문에서 case 별로 분기할 때, String 값이 들어가면 비교를 .equals 로 하도록 되는지가 궁금합니다. 수업을 듣다가 궁금해져서 아래와 같이 실습해보았는데결과는 제대로 나왔습니다. 그런데.. String 비교는 ==로 했을 때 제대로 나올 수도, 아닐 수도 있다고 하셨던 것 같아서 질문 남깁니다.package condition; public class Switch4 { public static void main(String[] args) { String subject = "math"; int class_number = switch (subject) { case "art" -> 1; case "math" -> 2; case "science" -> 3; default -> 0; }; System.out.println("class_number = " + class_number); // 결과는 2로 출력 } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
M2 셋팅 관련하여 질문드립니다.
안녕하세요 선생님 알고리즘 교안 m2 초기 셋팅 관련하여 아래와 같이 질문드립니다.brew는 설치 완료 하였고 bits/stdc++.h 파일 생성에서 문제가 되는데요.아래과 같은 경로로 가서 코드 모두 복사하고 vi편집기를 빠져 나오게 되면 아래와 같이 파일 생성이 되지않습니다.이후 파일 생성이 되지 않아 다시 파일을 생성하려고 하면 스왑하라는 두번째와 같은 창이 뜨게됩니다.확인한번만 부탁드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cmd 창에서 명령어 gradlew 입력하면 이런오류가 나오는데 어떻게 해야 하나요...ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이런 오류가 나오는데 어떻게 해결해야 하나요...ㅠㅠ
-
해결됨홍정모의 따라하며 배우는 C언어
문자열 포인터와 문자열 배열의 대한 질문
안녕하세요. 11강에서 질문을 드려야 했는데 이번 강의를 보고 한번 정리하고 가고자 질문을 드리게 되었습니다.질문을 좀 더 자세하게 하기 위해 메모리 레이아웃 사진첨부를 하였습니다.const char* str = “Constant string”; // str is a modifiable lvalue. str = “Second string”; // “Constant string” = “Second String” // imposible str[0] = ‘A’; //Error char str2[] = “String in an array”; str2[0] = ‘A’; // OK이번 강의에서 나온 코드를 가지고 개념 정리를 하고 싶습니다.코드에 쓰인 문자열은 어디에 저장이 되는가?이번 강의에서 쓰인 문자열 포인터char* str = “Constant string”str = “Second string”그리고 문자열 배열char str2[] = “String in an array”여기에 쓰인 모든 문자열 “Constant string”, “Second string”, “String in an array” 은 TEXT Segment 즉 프로그램 코드에 저장이 되는 걸로 알고있습니다. 맞을까요?문자열 포인터와 문자열 배열의 차이문자열 포인터는 TEXT Segment에 저장되어 있는 문자열의 메모리 주소를 가리키는 것이다. 즉 읽기 전용에 저장되어 있기 때문에 str[0] = 'A'와 같이 수정하려 하면 OS에서 막는다.이걸 VS에서 디버깅으로 확인을 해보았습니다.먼저 const char* str = “Constant string”;을 확인 해보았습니다. str 포인터 변수가 가리키고 있는 메모리 주소를 메모리에서 찾아 보았습니다.검색을 해보니 문자열의 시작 문자 'C'의 메모리 주소를 가리키고 있으며 문자열의 끝인 g 다음엔 \0이 붙어있는 걸 확인할 수 있었습니다.여기서 str = “Second string”; 구문을 만난다면str 포인터 변수가 가리키고 있는 메모리 주소가 문자열의 시작 문자'S'의 메모리 주소를 가리키고 있는걸 확인하였습니다. 그리고 문자열의 끝인 g옆에는 \0이 붙어있는걸 확인할 수 있었습니다. 그럼 여기서 문자열 배열은 어떤 식이냐일단 문자열 포인터와 문자열 배열에서 사용한 문자열들은 TEXT Segment에 저장이 되어있기 때문에 메모리에서 보면 사용한 문자열들이 나란히 있는 걸 확인할 수 있었습니다. 하지만 디버깅을 통해 현재 문자열 배열인 str2[]의 메모리 주소를 보면 인걸 확인할 수 있었습니다. 분명 저 문자열이 저장되어 있는 메모리 주소 : 0x00007FF648499C10 이랑 전혀 틀린 주소입니다. 검색해보면 똑같은 문자열이 해당 메모리 주소에도 있는걸 확인하였습니다. 위와 같은 내용을 통해 알수 있었던 것은 프로그램 만들때 사용한 모든 문자열은 TEXT Segment(읽기전용)에 저장이 되며 문자열 포인터는 TEXT Segment에 있는 "문자"의 메모리 주소를 가리키는 것이며 문자열 배열은 스택이라는 (읽기, 쓰기전용)메모리 공간을 할당받고 TEXT Segment에서 문자열들을 복사해오기 때문에 str2[0] = 'B' 같은 수정이 가능한 것이다. 라고 이해를 하였는데 제대로 이해한게 맞을까요? 마지막으로 문자열 포인터를 사용하는 이유?마지막 질문은 제가 생각을 해보았습니다. 수정도 못하는 문자열 포인터는 왜 사용할까? 생각을 해보았는데 프로그램을 보면 분명 수정이 필요없는 고정된 문자열들을 본적이 있습니다.그런것들을 사용할 때 불필요하게 TEXT Segment에 저장이 되었다가 스택 메모리를 할당 받고 데이터를 "복사"해서 사용하면 메모리 낭비가 일어나고 어떤 행위를 하는 것 이기 때문에 불필요한 과정을 하기 때문에 이런 것들은 그냥 TEXT Segment에 저장 되어있는 문자열의 주소를 가리켜서 사용하면 메모리 절약을 할 수 있는 관점에서 사용하는 것 일까요?
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
예제 앱 만들기 - 1 에서 막히는 부분이 있습니다.
FATAL EXCEPTION: main Process: com.dk.myapplication, PID: 3250 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dk.myapplication/com.dk.myapplication.MainActivity}: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.dk.myapplication. Make sure to call FirebaseApp.initializeApp(Context) first. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4164) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at android.app.ActivityThread.main(ActivityThread.java:8893) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.dk.myapplication. Make sure to call FirebaseApp.initializeApp(Context) first. at com.google.firebase.FirebaseApp.getInstance(FirebaseApp.java:179) at com.google.firebase.auth.FirebaseAuth.getInstance(com.google.firebase:firebase-auth@@22.3.1:283) at com.google.firebase.auth.ktx.AuthKt.getAuth(com.google.firebase:firebase-auth@@22.3.1:8) at com.dk.myapplication.MainActivity.onCreate(MainActivity.kt:18) at android.app.Activity.performCreate(Activity.java:8944) at android.app.Activity.performCreate(Activity.java:8913) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4146) 이런 오류가 나오면서 앱을 강제 종료 시킵니다 ㅠㅠ해당 프로젝트 파일입니다! https://drive.google.com/file/d/1jD3oEdj2VTKqFCg4GyGs-ax2DB28uif7/view?usp=drive_link
-
미해결스프링 핵심 원리 - 기본편
질문있습니다.
[질문 내용]빈 생명주기 콜백에 대해 공부하면서 의문점이 드는게 이 라이프사이클을 활용하여 테스트를 짜는걸 일개학생이 혼자 프로젝트를 진행할때 쓸 데가 있을까요?만약 있다면 언제 사용하면 좋을까요?