묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 중급 2편
제네릭 코드에서 new 키워드를 사용할 수 없다면 불변 객체를 어떻게 활용할 수 있나요?
불변 객체는 내부 필드에 변경이 생길 경우 새로운 객체를 반환해줘야 한다고 배웠습니다.제네릭 타입은 타입 소거 문제 때문에 new 키워드를 사용할 수 없는데... 이 경우 제네릭과 불변 객체는 공존할 수 없는 건가요?아래 코드와 같이 실습을 해봤는데 주석 처리한 부분을 어떻게 해결해야 할지 잘 모르겠습니다 ㅠㅠ public class Box<T extends Animal> { private final T value; public Box(T value) { this.value = value; } public T get() { return value; } public Box<T> withName(String name) { //이 부분을 어떻게 처리해야할까요..? } }public class Animal { private final String name; private final int size; public Animal(String name, int size) { this.name = name; this.size = size; } public Animal withName(String name) { return new Animal(name, size); } public class Dog extends Animal { public Dog(String name, int size) { super(name, size); } @Override public Dog withName(String name) { return new Dog(name, getSize()); } }
-
미해결김영한의 실전 자바 - 중급 2편
타입 이레이저 동작방식 질문입니다!
안녕하세요! 이번에 정처기 문제에서 타입 이레이저 관련 문제가 나왔는데, 궁금한 점이 생겨서 질문 올려봅니다.class Printer { void print(Integer a) { System.out.print("A" + a); } void print(Object a) { System.out.print("B" + a); } void print(Number a) { System.out.print("C" + a); } } public class Gisafirst { public static void main(String[] args) { new Container<>(0).print(); } public static class Container<T> { T value; public Container(T t) { value = t; } public void print() { new Printer().print(value); } } }제가 이해한 바로는, 강의에서 설명해주신대로 new Container<>(0)에서 public static class Container<Integer> { Integer value; public Container(Integer t) { value = t; } public void print() { new Printer().print(value); } }컴파일러가 컴파일 시점에 이렇게 이해하고 나서 컴파일 종료 후, 타입 소거가 일어나서, Object로 변환한다고 이해했습니다.그래서 print 메서드를 호출할 때 value는 Object 타입이므로 B0가 출력되는 것이죠.여기서 궁금한 점은 바로 print의 오버로딩 메서드 선택 시점입니다. 제가 찾아본 바로는 오버로딩 메서드 선택시점은 컴파일 단계에서 이루어진다로 알고있습니다. 그렇다면 동작방식이 컴파일 종료 후 타입 소거가 일어나는게 아니라, 정확히는"컴파일 시작 - 타입 소거 - 오버로딩 메서드 선택 - 컴파일 종료 - 런타임" 이런식으로 일어나는건가용?아니면 어디서 오해하고 있는지 궁금합니다!
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
제네릭에서 질문입니다.
function add<T extends (a: string) => number>(x: T): T { return x }; add((a)=>+a)위 코드 add((a)=>+a) 에서 인자 a가 왜 string으로 인식되는지 , +a가 왜 숫자로 인식되는지 이해가 가지 않습니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
part1 람다식 강의에서 제네릭
안녕하세요. part1 람다식 강의 16:18 에서 50번째 줄에 있는 new Myfunc<Item, bool>을 지우셨는데 궁금증이 생겨 질문드립니다. 14:40 에서 50번째 줄에 있는 것처럼 제네릭이 없는 델리게이트를 사용할 때는 ItemSelector selector = new ItemSelector ((Item Item) => { return item.ItemType == ItemType.Weapon}); new키워드를 쓰셨는데 16:18에서 제네릭을 사용하시고부터는 없어도 똑같이 동작한다고 말씀하셨습니다. 즉 코드상으로 MyFunc<Item, bool> selector = new MyFunc<Item, bool>((Item Item) => { return item.ItemType == ItemType.Weapon}); 에서 MyFunc<Item, bool> selector = (Item Item) => { return item.ItemType == ItemType.Weapon}; 로 고치셨습니다. new Myfunc<Item, bool>를 지우셨는데 제네릭을 사용할 때는 new를 써도 되고 안써도 되고라고 이해해도 될까요?
-
미해결타입스크립트 입문 - 기초부터 실전까지
Map의 제네릭에 일반 인터페이스를 할당할 수 있나요?
interface ITest { id: number; name: string; isRole: boolean; } const userMap = new Map<ITest>(); 선생님 안녕하세요! 타입스크립트 공부중에 데이터자료형에도 사용해보고싶은데 위처럼 interface로 선언한것을 Map에 할당하고싶으면 어떻게 하면 좋을까요..?
-
미해결타입스크립트 입문 - 기초부터 실전까지
제네릭 타입 제한 강의에서 질문드립니다.
안녕하세요, 제네릭 강의 부분에 '정의된 타입으로 타입을 제한하기' 강의에서 여쭤보고 싶은게 생겨 질문 드립니다. logTextLength(10); 에서 에러가 출력되는 이유가 궁금합니다. 수업과 핸드북 내용(https://joshua1988.github.io/ts/guide/generics.html#%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4)을 참조했을 때, 에러가 발생하는 이유는 logTextLength함수의 전달인자인 10인 숫자 타입에는 length 속성이 없기 때문이라고 하셨는데요, 그런데 수업 중 'T extends LengthType'으로 T 타입은 LengthType 내에 있는 모든 속성들을 갖고 있게 된다고 하셔서, logTextLength(10) 의 10이라는 숫자 타입에도 LengthType의 속성인 length를 갖게 된다고 생각했었습니다. 그런데 logTextLength(10) 이 에러를 출력하는 이유로, 10에 length 속성이 없기 때문이라고 하신 부분이 이해가 잘 안가 문의드립니다.