묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결30분안에 끝내는 객체지향의 본질
다형성 개념 문의
안녕하세요, 요즘 이직 준비하면서 CS 인사이드나 좀 얻고자 해당 강의를 무료로 수강 중인데요. 우선 영상 만드시는데 수고하신 것 같습니다만 이해가 안되는 부분들(다형성)이 있어서 문의드립니다. 2강 '객체지향은 어떻게 동작하는가?' 6:08 해당 주제명과 코드는 추상화 라고 해야 적합할 듯한데요. OCP는 추상화에 관련 있기도 하고요 6:26 다형성의 핵심은 부모타입으로 다루는 것(구현이 아닌 추상에 의존한다) 이 말씀이 무슨 말씀인지 이해가 잘 안되는데, 공부하셨던 자료 출처가 있을까요? 결론적으로 문의를 요약하면 다형성 개념을 오버로딩/오버라이딩 개념보단 추상화 개념으로 보는 것 같은 데 다형성과 추상화과 어떤 관련이 있는 지 궁금하며 공부하신 자료 출처를 남겨 놔주시면 다른 이들도 함께 공부하는 기회가 될 것 같습니다 :))
-
미해결기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
compareTo를 사용하는 이유가 뭔가요?
String은 equals 함수를 기본적으로 제공하는데 compareTo를 이용하는 이유가 궁금합니다. 강의에서 말씀하신 동등성을 표현하려면 equals를 사용하는게 오히려 맞는거 아닐까요??
-
해결됨프론트엔드 마스터클래스
불변성을 지키며 수정 삭제를 할때도 Map이 유리한가요?
안녕하세요 31. 히든클래스와 성능저하모드 강의를 듣고 질문남깁니다.해당 강의를 react에 적용해보고 있습니다.기존에는 useState를 사용해서 상태관리를할때 object와 Map은 수정 삭제시 대부분의 경우 불변성을 지키며 setState를 하고 있었습니다.매번 Map과 object를 재생성할때 Map이 좀더 메모리를 많이 차지한다고 들어서 비번한 수정/삭제가 일어날때는 Map대신 object를 사용해서 상태관리를 하고 있었는데 Map 강의듣고나니 일반적인 수정삭제일때는 Map이 좋은걸로 이해했는데 불변성을 지켜야할 때는 기존에 제가 가지고 있던 생각이 맞는지 의문이 생겼습니다. 불변성을 반드시 지켜야하는건 아니지만 그래도 지켜야 하다 가정하고 수정삭제가 1초에 1번정도 난다고 해도 Map이 유리한가요?
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
RequestHandler 버전 간 process() 파라미터 차이 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 자료의 버전 별 파라미터 차이에 관해 질문드립니다.HttpRequestHandlerV2는 process()에 Socket 파라미터를 받지 않고 멤버 변수를 쓰는데, HttpServerV1과 V3부터 최종 버전까지는 process()에 Socket을 받는 것으로 강의 자료에 나와 있습니다. 어떤 스타일을 따르는 게 맞을까요?
-
해결됨오브젝트 - 기초편
자료 한번에 다운로드 받을 수 있게 좀 해주세요.
자료 한번에 다운로드 받을 수 있도록 압축해서 하나로 묶어주세요. 일일이 다운받는게 번거롭네요.
-
미해결김영한의 실전 자바 - 중급 1편
강의노트 내용이 이해가 되지 않아서 문의드립니다.
[질문 내용]여기에 질문 내용을 남겨주세요.b의 주소값을 서울에서 부산으로 변경할 의도라는게 이해가 되지 않습니다. b의 주소값은 Address 인스턴스를 가르키고 있는데 음..b의 주소에 저장되어 있는 값을 부산으로 변경하려는 의미인건지 궁금합니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
피라미드 문제 풀이
피라미드 문제 풀이를 참고의 print() 때문에 뭔가 이중반복문일것 같은데 도저히 생각이 안나서 String을 활용해서 풀었는데요, 어느 코드가 더 좋은 코드인지 코드 짤 때 판단이 어렵습니다 ㅠㅠ package loop.ex; public class LoopEx5 { public static void main(String[] args) { int rows = 50; int i = 1; String star = "*"; while (i <= rows) { System.out.println(star); star = star + "*"; i++; } } }
-
미해결프론트엔드 마스터클래스
30강 Map 자막이 이상합니다.
4:16초 부터만 스크립트가 나옵니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
ScannerWhile3 예제 코드 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ScannerWhile3 예제 코드 문의안녕하세요. 출력 결과는 똑같이 나오는데 강사님이 작성한 코드랑 제가 작성한 코드가 좀 다르더라구요.. 모든 정수의 합을 출력하는 부분의 코드가 서로 위치가 다른데 이 경우 제가 작성한 코드는 틀렸다고 볼 수 있을까요?[강사님의 코드] [제가 작성한 코드]
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
짝수 출력 문제 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]짝수 출력 문제안녕하세요. 답은 동일하게 나오는데 저는 아래와 같이 풀어봤습니다.. 이렇게 풀면 정답이 안되는 건지 문의 드립니다.[WhileEx2.java][ForEx2.java]
-
해결됨오브젝트 - 설계 원칙편
tryMove(..) 메서드 ArrayIndexOutOfBoundsException 제보
안녕하세요3-2. 조합 메서드로 리팩터링하기 의 11분 08초에 예제 코드 보면서 리팩터링을 해보고 있는데 예외가 발생했습니다. java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6 moveNorth() 실행시 y가 -1이 입력되는데else 부분에 y를 한번 더 더해주다보니 문제가 발생한것으로 보입니다. private void moveNorth() { tryMove(0, -1); } // before private void tryMove(int incX, int incY) { if(y + incY < 0 || y + incY >= height || x + incX >= width || x + incX < 0 || roomAt(x + incX, y + incY) == null) { showBlocked(); } else { this.x += incX; this.y += y + incY; // 💩 y = -1일때 -1 + (-1)이 됨 showRoom(); } } // after private void tryMove(int incX, int incY) { if(y + incY < 0 || y + incY >= height || x + incX >= width || x + incX < 0 || roomAt(x + incX, y + incY) == null) { showBlocked(); } else { this.x += incX; this.y += incY; // ✅ showRoom(); } }
-
미해결기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
[실습] MyString에 복사 생성자 추가
import java.lang.reflect.Field; class MyString { private byte[] sdata = null; MyString(MyString s) { this.sdata = s.sdata; } // 생성자 1: 문자열을 받을 때 MyString(String param) { this.setString(param); } // 생성자 2: 정수를 받을 때 MyString(int param) { setString(String.format("%d", param)); } // 데이터를 문자열로 반환 (null 체크 포함) public String getString() { if (sdata == null || sdata.length <= 0) { return "(null)"; } return new String(sdata); } // 데이터를 안전하게 복사해서 저장 (Deep Copy) public void setString(String param) { sdata = param.getBytes(); } } public class Main { public static void main(String[] args) throws Exception { MyString src = new MyString("Hello"); MyString dst = new MyString(src); Field field = MyString.class.getDeclaredField("sdata"); field.setAccessible(true); byte[] srcSdata = (byte[]) field.get(src); byte[] dstSdata = (byte[]) field.get(dst); System.out.println("src.sdata 주소: " + System.identityHashCode(srcSdata)); System.out.println("dst.sdata 주소: " + System.identityHashCode(dstSdata)); // 둘이 같은 숫자 → 같은 배열 가리킴 (얕은 복사 증명!) src.setString("world"); byte[] srcSdata2 = (byte[]) field.get(src); byte[] dstSdata2 = (byte[]) field.get(dst); System.out.println("--- setString 후 ---"); System.out.println("src.sdata 주소: " + System.identityHashCode(srcSdata2)); System.out.println("dst.sdata 주소: " + System.identityHashCode(dstSdata2)); // src는 새 주소, dst는 그대로 → 분리됨 확인! } }원래 의도가 얕은 복사를 먼저 해봄으로서 사이드 이팩트 문제를 일으킨 다음, 깊은 복사를 시도해볼려고 했는데 위 코드를 실행해보시면 깊은 복사가 되는 것 처럼보이더군요.그런데 알고보니, 의도대로 dst.sdata 배열의 주소값이 src.sdata 배열의 주소값으로 얕은 복사가 이뤄졌으며, getBytes() 함수 자체가 원래 String 객체의 데이터를 byte 배열로 새로 만들어서 해당 배열에 대한 주소값을 반환하는 함수다 보니, src.sdata 변수의 대상 인스턴스 주소 값이 새로운 바이트 배열에대한 주소값으로 바뀌어 버렸고, 기존 배열은 원래 gc에 의해 사라져야하는게 맞는데, dst.sdata에 src.sdata 배열의 주소값이 얕은 복사가 이뤄졌다보니, 기존 참조된 배열은 계속 참조되어 메모리 상에 남아있더라구요.그렇다보니, src.sdata가 참조한 실질 배열 데이터는 dst.sdata에 얕은 복사해버리고, src.sdata 배열 본인은 새로운 배열 데이터로 갈아타다보니, 실질적으로는 src 객체의 문자열을 바뀌었다기 보단, 참조한 대상 자체가 바뀌다 보닌까 실질적으로는 처음 의도한 얕은 복사로 인한 사이트 이팩트 문제는 애초부터 발생하지 않는다 라는게 결론입니다.따라서 주어진 실습 예제가 적절한지에 대해 한 번 고민해보았습니다.혹시라도 제가 부족하거나 다르게 이해한 부분이 있을 시 지적해주시면 감사하겠습니다.
-
미해결김영한의 실전 자바 - 중급 2편
제네릭 타입 매개변수 제한과 관련한 문의입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]영한님, 안녕하세요.강의를 들으며 부족하다고 느껴졌던 기본기를 덕분에 잘 습득하고 있습니다!타입 매개변수 제한 강의를 듣고 나서 궁금한 점이 생겨 Q&A를 남기게 되었습니다.제네릭을 도입하고 타입 매개변수를 제한함으로써,1. 코드의 재사용성 증가2. 타입 안정성 보장위 두 가지의 강력한 장점을 가진다는 부분을 잘 이해했습니다.다만, 클라이언트 코드에서 인스턴스를 생성하는 과정에 타입 매개변수를 아래와 같이 Animal로 지정하게 된다면 개발자의 실수가 발생할 수 있는 부분이 있다고 생각합니다.AnimalHospitalV3<Animal> animalHospital = new AnimalHospitalV3<>(); animalHospital.set(new Dog("dog", 100)); Dog biggerAnimal = (Dog) animalHospital.bigger(new Cat("cat", 100));위와 같은 코드는 다형성만을 사용하여 개션한 코드와 같이 Java 컴파일러가 잡아주지 못하고, 런타임 시점에 오류가 발생하게 됩니다. (Animal 클래스를 추상 클래스, interface로 선언해도 타입 인자로 지정하는 것을 막지 못합니다.)이런 상황일 때, 개발자의 실수를 최대한 방지할 수 있는 방법이 어떤 것이 있을지 궁금합니다.항상 좋은 강의 만들어주셔서 감사합니다.덕분에 잘 배우며 기본기를 다져가고 있습니다!
-
미해결김영한의 실전 자바 - 중급 2편
강의가 좀 버겁다 느껴질 때 학습방법 문의
기본기 부족한 n년차 개발자 입니다.입문, 기본, 중급1까지 완강했고, 현재 중급2 수강중입니다. (최종목표는 자바, 스프링, 데이터베이스 대부분의 강의를 로드맵 따라 익혀가는 것입니다.)컬렉션 프레임워크(ArrayList) 부분부터 좀 버거운 느낌이 있는데, 강의를 어설프게 이해하며 따라가고 있는 것 같아 문의드립니다. (사실 잘 이해 못하고 있는 걸지도...) 우선 강의 듣는 자세는 다음과 같습니다.하나하나 따라치며 강의를 듣기에는 오래 걸리고 하다가 지쳐서 중도포기 할 것 같아 강의를 쭉 돌려본다는 생각으로 학습하고 있습니다. (1배속) IDE에서 소스코드 열고 강의 들으면서 중간중간 눈으로 이해하며 넘어가고 있음 (부분적으로만 아조 조금씩 따라 치고 있음) 강의자료 설명 부분은 어느정도 이해가 가는데 코드 작성 부분에서는 조금 버겁게 느껴짐즉, 과연 내가 이 코드들을 작성할 수 있을까, 다음 강의들을 잘 따라갈 수 있을까 걱정되는 부분이 있음 어떻게 해야 잘 습득해갈 수 있을까요?강의는 더할 나위 없이 만족하고 있습니다
-
미해결얄코의 떠먹여주는 객체지향 디자인 패턴
강의 순서에 대한 궁금증
안녕하세요 얄코님객체지향 프로그래밍 섹션 수강 후 디자인 패턴 섹션을 수강하려 하는데 notion의 샘플 코드를 보면Creational PatternsStructural PatternsBehavioral Patterns으로 분류하여 나열해놓으셨는데, 강의 순서는 위의 분류와 상관없이 나열되어 있더라구요.강의 순서에 의도가 있을까요?별다른 의도가 없는 경우 위에서 분류된 패턴별로 강의를 들어볼까 하여 질문드립니다.
-
미해결유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
3d프로젝트에 적용해도 무방한가요?ㅁ
학습 관련 질문을 남겨주세요.먼저 유사한 질문이 있는지 검색 부탁 드립니다.질문 내용이 상세할수록 명확한 답변을 드릴 수 있습니다.추후 3d프로젝트 제작 예전인데,3d프로젝트에 적용해도 무방한가요?
-
해결됨초심자를 위한 친절한 Java 한바퀴
다음을 위한 준비 알려주세요~
강의 잘 보았습니다!다음단계를 위해 다음 강의가 언제쯤 오픈예정이실지 궁금합니다.그리고 자바 -> 스프링 으로 가기위해서 준비해야하는 조언과 만약 다른강의를 추천해주실 수 있다면 어떤게 좋을지 알려주시면 감사하겠습니다~
-
미해결스프링 핵심 원리 - 기본편
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]서비스는 복잡한 규칙(비즈니스 로직)을 계산하고 판단 한다고 생각되는데 왜 이건 역할과 구현체를 나눌까요?지금까지 설명으로 봤을때 다형성의 의미는 사실 저장소에 국한되서 설명이되고 있는것 같아서요.저장소 자체는 외부랑 소통하는 통로로써 db일지 다른 외부 시스템 연동일지에 따라 어떤 구현체를 사용할지 모르니 사용한다고 쳐도 서비스 비즈니스 계층에서는 로직을 변경하는거지 어떤 다른 구현체가 있지는 않아서 굳이 분리하는 이유가 궁금합니다.
-
미해결김영한의 실전 자바 - 기본편
매서드 참조값 반환??
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.'클래스 도입'이라는 강의 16:25 쯤 강사님이"마치 method을 호출하고 반환한 것처럼 끝나고 나면 참조값을 딱 반환합니다. " 라고 하셨는데 매서드를 호출하고 반환할 때 원래 위치로 돌아가는 것이 참조값을 반환해서 라고 이해하면 될까요? 무슨 말인지 잘 이해가 안 됩니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
운영체제 관점의 실제 모니터 명세는 조건변수를 추가할 수 있습니다.synchronized는 자바가 구현한 모니터인데 조건변수의 추가가 불가능해서 생산자 소비자 문제를 해결할 수 없습니다.ReentrantLock은 자체적으로 구현한 락을 사용하지만 그 락의 구현은 실제 조건변수를 추가할 수 있는 모니터의 명세를 따르고 있어 모니터를 구현했다고 할 수 있습니다.모니터는 CAS를 내부적으로 사용합니다. CAS를 반복문으로 돌리며 바쁜대기를 하거나 Park로 락을 획득하고 반환합니다.원자적 연산도 CAS를 구현하지만 단순 속도가 synchronized와 ReentrantLock보다 더 빠른 이유는 락의 존재 유무입니다. 혹시 제가 이해한 내용들이 맞을까요?? 현재 81강까지 들었습니다!