묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨홍정모의 따라하며 배우는 C++
함수 호출 로그에 대해 질문 있습니다.
지금 전문가를 위한 C++ (개정판 3판)으로 공부하고 있습니다. 이 부분에서 오류가 발생해서 구글 검색을 해봤는데도 해결을 하지 못했습니다.이 예제를 실행시키려면 어떠한 문법을 써야 하나요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
PostDetailPage params 이 어디서 온건가요?
async function PostDetailPage({ params }: any) { const post = await getPost(params.id); return ( <div> <h1>Posts/{post.id}</h1> <div> <h3>{post.title}</h3> <p>{post.created}</p> </div> </div> ); }PostDetailPage 에서 params을 콘솔에 출력하면 id값이 나오는거는 주소에서 받아오는건가요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
리얼타임 데이터베이스의 저장하기,불러오기 부분은 완성 코드가 없나요? ㅠ
package com.android.diet_memo import android.app.DatePickerDialog import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.widget.Button import android.widget.DatePicker import android.widget.EditText import android.widget.ListView import androidx.appcompat.app.AlertDialog import com.android.diet_memo.databinding.ActivityMainBinding import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.ValueEventListener import com.google.firebase.database.ktx.database import com.google.firebase.ktx.Firebase import java.util.Calendar import java.util.GregorianCalendar class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding // private lateinit var 와 lazy를 쓰는경우 정확히 어떤차이? val dataModelList = mutableListOf<DataModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val database = Firebase.database val myRef = database.getReference("시발 개좆같은 fianl") val listView = findViewById<ListView>(R.id.mainLV) val adapter_list = ListVeiwAdapter(dataModelList) listView.adapter = adapter_list myRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { for (dataModel in snapshot.children) { Log.d("Data", dataModel.toString()) dataModelList.add(dataModel.getValue(DataModel::class.java)!!) } Log.d("DataMoel",dataModelList.toString()) } override fun onCancelled(error: DatabaseError) { TODO("Not yet implemented") } }) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.writebtn.setOnClickListener { val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null) val mBuilder = AlertDialog.Builder(this) .setView(mDialogView) .setTitle("운동 메모 다이얼로그") val mAlertDialog = mBuilder.show() val DateSelectBtn = mAlertDialog.findViewById<Button>(R.id.dateSelectBtn) var dateText = "" //dateText 버튼은 변경되니까 var로 DateSelectBtn?.setOnClickListener { val today = GregorianCalendar() val year: Int = today.get(Calendar.YEAR) val month: Int = today.get(Calendar.MONTH) val date: Int = today.get(Calendar.DATE) val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener { override fun onDateSet( view: DatePicker?, year: Int, month: Int, dayOfMonth: Int ) { Log.d("Main", "${year}, ${month + 1}, ${dayOfMonth}") DateSelectBtn.setText("${year}, ${month + 1}, ${dayOfMonth}") dateText = "${year}, ${month + 1}, ${dayOfMonth}" // dateText를 이런식으로 묶음 } }, year, month, date) dlg.show() } val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn) saveBtn?.setOnClickListener { // Write a message to the database val healMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString() val database = Firebase.database val myRef = database.getReference("final") val model = DataModel(dateText, healMemo) //계속 이런식으로 껍데기를 만드는걸 연습해야할듯,,? myRef.setValue(model) myRef .push() .setValue(model) mAlertDialog.dismiss() } } } }리스트뷰 생성후 어뎁터 연결하는부분 따라치고나서부터 알수없는 에러로,,연결이 되지않습니다42번째 라인dataModelList.add(dataModel.getValue(DataModel::class.java)!!) 부분에서 오류가 났다고 gpt선생님이 그러시는데.. 잘모르겠습니다.package com.android.diet_memo data class DataModel ( val date:String = "", val memo:String = "" )package com.android.diet_memo import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.TextView class ListVeiwAdapter(val List : MutableList<DataModel>) : BaseAdapter() { override fun getCount(): Int { return List.size } override fun getItem(position: Int): Any { return List[position] } override fun getItemId(position: Int): Long { return position.toLong() } override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { var convertView = convertView if (convertView == null) { convertView = LayoutInflater.from(parent?.context).inflate(R.layout.listview_item,parent,false) } val date = convertView?.findViewById<TextView>(R.id.ListViewDateArea) val memo = convertView?.findViewById<TextView>(R.id.ListViewMemoArea) date!!.text = List[position].date memo!!.text = List[position].memo Log.d("Test","Date: ${date.text},Memo: ${memo.text}") return convertView!! } }package com.android.diet_memo import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Handler import android.util.Log import android.widget.Toast import com.android.diet_memo.databinding.ActivityMainBinding import com.android.diet_memo.databinding.ActivitySplashBinding import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase import java.lang.Exception class Splash : AppCompatActivity() { private lateinit var binding: ActivitySplashBinding private lateinit var auth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySplashBinding.inflate(layoutInflater) setContentView(binding.root) auth = Firebase.auth try { Log.d("SPLASH", auth.currentUser!!.uid) Toast.makeText(this,"원래 비회원 로그인이 되어있는 사람입니다",Toast.LENGTH_LONG).show() // splash 부분 Handler().postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() },3000) // splash 부분(끝) } catch (e: Exception) { Log.d("fxxk", "회원가입 시켜줘야함") //실패하고, 회원가입 시켜줘야하므로 catch 부분에 예외처리를 해주고,익명로그인 창으로 뜨게한다. auth.signInAnonymously() //firebase 익명로그인 하는 코드 시작부분 .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Toast.makeText(this,"비회원 로그인 성공", Toast.LENGTH_LONG).show() // splash 부분 Handler().postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() },3000) // splash 부분(끝) } else { // If sign in fails, display a message to the user. Toast.makeText(this,"비회원 로그인 실패", Toast.LENGTH_LONG).show() } } } } }클래스파일 전체입니다
-
미해결스프링 배치
processor 분기 처리
안녕하세요 강의 도움이 많이되고 있어 감사말씀드립니다.제가 FCM을 사용한 그룹 알림 발송 배치 API 를 개발 중에 있습니다. processor 에서 그룹에 속한 알림에 대해서 fcm 전송을 하는데 trcy catch 로성공일 경우 알림성공 업데이트를 위한 객체를 생성하고실패일 경우 알림실패 업데이트를 위한 객체 따로따로 생성하고 있습니다.그 다음으로 writer 로 던집니다. 문제는 stepListener 에서 총 몇개에서 총 몇건 전송했고, 성공, 실패 로깅하는 방법을 모르겠습니다.또 stepListener 에서 모두 다 실패했으면 알림 그룹의 상태 값을 전송 실패 그 외 성공으로 변경하는 로직이 있습니다. 추가 +일단 StepSynchronizationManager 를 사용해서 ExecutionContext 에 저장해서 stepListener 에서 아래와 같이 사용하고 있습니다. 올바르게 사용한건지 궁금합니다.int successCount = stepExecution.getExecutionContext().getInt("successCount", 0); int failureCount = stepExecution.getExecutionContext().getInt("failureCount", 0);
-
미해결ElasticSearch Essential
7번째 강의에서 Token과 Term은 다른 건가요??
공부하다보니 Token, Term이라는 단어를 보게 되었는데요 Token : 문자열을 쪼갠 키워드Term : Token이 필터되고 역색인에 저장된 키워드 이렇게 정리하는게 맞을까요??
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
라우팅 테이블 추가 후 바로 ping이 안되는 원인
안녕하세요. 수업 들으면서 궁금한 점이 있어서 질문을 남겨놓습니다. RIPv1, RIPv2 강의 중에 라우팅 설정이 끝나도 처음 한번은 ping이 안될 수 있다고 말씀해주셨는데, 어떤 사유로 처음에 안되는 건지 알 수 있을까요?
-
해결됨시스템엔지니어가 알려주는 리눅스 실전편 Bash Shell Script
DB 백업 스크립트 실행 오류
[스크립트 경로][root@cent2 backup]# pwd /root/backup [root@cent2 backup]# [root@cent2 backup]# ls db_backup.sh [스크립트 파일 내용]#!/bin/bash ## 변수 설정 HOST="$(/usr/bin/hostname)" LOG="/tmp/backup.log" PUSH="/root/monitor/telegram_example.sh" DATE="$(/bin/date +%Y.%m.%d)" # 백업할 디렉토리/파일 지정 BAK_LIST="/etc/my.cnf.d" # 백업 디렉토리 BAK_PATH="/mnt/BACKUP/${HOST}" # 백업 파일명 BAK_FILE="${BAk_PATH}/${DATE}_${HOST}.tgz" # DB백업디렉토리 DB_BAK_PATH="/root/backup/xtrabackup_backupfiles" # DB백업파일명 DB_BAK_FILE="${BAK_PATH}/${DATE}_${HOST}_DB.tgz" ## 스토리지에 마운트 /usr/bin/mount /mnt ## 로그파일 생성 /usr/bin/touch "${LOG}" ## 백업 디렉토리 확인 if [ -e "${BAK_PATH}" ] then # 백업디렉토리가 존재한다면 /bin/echo "백업디렉토리가 존재합니다." else /usr/bin/mkdir -p "${BAK_PATH}" fi ## --- 로그기록 시작 { /bin/echo /bin/echo "===== 백업 시작 시각 : " /bin/date /bin/echo ## 백업 # DB dump /usr/bin/mariabackup \ --backup \ --no-lock \ --target-dir="${DB_BAK_PATH}" # DB apply logs /usr/bin/mariabackup \ --prepare \ --target-dir="${DB_BAK_PATH}" # p: 퍼미션 유지 P: 절대경로 유지 /usr/bin/tar czpPf "${BAK_FILE}" ${BAK_LIST} # db백업 디렉토리 압축 /usr/bin/tar czpPf "${DB_BAK_FILE}" ${DB_BAK_PATH} # 백업파일 정보 NAME="$(/usr/bin/ls -al "${BAK_FILE}" | awk '{print $9}')" SIZE="$(/usr/bin/ls -al "${BAK_FILE}" | awk '{print $5}')" /bin/echo "===== 백업파일 정보: " /bin/echo " | 파일명 : ${NAME} " /bin/echo " | 파일크기 : ${SIZE}Byte " /bin/echo # DB 백업파일 정보 NAME="$(/usr/bin/ls -al "${DB_BAK_FILE}" | awk '{print $9}')" SIZE="$(/usr/bin/ls -al "${DB_BAK_FILE}" | awk '{print $5}')" /bin/echo "===== DB 백업파일 정보: " /bin/echo " | 파일명 : ${NAME} " /bin/echo " | 파일크기 : ${SIZE}Byte " /bin/echo # 백업종료시각 /bin/echo /bin/echo "===== 백업 종료 시각 : " /bin/date /bin/echo }>|"${LOG}" ## --- 로그기록 끝 ## 스토리지에 언마운트 /usr/bin/umount /mnt ## 텔레그램으로 백업 로그를 전송 "${PUSH}" "${HOST}" "$(/usr/bin/cat "${LOG}")" ## 로그파일 삭제 /usr/bin/rm -f "${LOG}" [발생 에러][root@cent2 backup]# [root@cent2 backup]# ./db_backup.sh 백업디렉토리가 존재합니다. [00] 2023-10-17 13:55:08 Connecting to MySQL server host: localhost, user: not set, password: not set, port: not set, socket: not set [00] 2023-10-17 13:55:08 Failed to connect to MySQL server: Access denied for user ''@'localhost' (using password:NO). /usr/bin/mariabackup based on MariaDB server 10.3.35-MariaDB Linux (x86_64) /usr/bin/mariabackup: Can't change dir to '/root/backup/xtrabackup_backupfiles/' (errno: 2 "No such file or directory") [00] 2023-10-17 13:55:08 can't my_setwd /root/backup/xtrabackup_backupfiles/ /usr/bin/tar: /root/backup/xtrabackup_backupfiles: Cannot stat: No such file or directory /usr/bin/tar: Exiting with failure status due to previous errors [root@cent2 backup]# [root@cent2 backup]# 에러가 발생하는데 어디를 수정해야할까요?
-
미해결FreeRTOS 프로그래밍
섹션 5 <커널소스분석-태스크 스택메모리> 질문 드립니다!
안녕하세요 강사님 :) 1:12 부근에서 "ARM은 메모리를 높은 주소부터 낮은 방향으로 쓴다" 고 말씀하셨는데, 이것은 리틀 엔디안 방식을 이용한다는 것을 의미하는 것일까요??그리고 맞다면 인터넷에 검색해보니 ARM은 리틀 엔디안 or 빅 엔디안 중 선택해서 사용한다고 나와 있는 것을 봤는데 모든 ARM processor가 리틀 엔디안을 쓰는 것이 맞을까요..??
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
무한스크롤 관련 내용입니다.
안녕하세요! 다른분꺼 내용 보고 해답을 찾을 뻔 했다가 무한스크롤이 50번째에서 멈추는 현상을 발견했습니다 ㅠㅠ 저는 크롬 브라우저를 띄우지 않고 진행하니까 500개까지 크롤링이 되었는데, 크롬 브라우저를 띄우고 진행하고싶은데 어떻게 해결해야할까요,,? 로딩시간 2초정도 할당했는데 진행이 안되서 질문 남깁니다!from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import urllib.request # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager import time import pyautogui import os # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 크롬창 안뜨게 함 chrome_options.add_argument('--headless') # headless 모드 활성화 chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화 # Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회 chrome_options.add_argument("--user-agent=Mozilla/5.0") # 불필요 메세지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 드라이버 업데이트 service = Service(executable_path=ChromeDriverManager().install()) # 옵션 적용 browser = webdriver.Chrome(service=service, options=chrome_options) keyword = pyautogui.prompt('검색어를 입력하세요.') # 폴더 만들기 if not os.path.exists(f'크롤링/심화2/{keyword}모음'): os.mkdir(f'크롤링/심화2/{keyword}모음') # path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글 path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}' # 네이버 browser.implicitly_wait(5) browser.maximize_window() browser.get(path) before_h = browser.execute_script("return window.scrollY") # 무한스크롤 while True: time.sleep(2) # 맨 아래로 스크롤을 내림 browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출 if after_h == before_h: break # 스크롤 높이 업데이트 before_h = after_h # 이미지 태그 추출 imgs = browser.find_elements(By.CSS_SELECTOR, '._image._listImage') for i, img in enumerate(imgs, 1): # 각 이미지 태그의 주소 추출 link = img.get_attribute('src') # 이미지 저장 urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png') print(f'img {i}개: {link}') print('\nDvlp.H.Y.C.Sol\n')
-
해결됨코딩테스트 [ ALL IN ONE ]
혹시 그리디 알고리즘은 안하는건가요?
제가 놓친건진 모르겠는데 그리디가 목차에 없어서 궁금합니다!
-
해결됨구글 애널리틱스 GA4 완전 정복 실무 마스터 클래스
세션세그먼트관련 질문
세션세그먼트에 '국가ID가 미국과 정확히 일치'하는 경우와 '국가 ID가 미국과 정확히 일치하지 않는'경우 두가지 세그먼트를 만들었는데 두 세그먼트사이에 중복값이 존재합니다. 제가 이해한 바로는세션의 국가 ID가 미국인 경우 세션이 시작될 때 IP 주소가 미국입니다.세션의 국가 ID가 미국이아닌 경우 세션이 시작 될 때 IP 주소가 미국이 아닙니다. 그런데 어떻게 미국세션과 미국이외의 국가 세션에 중복값이 나올 수 있는지 모르겠습니다. 미국 유저 = 항상 IP가 미국이었던 유저미국 외유저 = 한번이라도 IP가 미국이 아니었던 유저미국 세션 = 유저가 구매한 당시 세션이 미국인 경우미국 외 세션 = 유저가 구매한 당시 세션이 미국이 아닌경우 이렇게 이해했는데 제가 어떤점을 잘못 이해한걸까요?
-
미해결Redux vs MobX (둘 다 배우자!)
섹션 3 mobx autorun 관련 질문입니다.
const state = observable({ name: "zero", age: 28, married: false, }); autorun(() => { console.log("autorun : " + state.name); }); reaction( () => state.name, () => { console.log("reaction : name changed"); } ); runInAction(() => { state.name = "nureongi"; state.age = 26; }); const action1 = action(() => { state.married = true; }); const action2 = action(() => { state.married = false; }) action1(); action2(); /** autorun : zero autorun : nureongi reaction : name changed **/안녕하세요! 강의 잘 듣고 있습니다. 제가 궁금한 것은 강의에서 autorun은 observable에 담긴 모든 state가 변경될 때 마다 실행된다고 하셨는데실제 실험해보니 결과가 조금 다르게 나온 것 같았습니다.그래서 확인해보니 다음과 같이 동작한다는 사실을 알게 되었습니다. autorun이 정의될 때 한 번 실행autorun 함수 내부에서 참조하고 있는 observable state가 변경될 때 실행 아마 버전이 업데이트 되면서 바뀐 것 같은데 제가 알게 된 사실이 맞을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
private method 테스트문의
안녕하세요. 좋은 강의 잘 듣고 있습니다 ^^ 강의에서 private method 테스트를 해야되는 상황이라면객체를 분리해야되는 상황이라고 말씀을 주셨는데실무에서는 꼭 분리를 해야되는 상황이 아닐수도 있을텐데1)실무에서는 private method 에 대한 테스트는 거의 작성안하나요? 2)레거시 프로젝트를 맡았을때 public method 에 대한 테스트를 작성하기에는 많은 작업이 필요하다면 private method 라도 테스트 코드를 작성하는게 좋을거 같은데 이런 경우도 작성을 안하나요?3) private 함수를 변경하는경우 해당함수만 테스트하고 싶을거 같은데 이런경우는 어떻게하나요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
실제 시험에서 EDA 수행
코드 답안 작성 시, 암묵적으로 EDA 과정을 거치게 되는데 모의고사 3에서의 EDA는 head(), value_counts(), isnull().sum(), describe()를 사용하여 탐색적 분석을 하게 되는데 이 함수를 실제 시험에서 반드시 써야하는지 궁금합니다(isnull()sum()은 결측치가 있는지 확인하는 함수이니 무조건 사용하여야 할것 같고 value_counts나 describe는 쓰지 않아도 될 것같은 생각입니다)
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
주의요함 data;
잘되다가 여기서 멈춰서 error가 뜨네요
-
미해결비전공 기획자 및 관리자를 위한 IT 필수 지식
강의 교안
안녕하세요!비전공자로 강의 잘 듣고 있습니다 감사합니다!혹시 강의 교안을 받을 수 있을까 해서 글 남깁니다.seunghunyea@gmail.com감사합니다!
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
8. 팰린드롬(replaceAll 정규식이용): 기업 코딩테스트를 볼 때 정규식을 사용해야 하나요?
8. 팰린드롬(replaceAll 정규식이용) 해당 문제를 저는 정규식을 사용하지 않고, 풀었습니다.정규식을 잘 모르기도 하고, 정규식도 제대로 알려면 공부해야 할 범위도 많아도 생각합니다. 혹시 기업 코딩테스트를 볼 때 무조건 정규식을 사용해야 하는 문제가 빈번하나 궁금합니다!
-
해결됨스프링 핵심 원리 - 기본편
Test 코드 작성 시에는 왜 import 문이 없나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의 잘 보고 있습니다.문득 코딩하다 궁금한 점이 컨트롤러, 서비스, 레포지토리 등을 작성할 땐 import 문을 사용하여 클래스를 사용하는데TEST 코드를 작성할 땐 왜 import 문을 작성하지 않아도 클래스를 사용할 수 있는 건가요?
-
해결됨Google 공인! 텐서플로(TensorFlow) 개발자 자격증 취득
슬랙 초대 메일 부탁드립니다.
안녕하세요.cjdxla1004@gmail.com으로 슬랙 초대 메일 요청 드립니다. 감사합니다.
-
미해결FreeRTOS 프로그래밍
섹션 4 <소스코드 분석 - printf, fflush>1:52 부근에서 질문드릴 것이 있습니다!
안녕하세요 강사님! 섹션 4 <소스코드 분석 - printf, fflush>1:52 부근에서 질문드릴 것이 있습니다! 강의에서 설명해주신 것을 저는 fflush() 를 주석하면 각 Task에서 UART 통신을 통해 전송한 문자들이 바로 flush되지 않고 버퍼에 쌓이다가 buffer 한계량을 초과할 때마다 출력이 되므로 우리가 생각했던대로인 'a'가 연속적으로 절반 출력되고, 'b'가 연속적으로 절반 출력되는 것이 반복되는 결과가 발생한다고 말씀하신 것으로 이해했습니다.그러나 제가 이해가 안되는 것이 Task1, 2는 우선순위가 같고, 따라서 Task1 한 번 실행('a' 출력) -> Task2 한 번 실행('b' 출력) -> Task1 한 번 실행('a' 출력) ... 이 과정이 반복되어서 ababababababab가 출력되어야 하는 것이 아닌가요..??