게시글
질문&답변
private 인데 static 을 붙인이유
안녕하세요. 비공식 서포터즈 임형준입니다.NetworkMessage가 클래스라고 생각이 들어 조금 헷갈리실 수 있었을 거 같습니다. 이걸 메서드라고 생각해볼까요?보통 메서드를 작성할 때, 인스턴스 변수를 사용할 때 static으로 선언하지 않고, 반대로 인스턴스 변수를 사용하지 않을 때 static으로 선언합니다. 즉, 상태를 가지고 있지 않기 때문에 모든 객체들이 똑같이 행동할 수 있어 static으로 효율을 높입니다. 마찬가지로 이 Network 클래스에서의 인스턴스 변수가 없고, NetworkMessage에서 사용하지도 않기 때문에 static으로 선언했다고 볼 수 있습니다.
- 0
- 2
- 239
질문&답변
클래스 접근제어자
안녕하세요. 비공식 서포터 임형준입니다.hxhxhx님께서 말씀하신 클래스 접근제어자는 public, default가 맞습니다. package레벨에서 한 번 생각해볼까요? 그러면 두가지의 경우만 필요하다는 것을 알 수 있어요. (package 안에서만 쓸 수 있는 경우, package안팎에서 쓸 수 있는 경우) 이에 따라 default, public으로 나눈겁니다.그렇다면 이 nested class라는 것을 class(정확히는 top-level class)안에 마치 변수처럼 사용을 할 때는 구분을 어떻게 할 수 있을까요? 모든 범위, 같은 package 안, 같은 class 안 이렇게 3가지 경우로 나눌 수 있습니다. 이에 따라 모든 범위 -> public같은 package -> default같은 class -> private 로 나눌 수 있게 됩니다.접근 제어자가 어떤 역할을 하는건지에 따라 나뉘어진다는게 키포인트인 거 같습니다.
- 0
- 2
- 77
질문&답변
섹션 5 - 3(타입 안전 열거형 패턴) if 문대신 개선된 switch 문으로 변경
안녕하세요. 비공식 서포터즈 임형준입니다. 당나귀님처럼 코드변경해보는거 저도 좋아합니다. 아마 Constant expression required 과 같은 컴파일 에러가 발견되었겠죠? 이렇게 뚜렷하게 키워드들이 나오면 저는 공식문서나 스펙으로 한 번 확인해봐요. (멋있잖아요. ㅎㅎ)https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-SwitchLabel들어가보면 바로 다음 문구를 확인하실 수 있습니다.> Every case constant must be either a constant expression (§15.29), or the name of an enum constant (§8.9.1), otherwise a compile-time error occurs.발번역 해본다면, '모든 case constant 는 constant expression 이거나 enum 상수의 이름이어야 하고 다른 것들은 컴파일 에러가 발생한다.' 라고 합니다. 정리해본다면, case문 안에 상수는 1. constant expression: 보통 final static 으로 선언된 상수를 말합니다.2. enum 객체 자체(아마 Java 17부터 가능)이 두가지 경우가 선언될 수 있습니다. 하지만, ClassGrade.BASIC 과 같은 경우는 final static으로 선언된 상수(primitive type 혹은 String)가 아니라 객체이기 때문에 허용이 안됩니다.
- 0
- 2
- 341
질문&답변
오버라이딩 논리를 다시 설명해주세요.
이 상황은 Parent를 상속받은 Child라는 객체를 생성하여, 현재 Parent,Child 두 객체가 생성된 상황이며, poly를 부모 변수로 선언하였습니다. 부모는 자식에 대해 알 수 없다라는 논리에 따라 Child라는 객체가 있어도 부모 Parent는 Child에 선언된 메서드와 필드를 모른다는 것이 영한님의 설명인 것 같습니다.이 부분 먼저 조금 수정해봐도 괜찮을까요?Parent poly = new Child();1. new 연산자에 의해 Child 인스턴스가 딱 하나가 힙에 생성(힙 메모리에 적재)됩니다. 이 Child 인스턴스는 Parent를 상속받았으므로 Parent, Child클래스의 구조를 포함하고 있지요.2. Parent 타입의 참조 변수 poly가 main stack frame에 생성(메모리에 적재)되고 이 인스턴스에 할당됩니다.poly.value변수는 김도협님의 질문 의도와 같이 Parent 타입을 기준으로 동작합니다.poly.method()메서드는 Java에서 오버라이딩 된 메서드에 우선권을 부여합니다. 이를 좀 더 구체적으로 말씀드리면 Java에서는 런타임에 객체의 실제 타입(여기서는 new Child()로 인한 Child타입)을 기준으로 동작합니다. 그렇다면 Java 에서 왜 이렇게 만들었을까요? 이럴 때 저는 자주 사용하는 방법이 반대로 생각하기입니다. 만약, poly.method() 가 변수와 똑같이 적용된다고 해보겠습니다.```javaParent poly = new Parent();poly.method(); // "Parent method" Parent poly = new Child();poly.method(); // "Parent method"```이렇게 된다면 결국 다형성을 사용하지 못하게 됩니다. 이 단원의 맨처음을 생각해보면 이렇게 하는 이유는 다 다형성을 활용하게 하기 위해서 였습니다. 저렇게 메서드를 오버라이딩 된 메서드에 우선권을 강제로 부여해서 말이죠.참고) 이렇게 객체의 실제 타입으로 메서드를 호출시키는 것을 컴퓨터 과학에서는 Dynamic dispatch 라고 합니다.하지만, 초반에 이런 이론에 너무 빠지는 거보다 Java에서 그냥 이렇게 해주는구나. 라고 받아들이고 코딩을 왕창하시는게 훨씬 훨씬 빠르게 성장하실겁니다. 열공하세요.
- 0
- 2
- 206
질문&답변
다운캐스팅에 대한 질
따라서 다운캐스팅을 해도 자식클래스 메서드를 호출하지 못한다 -> 라고 생각하면 되는 건가요? 에 대한 답변:애초에 new Parent로 생성된 인스턴스에는 Child 클래스에 대한 정보가 없으므로 다운 캐스팅을 할 수 없습니다.그렇지만 다시 생각해보면 메서드는 메서드 영역 내에서 가져다가 호출하는 방식인데, 그렇게 된다면 자식 클래스의 메서드 또한 메서드 영역내에서 불러오면 되니까 호출이 가능한 게 아닐까요..? 에 대한 답변:위에서 다운 캐스팅이 성립이 안되기 때문에 런타임 에러(ClassCastException)가 발생되어 메서드 호출하기 전에 프로그램이 종료됩니다.제공해주신 콘솔을 확인해보면 마지막에 at poly.basic.CastingMain1.main(CastingMain1.java:7)이라고 나와있습니다. 7번 라인에서 예외가 발생한 것임을 알 수 있습니다. (다음에 코드 스크린샷을 제공할 때, 라인 수도 같이 찍어주시면 더 좋을거에요!) 아마 child.childMethod()를 지우시고 실행하셔도 똑같은 에러가 발생할겁니다.
- 0
- 3
- 376
질문&답변
HTTP API 설계 예시 - 컨트롤러, 컨트롤 URI 부분 동사를 직접 사용에 대한 질문입니다.
어익후. 갑자기 깨달았습니다.GET, POST만 지원되는 경우에 삭제하라같은 명령을 내릴 수 없으니까 그럴때는 동사처리하는 거군요. 신중하지 못했던 질문에 대해서 반성합니다.
- 0
- 2
- 125
질문&답변
view 분리에 대해 질문이 있습니다!
MemberFormControllerV1을 예로 들어보겠습니다.process(..)는 다음과 같이 두가지 부분으로 나뉘어 질 수 있습니다.(사진)왜 그럴까요? 위의 빨간 상자는 계속 변할 수 있기 때문입니다. 반면 아래 상자는 변함이 없는 로직입니다. 따라서, 이 두 박스를 분리해줍니다.(사진)다른 Controller들을 비교해보면 이 process의 2줄 로직이 모두 동일하다는 걸 알 수 있습니다. 그렇다면 이걸 그냥 효율적으로 MyView라는 객체를 만들어서 한군데에서 처리해주겠다는 걸 적용하려고 하니까 고쳐야할 점이 보입니다.이 getRequestDispatcher(..)가 viewPath를 사용한다는 점입니다. 따라서, 이 viewPath를 MyView에 넘겨줘야합니다. 어떤 값을 넘겨줄려고 할 때 스프링 기본편에서 배웠던 Dependency Injcection 을 사용하면 MyView생성자가 viewPath를 외부에서 주입받는 방향으로 코딩을 하게 됩니다. 결국, MyView는 viewPath의 구체적인 값을 몰라도 되게 됩니다.그렇다면 질문주신 "String 타입의 파라미터를 받는 메서드로 만들면 안 되나요?" 에 대한 답변은 만들 수는 있다입니다. 하지만 파라미터의 갯수를 늘리는 방식으로 리팩터링을 하면 단점이 있습니다. 해당 메서드를 호출하는 쪽에서도 알맞는 값을 넣어줘야 한다는 단점이 있습니다.반복되는 행위를 하나의 클래스를 만들어서 그 클래스가 반복되는 행위를 하게끔 하는 것이 객체지향적으로도 효율면에서도 더 좋기 때문에 객체로 따로 뺀것입니다.
- 0
- 2
- 151
질문&답변
static Factory method로 빈 생성
질문에 오류가 있어 다시 질문드립니다.헷갈리게 해서 죄송합니다. https://www.inflearn.com/questions/1280576/static-factory-method%EB%A1%9C-%EB%B9%88-%EC%83%9D%EC%84%B1
- 0
- 2
- 179