개발환경 - IndelliJ IDEA / JDK 17
private string name;
으로 속성을 정의했을 때,
Cannot resolve symbol 'string' 이라는 에러가 났다.
double 은 소문자로 명명해도 되는데, 왜 string 은 대문자로 해야하지? 싶어서 확인해본 결과 이유는 아래와 같다.
에러를 해결한 코드를 함께 첨부했다.
리팩토링을 하다가 궁금한 점이 있었다.
이미 생성자에서 this.items = new ArrayList<>();
으로 리스트 복사본을 return 하는거 아닌가?
왜 getItems
에서 복사본을 또 만들어서 캡슐화를 강화해야 하나?
이는 두 복사본이 다른 목적을 가지고 있다고 한다.
Menu
객체가 생성될 때 items
필드를 초기화하는 것items
에 할당함items
리스트에 직접 접근하여 수정하는 것을 방지하기 위한 것만약 return items;
로 직접 반환한다면, 외부에서 이 리스트를 수정할 수 있게 되어 Menu 클래스의 내부 상태가 예기치 않게 변경될 수 있다.
! 생성자의 new ArrayList
는 복사본을 만드는 것이 아니었다..
! 그저 새로운 ArrayList
객체를 초기화하는 용도였다...
(객체를 처음 만들 때 사용되는 방식)
new ArrayList<>()
는 비어있는 새로운 ArrayList 객체를 생성new ArrayList<>(20)
= 초기 용량 20 인 ArrayListnew ArrayList<>(Collection c)
와 같이 다른 컬렉션의 요소들로 초기화된 ArrayList 생성 가능elementData
라는 Object 배열을 할당받아 요소들을 저장함처음에는 Stream<Integer>
을 활용해서 구현했다가, 리팩토링을 하던 와중 의아한 점이 있었다.
왜 굳이 IntStream
을 사용해야 하지?
Stream<Integer>
보다 효율적인 이유(예: sum(), average(), range())
를 제공 IntStream.range()
또는 rangeClosed()
메서드를 사용하여 쉽게 연속된 정수 범위 생성 가능IntStream
도 paralle()
메서드를 통해 쉽게 병렬 처리 가능range() = 종료값 미포함
/ rangeClosed() = 종료값 포함
System.out.printf("%d. %-14s | W %.1f | %s%n",
i + 1,
item.getName(),
item.getPrice(),
item.getDescription());
println 만 쓰다가 printf 를 처음 쓰게 됐다.
정확한 정의와 어떤 상황에서 쓰는지 조금 더 조사하게 됐다.
System.out.prinft()
는 특정 서식(format) 에 따라 데이터를 출력할 수 있도록 설계됨System.out.printf("출력 서식", 출력할 내용);
%d(정수), %f(실수), %s(문자열)
등의 형식 지정자를 사용하여 다양한 데이터 타입을 한 번에 출력 가능enum 상수를 선언했다.
그런데 Expected no arguments but found 1 에러가 났다.
해당 에러가 나는 이유는 아래와 같다.
enum 상수에 인자를 전달하고 있지만, 해당 인자를 받아들일 생성자가 정의되어 있지 않기 때문이다.
enum 인자를 전달하려면 다음과 같은 작업이 필요하다.
사실 잘 이해가 되지 않았다.
상수로 이미 속성을 선언하고 있는 것 아닌가?
왜 한 번 더 필드 선언을 해주어야 하는걸까?
이것은...
discountRate
라는 필드가 필요한 이유이렇게 생각하니까 그나마 조금 이해가 되는 것 같다...
그래서 상수 선언 + 필드 정의 까지 했는데도 에러가 났다.
Variable 'discountRate' might not have been initialized
이 에러가 발생하는 이유는,
enum 상수에 대한 생성자가 정의되어 있지 않기 때문이라고 한다.
enum 에서 상수를 선언할 때 괄호 안에 값을 넣으면,
그 값을 받아 초기화할 수 있는 생성자가 필요한데 생성자가 없기 때문에 나는 에러라고 볼 수 있었다.
생성자를 추가함으로써:
discountRate
필드 초기화 가능enum 생성자는 기본적으로 private 하며,
명시적으로 선언하지 않아도 된다.
enum 은 고정된 상수 집합을 나타내기 위한 특별한 형태의 클래스이다.
외부에서 새로운 인스턴스를 생성하는 것을 방지하기 위해 생성자를 private 로 제한해야 한다고 한다.
또한 컴파일러가 public 생성자를 허용하지 않는다.
enum 의 생성자를 public 으로 선언하려고 하면 컴파일 오류가 발생한다.
toString
을 재정의하면 코드의 파편화 막을 수 있음패키지명을 자세하게
써 놓을수록 import 를 보고 클래스 활용이 가능해짐