묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
[4-8] 지표 정의하기 연습문제
안녕하세요 🙂 선생님!문제 풀고 올립니다. 연습문제 1.핵심 : 기능이 잘 동작되고 있는가?배너 영역배너별 클릭율(CTR)과 배너별 콘텐츠 구매전환율 (CVR) 을 확인해 본다.배너별 클릭율 (CTR)이 높다면 해당 콘텐츠를 사람들이 관심 있게 봤음을 해석할 수 있있다.배너별 콘텐츠 구매전환율(CVR)이 높다면 특정 콘텐츠에 대한 클릭에서 구매까지의 전환이 높다는 것으로 목표된 타겟에 맞춰 동작이 잘 됨을 의미한다.배너에서는 여러 콘텐츠가 노출되고 있기 때문에 어떤 영역에 관심이 많은 지 파악할 수 있다.메뉴카테고리메뉴별 클릭율 (CTR)과 메뉴별 구매전환(CVR)을 확인해 본다.한식 (한식 클릭율 CTR, 한식 구매전환율 CVR ) , 고기 (고기 클릭율 CTR, 고기 구매전환율CVR ),,등등 각각의 메뉴 아이콘별 클릭율(CTR)과 구매전환율(CVR)을 확인한다.만약, 특정 메뉴의 클릭율(CTR) 및 구매전환율(CVR)이 둘 다 너무 낮거나 높다면,해당 메뉴에 대한 운영 및 UI 히스토리를 확인해 본다.서비스 출시 후 해당 메뉴에 대해 클릭율CTR 및 구매전환CVR이 낮은 이유가 파악되지 않는다면 메뉴 순서를 변경하는 A/B 테스트를 시행한다.다른 영역 (배너 영역, 이런 음식 어때요, 동네 맛집 )의 클릭율(CTR) 및 구매전환율(CVR)을 확인한다.다른 영역에 비하여 상대적으로 메뉴 카테고리의 평균 클릭율(CTR) 및 구매전환율(CVR)이 모두 떨어진다면 다른 영역들과의 위치 변경에 대한 기획 히스토리를 파악한다.다른 영역에 비하여 상대적으로 메뉴 카테고리의 평균 클릭율(CTR) 및 구매전환율(CVR) 모두 높다면 유저들의 반응과 선택한 메뉴의 결제전환이 잘된다는 뜻으로 해석한다.이런 음식 어때요 ? / 동네 맛집카드섹션별 클릭율 (CTR) 과 카드섹션별 구매전환율(CVR) 파악한다.특정 카드섹션에 대한 클릭율 (CTR)과 구매전환율(CVR)이 너무 높거나 낮다면 메뉴 카테고리의 메뉴별 클릭율 (CTR)과 구매전환율(CVR)을 통해 메뉴에 따른 영향인 것인지 파악한다.만약 특정 카드섹션이 특정 메뉴에 따른 영향이 없이 [이런 음식 어때요] 에서만 메뉴별 클릭율(CTR)와 구매전환율(CVR)이 둘 다 높은 경우 카드 섹션 위치에 대해 고객에 대한 반응도 좋고 전환도 잘된다는 의미로 해석한다.연습문제2.핵심 : 검색기능에 만족했는가?검색하는 기능을 사용하는 사용자를 총 수(분모) 로 대비하여 여러 지표들을 정할 수 있을 것 같음.검색 기능 내 속한 기능 (필터 등) 클릭율(CTR)검색 기능을 통한 검색 화면으로의 전환율 CVR검색 기능을 통한 구매 전환율 CVR다른 영역의 클릭 했을 때의 지표들과도 비교하여 상대적으로 많이 사용하고 있는지를 확인할 수 있다.다른영역 클릭율 CTR다른 영역을 통한 검색 화면으로의 전환율 CVR다른 영역을 통한 구매 전환율 CVR검색된 화면이 노출되었을 때의 체류 시간의 비교를 통해 확인할 수 있다.검색 기능을 통해 노출된 검색된 화면의 체류시간다른 영역을 통해 노출된 화면의 체류시간부가 지표검색 행동이 유도된 (검색 기능을 1회 이상 사용한) 유저의 flow와 ,정해진 UI대로 클릭하여 사용한 (검색 기능을 한번도 클릭하지 않은 경우) 유저의 flow를 체크하여 ,구매 전환율 CVR을 비교하여 보조 지표로 사용할 수 있다.연습문제3.핵심 : 검색 기능은 잘 사용하고 있는가?검색 기능 이용 유저 중 필터영역의 CTR 사용 비중 확인 필요.필터 항목 중 어떤 항목이 많이 사용하는 지 파악하여 필터 내 항목의 위치를 변경할 수 있을 것 같음.추천순, 리뷰순, 배달이 많은 순 → 배달이 많은 순, 리뷰순, 추천순연습문제4.핵심 :배달 서비스에서 가장 중요한 지표는 무엇인가?컨포넌트를 로직트리로 그려보고 고민해본다.가장 중요한 지표유저가 하루에 유입하는 수 (DAU) 유저가 하루에 실제 주문하는 수(D_CVR) 왜? 배달 서비스를 유저를 상대로 하는 서비스이기 때문에 매출이 선행하는 지표가 가장 중요하다고 생각한다.가게와 배달 서비스에서는 각자의 매출을 올리기 위해서 가게에서는 맛과 평점을 우선시 할 것이고 배달 서비스에서는 메뉴 소개부터 주문, 결제까지 자연스러운 FLOW를 만들 것이다. 지표 상승방안현재 마케팅을 추가 진행할 수 없는 상태라면 유저가 하루에 유입 D_CVR까지 진행 시 이탈하는 고객의 수를 줄여야 한다.어느 단계에서 이탈하고 왜 이탈하는 지에 대한 분석을 하여 개선 방안을 도출한다.연습문제5.핵심 : 추천 알고리즘의 핵심지표 핵심 지표추천 시스템 적용으로 인한 매출 PV의 증가 여부새로운 추천 아이템에 대한 유저의 추천 아이템 클릭율 CTR 증가율 여부이유실제 사용자가 추천된 상품에 관심을 보이는지 직접적으로 확인 가능.알고리즘의 즉각적이 효과가 보임.따라서 즉각적인 대응이 가능함.연습문제6.핵심 : 핵심 지표 도출 유튜브에서의 여러 핵심 시청 지표 중 시청자 유지도 (Retention)이 가장 중요하다고 생각함.유지도가 높다는 것은 해당 콘텐츠가 시청자의 기대치를 충족한다는 것을 의미.시청자의 관심과 만족도를 직접적으로 반영하는 지표라 생각됨.이를 통해 콘텐츠에 대한 개선안에 대해 추가적으로 체크 가능하다.동영상의 이탈 지점 분석을 통해 참여도가 낮은 구간을 파악.시청자가 가장 관심을 보이는 부분과 이탈하는 부분을 확인할 수 있음.연습문제7.핵심 : 온보딩 퍼널 효과 파악 지표온보딩 프로세스 완료율 (Completion Rate)높은 완료율은 사용자가 온보딩이 필요하다는 것을 인지하고 있다는 것을 뜻함.낮은 완료율은 사용자가 해당 프로세스에 부담을 느끼거나 필요하지 않다는 것을 의미.리텐션율 (Retention Rate)사용자가 얼마나 잘 제품을 계속 사용하는지 보여주는 지표사용자가 제품의 가치를 잘 이해하고 있는지 보여주는 지표 온보딩을 끝까지 본 사용자의 리텐션율과 온보딩을 이탈한 사용자의 리텐션율을 비교하여 판단.
-
미해결깃헙 블로그(Github blog)로 차별화 된 나만의 홈페이지 만들기!
포스팅이 안되서 질문드립니다!
기부라는 좋은 취지에 동참하고 싶어서 인프런으로 결제해서 보고 있습니다 😃유튜브에 있는 10분만에 강의 만들기 강좌를 먼저 봐야 할 것 같아서 따라 하고 있는데, 포스팅이 되지 않습니다. 댓글을 보니 __config 파일에 published: true를 추가 하면된다고해서 추가했는데도 되지를 않습니다. 혹시 관련해서 포스팅할 수 있게 알려주실 수 있을까요?ㅠ
-
해결됨엑셀 시작하기 : EXCEL 입문 (Inflearn Original)
2.7 셀 서식 - 표시 형식(날짜)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.1900년 1월 1일부터 1로 대입되는걸 강의를 통해 알게되었습니다.실무에서 토지 지번을 자주 다룹니다.1905-1, 2105-12 ... 이런 값을 입력하면 자동으로 날짜데이터로 표시 및 실제 값 또한 날짜 데이터로 바뀌어 버립니다. 셀 서식에 어떠한 표기로도 본래의 값(지번)이 나타나지 않는데, 어떤 방법이 있을까요?
-
미해결자바 코딩테스트 - it 대기업 유제
미로의 최단거리 통로
안녕하세요 혹시 이 문제를 풀 때 꼭 dist배열을 만들어야 될까요? 제 코드를 아래 보여드립니다.바로 L를 반환하게 만들었는데 이래도 괜찮을지요? package org.youyk.inflearn.latest.sec07.Problem4; import java.util.*; class Solution1 { static int[] dx = {0,0,-1,1}; static int[] dy = {1,-1,0,0}; public int solution(int[][] board){ int answer = 0; int[][] ch = new int[board.length][board[0].length]; Queue<int[]> queue =new LinkedList<>(); int n = board.length; int m = board[0].length; queue.add(new int[]{0,0}); ch[0][0] = 1; int L=0; while(!queue.isEmpty()){ int size = queue.size(); for(int i=0;i<size;i++){ int[] poll = queue.poll(); if(poll[0] == n-1 && poll[1] == m-1){ return L; } for(int j=0;j<4;j++){ int xx = dx[j] + poll[0]; int yy = dy[j] + poll[1]; if(xx>=0 && yy>=0 && xx<n && yy<m && board[xx][yy] ==0){ board[xx][yy] = 1; queue.add(new int[]{xx,yy}); } } } L++; } return -1; } public static void main(String[] args){ Solution1 T = new Solution1(); int[][] arr={{0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 0, 0, 0}, {1, 1, 0, 1, 0, 1, 1}, {1, 1, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 0}, {1, 0, 1, 0, 0, 0, 0}}; int[][] arr3={{0, 0, 1, 1, 1, 1, 1}, {0, 0, 1, 0, 0, 0, 0}, {1, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 1, 1, 0, 0}}; int[][] arr2={{1, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 0, 0, 0}, {1, 1, 0, 1, 1, 1, 1}, {1, 1, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 0}, {1, 0, 1, 0, 1, 0, 0}}; System.out.println(T.solution(arr)); System.out.println(T.solution(arr2)); System.out.println(T.solution(arr3)); } }
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
initdb오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.그냥 상품등록 버튼 눌러서 상품을 추가할때는 정상적으로 재고수량이 나오는데 initdb로 만들어지는 샘플데이터의 재고수량(stockquantiy)의 데이터가 변경됩니다 ex(100->2)로그를 보면 item을 insert후에 자동으로 update -> 데이터가 변경.. 이유를 모르겠습니다. 프로젝트 첨부합니다 ㅜㅜhttps://drive.google.com/file/d/1p_rlIECRXz4hLxr-aB3EpVSYM-jw2TIc/view?usp=sharing
-
미해결스프링 부트 - 핵심 원리와 활용
application.properties를 프로젝트 내부에 두고 사용한다 하더라도, 여전히 이전 강의와 동일한 문제점이 있는 거 아닌가요?
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요!이전 강의(설정 데이터1 - 외부 파일)를 보면,application.properties를 외부에 두고 사용할 경우, 다음과 같은 문제점이 있다고 말씀하셨습니다."application.properties의 내용을 변경해야 하는 경우에 만약 10대의 서버를 운영 중이라면,10대의 서버에 있는 application.properties의 내용을 모두 일일이 변경해 주어야 하는 불편함이 있다." 그런데 이 문제점은 이번 강의처럼 application.properties를 프로젝트 내부에 두고 사용한다 하더라도,여전히 남아 있는 문제점 아닌가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원 목록 조회시 Whitelabel Error 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.회원 목록 클릭시 Whitelabel Error가 나오는데 정확한 이유를 모르겠습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
16번 문제
안녕하세요! 포켓몬을 제일 많이 풀어준 트레이너는 누구일까요?select trainer_id, count(status)from basic.trainer_pokemonwhere status = "Released"group by trainer_idorder by count(status) desclimit 1 이렇게 select에서 count(status) 써도 되나요...?포켓몬을 많이 풀어줬다 --> status가 released 많이 했다 이렇게 받아들였어요
-
해결됨초보자를 위한 BigQuery(SQL) 입문
12번 문제
안녕하세요!단일(하나의 타입만 있는) 타입 포켓몬 중 많은 type1은 무엇일까요? select type1, count(type1)from basic.pokemonwhere type1 is not null and type2 is nullgroup by type1order by count(type1) desclimit 10 단일 타입만 있다고 하니까 type1 is not null 도 조건에 걸어야 하지 않나요?그냥 type2 is null 만 하면 type1도 null 이고 type2 도 null 인 값이 나올 수 있잖아요!count(id)가 null 값은 안 세서 괜찮은 건가요..?정확하게 하고 싶으면 where type1 is not null and type2 is null이렇게 표현해도 될까요?
-
해결됨실전! FastAPI 입문
main.py 리로드문제
WARNING: StatReload detected changes in 'main.py'. Reloading...에러표시와 함께 웹 리로드가 안되는거같아요 delete api 작성한것 또한 스웨거 에서 확인되지않는데 혹시 해당관련 정보 받을수있을까요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
어플리케이션 실행 오류(@GeneratedValue 어노테이션 관련)
안녕하세요. 강의대로 실시간으로 따라 치면서 어플리케이션을 실행시켰는데 다음과 같은 오류가 발생했습니다. 그래서 코드를 아래와 같이 수정했는데 실행이 잘 되었습니다.어떤 이유에서 안된 것인지.. 영한님께서는 왜 성공하셨는지 궁금합니다.@GeneratedValue(strategy = GenerationType.IDENTITY)
-
미해결실전! Querydsl
gradle build 에러 발생 제발 도와주세요 ㅠㅠ
=========================저의 build.gradle 설정 ===========================plugins { id 'java' id 'org.springframework.boot' version '3.4.1' id 'io.spring.dependency-management' version '1.1.7' } group = 'study' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(23) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } =============================Hello Entity==============================package study.querydsl.entity; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Hello { @Id @GeneratedValue private Long id; }Tasks -> build -> clean 정상적으로 작동합니다.Tasks -> build -> build 실행시 에러가 발생합니다.==========================에러 코드===================================오후 11:58:17: Executing 'build --scan'... > Task :compileJava > Task :processResources > Task :classes > Task :resolveMainClassName > Task :bootJar > Task :jar > Task :assemble > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test FAILED 7 actionable tasks: 7 executed FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Users/USER/OneDrive/%EB%B0%94%ED%83%95%20%ED%99%94%EB%A9%B4/querydsl/querydsl/build/reports/tests/test/index.html BUILD FAILED in 16s Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Use defined at https://gradle.com/help/legal-terms-of-use. Do you accept these terms? [yes, no] The build scan was not published due to a configuration problem. The Gradle Terms of Use have not been agreed to. For more information, please see https://gradle.com/help/gradle-plugin-terms-of-use. Alternatively, if you are using Develocity, specify the server location. For more information, please see https://gradle.com/help/gradle-plugin-config. 오전 12:01:06: Execution finished 'build --scan'.해당 작업 파일 구글 드라이브 입니다. Onedrive 모드가 문제일수 있다해서 연결은 해제했습니다.https://drive.google.com/file/d/16tFQifUb64ZzBfhJkSc7RUHfLuFiJTjm/view?usp=drive_link 경로가 문제인가 싶어서 onedrive가 없는 C:\springtest 이렇게 파일 생성후 똑같이 해봤는데 clear 이상없고 build 실행하는데 에러코드는 안뜨지만 계속 Run 상태가 되어서 멈추니까 코드가 아래처럼 뜨네요..ㅠㅠ오전 12:47:10: Executing 'build --scan'... > Task :compileJava > Task :processResources > Task :classes > Task :resolveMainClassName > Task :bootJar > Task :jar > Task :assemble > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2025-01-14T00:47:41.902+09:00 INFO 16840 --- [querydsl] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2025-01-14T00:47:41.925+09:00 INFO 16840 --- [querydsl] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2025-01-14T00:47:41.929+09:00 INFO 16840 --- [querydsl] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. > Task :test > Task :check > Task :build BUILD SUCCESSFUL in 31s 7 actionable tasks: 7 executed Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Use defined at https://gradle.com/help/legal-terms-of-use. Do you accept these terms? [yes, no] The build scan was not published due to a configuration problem. The Gradle Terms of Use have not been agreed to. For more information, please see https://gradle.com/help/gradle-plugin-terms-of-use. Alternatively, if you are using Develocity, specify the server location. For more information, please see https://gradle.com/help/gradle-plugin-config. 오전 12:47:48: Execution finished 'build --scan'. 제발 도와주세요 ㅠㅠ 너무 힘듭니다...
-
미해결Airflow 마스터 클래스
docker desktop
안녕하세요 실습 진행 중 wsl을 이용해서 가상공간에서 작업을 진행하시는 것 같은데 도커데스크탑을 깔고 그 안에서 이미지들을 다운받는 식으로 작업을 하는 것과 차이가 있을까요?제가 알기로는 터미널에서 코드 쳐서 다운 받는 것과 도커데스크탑에서 이미지 찾아서 다운 받는 것과의 차이는 없는 걸로 알고 있어서요혹시 wsl로 작업을 하지않고 컴퓨터 두 대로 진행하려면 어떻게 해야될까요? 같은 네트워크에 있는 상태 입니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Could not find or load main class org.apache.kafka.connect.cli.ConnectDistributed 에러 해결
confluent-6.1.0\bin\windows\kafka-run-class.bat 파일 안에 rem Classpath addition for release으로 검색하셔서 밑에 코드를 넣으시면 됩니다. rem Classpath addition for LSB style path if exist %BASE_DIR%\share\java\kafka\* ( call :concat %BASE_DIR%\share\java\kafka\* )
-
미해결실전! GitHub Actions으로 CI/CD 시작하기
cloud9 이 종료되어서 진행하기가 힘듧니다.
지금 아무리해도 이제 더이상 하기가 힘듧니다.AWS가 처음이다 보니 EC2 만드는데 너무 많은 시간을 쏟고 있습니다.저는 github action 을 배우고 싶은 것이지 aws를 배울려고 하는게 아닙니다. 강의를 수정해주시던가, 아니면 어떻게 하면 될 것인지 명확한 절차를 알려주세요.
-
미해결김영한의 실전 자바 - 중급 2편
직접 구현하는 연결 리스트4 - 제네릭 도입 코드 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용] package collection.link; public class MyLinkedListV3<E> { private Node<E> first; private int size; public void add(E e){ Node<E> newNode = new Node<>(e); if (first == null){ first = newNode; } else { Node<E> lastNode = getLastNode(); lastNode.next = newNode; } size++; } //추가 코드 public void add(int index, E e){ Node<E> newNode = new Node<>(e); if (index == 0){ newNode.next = first; first = newNode; } else{ Node<E> prev = getNode(index - 1); newNode.next = prev.next; prev.next = newNode; } size++; } @Override public String toString() { return "MyLinkedListV1{" + "first=" + first + ", size=" + size + '}'; } private static class Node<E>{ E item; Node<E> next; public Node(E item) { this.item = item; } //A->B->C이런모양으로 출력하고 싶어! @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); Node<E> x = this; stringBuilder.append("["); while (x != null) { stringBuilder.append(x.item); if (x.next != null) { stringBuilder.append("->"); } x = x.next; } stringBuilder.append("]"); return stringBuilder.toString(); } } } 위 코드에서 Node는 정적 중첩 클래스로서 MyLinkedListV3에 선언돼 있습니다. static은 바깥 클래스와 독립적이고 클래스레벨에 소속돼 있어 인스턴스에 따라서 static class가 바뀌는 일은 없다고 알고 있었습니다. 그런데 여기서는 바깥 클래스의 타입 매개변수 E가 정적 중첩클래스인 Node에 영향을 주어 Node의 item의 타입을 E로 만듭니다. 그러면 E가 Integer인 MyLinkedListV3, E가 String인 MyLinkedListV3가 있을 수 있다는 것인데 타입 매개변수가 도입된 정적 중첩 클래스는 정적 변수와 다르게 인스턴스에 영향을 받을 가능성이 있다고 생각돼서 다음과 같이 실험해봤습니다.아래 코드를 실행한 결과package collection.link; public class MyLinkedListV3Main { public static void main(String[] args) { MyLinkedListV3<String> stringList = new MyLinkedListV3<>(); MyLinkedListV3<Integer> intList = new MyLinkedListV3<>(); stringList.add("a"); stringList.add("b"); stringList.add("c"); String string = stringList.get(0); System.out.println("string = " + string); System.out.println(stringList); intList.add(1); intList.add(2); intList.add(3); Integer integer = intList.get(0); System.out.println("integer = " + integer); System.out.println(intList + " = " + stringList); } } string = a MyLinkedListV1{first=[a->b->c], size=3} integer = 1 MyLinkedListV1{first=[1->2->3], size=3} = MyLinkedListV1{first=[a->b->c], size=3}이 부분을 유의 깊게 봐주세요 System.out.println(intList + " = " + stringList);위 코드를 실행하면 intList, strList를 동시에 출력해도 잘 출력이 되고 서로 독립적인 클래스가 타입만 다른 상태로 선언된 것처럼 보입니다.의문점이 또 있습니다.MyLinkedListV3<Integer> intList2 = new MyLinkedListV3<>(); //을 main에 추가하고 System.out.println(intList + " = " + stringList + intList2); //위와 같이 intList2도 출력하면 MyLinkedListV1{first=[1->2->3], size=3} = MyLinkedListV1{first=[a->b->c], size=3}MyLinkedListV1{first=null, size=0}위와 같이 타입 매개변수를 inList와 intList2가 같은 Integer인 상황임에도 링크드 리스트안의 요소들을 공유하진 않습니다. 같은 타입 매개변수를 사용하는 인스턴스들 끼리는 같은 정적 중첩 클래스를 공유하는 줄 알았는데 이것도 아닌 것 같습니다. 타입 매개변수가 적용된 정적 중첩 클래스는 정적 변수와 다르게 인스턴스마다 서로 다르게 존재하는지 여쭙고 싶습니다. 마지막 제네릭 타입 안에서 Node<E> node = new Node<>();는 되고 new E();는 안되는 이유를 생각해봤는데 맞게 생각한건지 봐주셨으면 좋겠습니다.E는 단순히 컴파일 되기 전 타입을 선언하여 해당 타입의 안정성을 보장하기 위해 E가 String으로 선언된 상황이면 String전용 Node로 만들기 위해 들어간거고 이 영향은 컴파일단계에서만 미치며 컴파일 이후에는 전부 상한의 클래스로 대체된다. 하지만 상한 클래스로 예를들어 Object라고 대체되어 어떤 메서드의 return 값이 Object로 변하는 경우라도 컴파일러가 알맞게 이전의 E타입으로 다운캐스팅 해주니 문제 없는 것이다.하지만 인스턴스 E를 "생성"하는 것은 문제가 된다. 단순히 타입을 선언하는게 아니고 인스턴스 E를 생성해서 뭔갈 한다면 예를 들어 상한이 Object이고 Object의 이름모를 하위타입의 인스턴스를 생성하면 해당 타입의 메서드, 멤버변수를 전부 활용할 수도 있다는 것인데, E가 정확히 무엇일지 몰라서 컴파일러가 상한 타입으로 퉁친 상태인데, 상한 타입보다 하위의 타입의 인스턴스 메서드를 쓸 가능성은 당연히 없애는 것이 맞기 때문에 new E();도 못쓰는 것이고 E인스턴스의 메서드, 멤버 변수 정보도 당연히 모르니까 instanceOf도 못 쓰는 것이다.라고 결론을 내렸는데 괜찮을까요?
-
미해결풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
호환성 관련 태그
- 강의 영상에 대한 질문이 있으시면, 상세히 문의를 작성해주시면, 주말/휴일 제외, 2~3일 내에 답변드립니다 (이외의 문의는 평생 강의이므로 양해를 부탁드립니다.)- 강의 답변이 도움이 안되셨다면, dream@fun-coding.org 로 메일 주시면 재검토하겠습니다. - 괜찮으시면 질문전에 챗GPT 와 구글 검색을 꼭 활용해보세요~- 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요. <meta http-equiv="X-UA-Compatible" content="ie-edge">인터넷 익스플로러가 사라진 지금도 쓰이나요?
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
톰캣 Connection refused 에러 발생하는 분들
Section 8: 실습 환경을 위한 필수 SW여기 먼저 하고 하시면 잘 될겁니다.
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
톰캣 Connection refused 에러 발생하는 분들
Section 8: 실습 환경을 위한 필수 SW여기 먼저 하고 하시면 잘 될겁니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
eslint와 prettier
eslint를 설치하면 이전과 달리 esling.config.mjs로 파일이 설정되며 extend나 rules의 활용이 기존과 다른 방식으로 진행되며 충돌이 일어납니다. stackoverflow나 chatGPT의 도움을 받아 동작은 되지만, 이 부분 다시 설명해주셔야 하는게 아닌지요. (기존에 설명된 부분들도 코드나 적용방식이 달라져서, 플러그인을 활용하도록 합니다)이 부분을 스스로 혼자 찾아서 수정할 수 있는 역량이 있다면 이 강의를 듣지 않겠지요. 하루 종일 한단원도 나가지 못하고 .. 해결하려다 포기하게 되네요. 2년전에 산 강의를 시간이 없어 이제 듣는 제 문제도 있겠지만.. 이 부분 상세한 설명을 넣어주셔야 할것 같아요.